diff --git a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm index 5d5f4e5831a..5e6dcb95cbf 100644 --- a/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm +++ b/code/ATMOSPHERICS/components/binary_devices/algae_generator_vr.dm @@ -46,7 +46,7 @@ overlays += I /obj/machinery/atmospherics/binary/algae_farm/Destroy() - ..() + . = ..() internal = null /obj/machinery/atmospherics/binary/algae_farm/process() @@ -101,7 +101,7 @@ if(inoperable() || !anchored) icon_state = "algae-off" else if(recent_moles_transferred >= moles_per_tick) - icon_state = "aglae-full" + icon_state = "algae-full" else if(recent_moles_transferred > 0) icon_state = "algae-full" else diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 2ccfe0f2e87..ea604bc996a 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -42,7 +42,7 @@ obj/machinery/atmospherics/binary return null Destroy() - loc = null + . = ..() if(node1) node1.disconnect(src) @@ -54,8 +54,6 @@ obj/machinery/atmospherics/binary node1 = null node2 = null - ..() - initialize() if(node1 && node2) return diff --git a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm index 5768def1ec1..d0417e14dd2 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm @@ -36,7 +36,7 @@ initialize_directions = NORTH|SOUTH Destroy() - loc = null + . = ..() if(node1) node1.disconnect(src) @@ -48,8 +48,6 @@ node1 = null node2 = null - ..() - process() ..() if(anchored && !(stat&BROKEN)) diff --git a/code/ATMOSPHERICS/components/omni_devices/filter.dm b/code/ATMOSPHERICS/components/omni_devices/filter.dm index b2966ef4314..feb1b5cb93c 100644 --- a/code/ATMOSPHERICS/components/omni_devices/filter.dm +++ b/code/ATMOSPHERICS/components/omni_devices/filter.dm @@ -28,7 +28,7 @@ input = null output = null filters.Cut() - ..() + return ..() /obj/machinery/atmospherics/omni/filter/sort_ports() for(var/datum/omni_port/P in ports) diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 4f6473fccf3..9668f7a5a3e 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -61,7 +61,7 @@ return null /obj/machinery/atmospherics/portables_connector/Destroy() - loc = null + . = ..() if(connected_device) connected_device.disconnect() @@ -72,8 +72,6 @@ node = null - ..() - /obj/machinery/atmospherics/portables_connector/initialize() if(node) return diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index fa066d978f7..717540db69d 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -51,7 +51,7 @@ obj/machinery/atmospherics/trinary return null Destroy() - loc = null + . = ..() if(node1) node1.disconnect(src) @@ -67,8 +67,6 @@ obj/machinery/atmospherics/trinary node2 = null node3 = null - ..() - initialize() if(node1 && node2 && node3) return diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index f93970a93fd..a7deb70abaa 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -100,7 +100,7 @@ return null /obj/machinery/atmospherics/tvalve/Destroy() - loc = null + . = ..() if(node1) node1.disconnect(src) @@ -116,8 +116,6 @@ node2 = null node3 = null - ..() - /obj/machinery/atmospherics/tvalve/proc/go_to_side() if(state) return 0 diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm index 20d37b309c7..0372483c796 100644 --- a/code/ATMOSPHERICS/components/unary/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary/unary_base.dm @@ -31,7 +31,7 @@ return null Destroy() - loc = null + . = ..() if(node) node.disconnect(src) @@ -39,8 +39,6 @@ node = null - ..() - initialize() if(node) return diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 00bc7e57728..c6121dea31a 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -80,7 +80,10 @@ /obj/machinery/atmospherics/unary/vent_pump/Destroy() unregister_radio(src, frequency) - ..() + if(initial_loc) + initial_loc.air_vent_info -= id_tag + initial_loc.air_vent_names -= id_tag + return ..() /obj/machinery/atmospherics/unary/vent_pump/high_volume name = "Large Air Vent" @@ -414,13 +417,6 @@ new /obj/item/pipe(loc, make_from=src) qdel(src) -/obj/machinery/atmospherics/unary/vent_pump/Destroy() - if(initial_loc) - initial_loc.air_vent_info -= id_tag - initial_loc.air_vent_names -= id_tag - ..() - return - #undef DEFAULT_PRESSURE_DELTA #undef EXTERNAL_PRESSURE_BOUND diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 06d1bce4373..3fccbb50f33 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -44,8 +44,10 @@ /obj/machinery/atmospherics/unary/vent_scrubber/Destroy() unregister_radio(src, frequency) - ..() - + if(initial_loc) + initial_loc.air_scrub_info -= id_tag + initial_loc.air_scrub_names -= id_tag + return ..() /obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0) if(!check_icon_cache()) @@ -285,10 +287,3 @@ user << "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W" else user << "You are too far away to read the gauge." - -/obj/machinery/atmospherics/unary/vent_scrubber/Destroy() - if(initial_loc) - initial_loc.air_scrub_info -= id_tag - initial_loc.air_scrub_names -= id_tag - ..() - return diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 3cd77597b39..01e6e977bbc 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -72,7 +72,7 @@ return null /obj/machinery/atmospherics/valve/Destroy() - loc = null + . = ..() if(node1) node1.disconnect(src) @@ -84,8 +84,6 @@ node1 = null node2 = null - ..() - /obj/machinery/atmospherics/valve/proc/open() if(open) return 0 diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm index 7fe586733ca..84414613428 100644 --- a/code/ATMOSPHERICS/datum_pipe_network.dm +++ b/code/ATMOSPHERICS/datum_pipe_network.dm @@ -16,6 +16,15 @@ datum/pipe_network ..() + Destroy() + pipe_networks -= src + for(var/datum/pipeline/line_member in line_members) + line_member.network = null + for(var/obj/machinery/atmospherics/normal_member in normal_members) + normal_member.reassign_network(src, null) + gases.Cut() // Do not qdel the gases, we don't own them + return ..() + proc/process() //Equalize gases amongst pipe if called for if(update) diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 44c7cd25905..0115c85c3dd 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -10,14 +10,14 @@ datum/pipeline var/alert_pressure = 0 Destroy() - if(network) - qdel(network) + qdel_null(network) if(air && air.volume) temporarily_store_air() - qdel(air) + for(var/obj/machinery/atmospherics/pipe/P in members) + P.parent = null - ..() + . = ..() proc/process()//This use to be called called from the pipe networks diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 52193f96a2c..28440254bb7 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -63,11 +63,11 @@ return parent.return_network(reference) /obj/machinery/atmospherics/pipe/Destroy() - qdel(parent) + qdel_null(parent) if(air_temporary) loc.assume_air(air_temporary) - ..() + . = ..() /obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (istype(src, /obj/machinery/atmospherics/pipe/tank)) @@ -227,10 +227,12 @@ /obj/machinery/atmospherics/pipe/simple/Destroy() if(node1) node1.disconnect(src) + node1 = null if(node2) node2.disconnect(src) + node1 = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/simple/pipeline_expansion() return list(node1, node2) @@ -461,12 +463,15 @@ /obj/machinery/atmospherics/pipe/manifold/Destroy() if(node1) node1.disconnect(src) + node1 = null if(node2) node2.disconnect(src) + node2 = null if(node3) node3.disconnect(src) + node3 = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) @@ -705,14 +710,18 @@ /obj/machinery/atmospherics/pipe/manifold4w/Destroy() if(node1) node1.disconnect(src) + node1 = null if(node2) node2.disconnect(src) + node2 = null if(node3) node3.disconnect(src) + node3 = null if(node4) node4.disconnect(src) + node4 = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/manifold4w/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) @@ -967,8 +976,9 @@ /obj/machinery/atmospherics/pipe/cap/Destroy() if(node) node.disconnect(src) + node = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/cap/disconnect(obj/machinery/atmospherics/reference) if(reference == node) @@ -1060,7 +1070,7 @@ desc = "A large vessel containing pressurized gas." volume = 10000 //in liters, 1 meters by 1 meters by 2 meters ~tweaked it a little to simulate a pressure tank without needing to recode them yet - var/start_pressure = 25*ONE_ATMOSPHERE + var/start_pressure = 75*ONE_ATMOSPHERE //Vorestation edit level = 1 dir = SOUTH @@ -1081,8 +1091,9 @@ /obj/machinery/atmospherics/pipe/tank/Destroy() if(node1) node1.disconnect(src) + node1 = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/tank/pipeline_expansion() return list(node1) @@ -1251,8 +1262,9 @@ /obj/machinery/atmospherics/pipe/vent/Destroy() if(node1) node1.disconnect(src) + node1 = null - ..() + . = ..() /obj/machinery/atmospherics/pipe/vent/pipeline_expansion() return list(node1) diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm index acee6a8b65b..1f7ed8c04a1 100644 --- a/code/ZAS/Phoron.dm +++ b/code/ZAS/Phoron.dm @@ -117,6 +117,10 @@ obj/var/phoronproof = 0 if(burn_eyes && head && (head.body_parts_covered & EYES) && (head.item_flags & AIRTIGHT)) burn_eyes = 0 + //VOREStation Edit - NIF Support + if(nif && nif.flag_check(NIF_V_UVFILTER,NIF_FLAGS_VISION)) + burn_eyes = 0 + //If we still need to, burn their eyes if(burn_eyes) burn_eyes() diff --git a/code/ZAS/Turf.dm b/code/ZAS/Turf.dm index bb5eb5050eb..a309cd3a082 100644 --- a/code/ZAS/Turf.dm +++ b/code/ZAS/Turf.dm @@ -5,9 +5,9 @@ /turf/var/datum/gas_mixture/air /turf/simulated/proc/update_graphic(list/graphic_add = null, list/graphic_remove = null) - if(graphic_add && graphic_add.len) + if(LAZYLEN(graphic_add)) overlays += graphic_add - if(graphic_remove && graphic_remove.len) + if(LAZYLEN(graphic_remove)) overlays -= graphic_remove /turf/proc/update_air_properties() diff --git a/code/ZAS/Zone.dm b/code/ZAS/Zone.dm index da39b868d3a..18c5ab28999 100644 --- a/code/ZAS/Zone.dm +++ b/code/ZAS/Zone.dm @@ -77,7 +77,8 @@ Class Procs: fire_tiles.Add(T) air_master.active_fire_zones |= src if(fuel) fuel_objs += fuel - T.update_graphic(air.graphic) + if(air.graphic) + T.update_graphic(air.graphic) /zone/proc/remove(turf/simulated/T) #ifdef ZASDBG @@ -92,7 +93,8 @@ Class Procs: var/obj/effect/decal/cleanable/liquid_fuel/fuel = locate() in T fuel_objs -= fuel T.zone = null - T.update_graphic(graphic_remove = air.graphic) + if(air.graphic) + T.update_graphic(graphic_remove = air.graphic) if(contents.len) air.group_multiplier = contents.len else @@ -106,9 +108,11 @@ Class Procs: ASSERT(!into.invalid) #endif c_invalidate() + var/list/air_graphic = air.graphic // Cache for sanic speed for(var/turf/simulated/T in contents) into.add(T) - T.update_graphic(graphic_remove = air.graphic) + if(air_graphic) + T.update_graphic(graphic_remove = air_graphic) #ifdef ZASDBG T.dbg(merged) #endif @@ -131,8 +135,10 @@ Class Procs: /zone/proc/rebuild() if(invalid) return //Short circuit for explosions where rebuild is called many times over. c_invalidate() + var/list/air_graphic = air.graphic // Cache for sanic speed for(var/turf/simulated/T in contents) - T.update_graphic(graphic_remove = air.graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt + if(air_graphic) + T.update_graphic(graphic_remove = air_graphic) //we need to remove the overlays so they're not doubled when the zone is rebuilt //T.dbg(invalid_zone) T.needs_air_update = 0 //Reset the marker so that it will be added to the list. air_master.mark_for_update(T) diff --git a/code/__defines/MC.dm b/code/__defines/MC.dm new file mode 100644 index 00000000000..fb15a693bf2 --- /dev/null +++ b/code/__defines/MC.dm @@ -0,0 +1,69 @@ +#define MC_TICK_CHECK ( ( world.tick_usage > Master.current_ticklimit || src.state != SS_RUNNING ) ? pause() : 0 ) + +// Used for splitting up your remaining time into phases, if you want to evenly divide it. +#define MC_SPLIT_TICK_INIT(phase_count) var/original_tick_limit = Master.current_ticklimit; var/split_tick_phases = ##phase_count +#define MC_SPLIT_TICK \ + if(split_tick_phases > 1){\ + Master.current_ticklimit = ((original_tick_limit - world.tick_usage) / split_tick_phases) + world.tick_usage;\ + --split_tick_phases;\ + } else {\ + Master.current_ticklimit = original_tick_limit;\ + } + +// Used to smooth out costs to try and avoid oscillation. +#define MC_AVERAGE_FAST(average, current) (0.7 * (average) + 0.3 * (current)) +#define MC_AVERAGE(average, current) (0.8 * (average) + 0.2 * (current)) +#define MC_AVERAGE_SLOW(average, current) (0.9 * (average) + 0.1 * (current)) +#define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;} + +#define START_PROCESSING(Processor, Datum) if (!Datum.isprocessing) {Datum.isprocessing = 1;Processor.processing += Datum} +#define STOP_PROCESSING(Processor, Datum) Datum.isprocessing = 0;Processor.processing -= Datum + +//SubSystem flags (Please design any new flags so that the default is off, to make adding flags to subsystems easier) + +//subsystem does not initialize. +#define SS_NO_INIT 1 + +//subsystem does not fire. +// (like can_fire = 0, but keeps it from getting added to the processing subsystems list) +// (Requires a MC restart to change) +#define SS_NO_FIRE 2 + +//subsystem only runs on spare cpu (after all non-background subsystems have ran that tick) +// SS_BACKGROUND has its own priority bracket +#define SS_BACKGROUND 4 + +//subsystem does not tick check, and should not run unless there is enough time (or its running behind (unless background)) +#define SS_NO_TICK_CHECK 8 + +//Treat wait as a tick count, not DS, run every wait ticks. +// (also forces it to run first in the tick, above even SS_NO_TICK_CHECK subsystems) +// (implies all runlevels because of how it works) +// (overrides SS_BACKGROUND) +// This is designed for basically anything that works as a mini-mc (like SStimer) +#define SS_TICKER 16 + +//keep the subsystem's timing on point by firing early if it fired late last fire because of lag +// ie: if a 20ds subsystem fires say 5 ds late due to lag or what not, its next fire would be in 15ds, not 20ds. +#define SS_KEEP_TIMING 32 + +//Calculate its next fire after its fired. +// (IE: if a 5ds wait SS takes 2ds to run, its next fire should be 5ds away, not 3ds like it normally would be) +// This flag overrides SS_KEEP_TIMING +#define SS_POST_FIRE_TIMING 64 + +//SUBSYSTEM STATES +#define SS_IDLE 0 //aint doing shit. +#define SS_QUEUED 1 //queued to run +#define SS_RUNNING 2 //actively running +#define SS_PAUSED 3 //paused by mc_tick_check +#define SS_SLEEPING 4 //fire() slept. +#define SS_PAUSING 5 //in the middle of pausing + +// Standard way to define a global subsystem, keep boilerplate organized here! +#define SUBSYSTEM_DEF(X) var/datum/controller/subsystem/##X/SS##X;\ +/datum/controller/subsystem/##X/New(){\ + NEW_SS_GLOBAL(SS##X);\ + PreInit();\ +}\ +/datum/controller/subsystem/##X diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index 9e0a66fb6f2..1fb1cbf02cb 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -1,6 +1,7 @@ // Belly Mode Constants #define DM_HOLD "Hold" #define DM_DIGEST "Digest" +#define DM_DIGEST_NUMB "Digest (Numbing)" #define DM_HEAL "Heal" #define DM_ABSORB "Absorb" #define DM_TRANSFORM_HAIR_AND_EYES "Transform (Hair and eyes)" @@ -18,7 +19,6 @@ #define DM_DRAIN "Drain" #define DM_UNABSORB "Unabsorb" - // Stance for hostile mobs to be in while devouring someone. #define HOSTILE_STANCE_EATING 99 diff --git a/code/__defines/math.dm b/code/__defines/math.dm new file mode 100644 index 00000000000..0729a4526de --- /dev/null +++ b/code/__defines/math.dm @@ -0,0 +1,10 @@ +//"fancy" math for calculating time in ms from tick_usage percentage and the length of ticks +//percent_of_tick_used * (ticklag * 100(to convert to ms)) / 100(percent ratio) +//collapsed to percent_of_tick_used * tick_lag +#define TICK_DELTA_TO_MS(percent_of_tick_used) ((percent_of_tick_used) * world.tick_lag) +#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(world.tick_usage-starting_tickusage)) + +//time of day but automatically adjusts to the server going into the next day within the same round. +//for when you need a reliable time number that doesn't depend on byond time. +#define REALTIMEOFDAY (world.timeofday + (MIDNIGHT_ROLLOVER * MIDNIGHT_ROLLOVER_CHECK)) +#define MIDNIGHT_ROLLOVER_CHECK ( rollovercheck_last_timeofday != world.timeofday ? update_midnight_rollover() : midnight_rollovers ) diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index ccd1beb6480..984b02dd2bf 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -201,3 +201,5 @@ #define TSC_MORPH "Morpheus" #define TSC_XION "Xion" // Not really needed but consistancy I guess. #define TSC_GIL "Gilthari" + +#define MIDNIGHT_ROLLOVER 864000 //number of deciseconds in a day diff --git a/code/__defines/misc_vr.dm b/code/__defines/misc_vr.dm index 7f25f414758..e47a6492eb1 100644 --- a/code/__defines/misc_vr.dm +++ b/code/__defines/misc_vr.dm @@ -15,3 +15,12 @@ #define VANTAG_KILL "vantag_kill" #define ANNOUNCER_NAME "Facility PA" + +//For custom species +#define STARTING_SPECIES_POINTS 1 +#define MAX_SPECIES_TRAITS 5 + +// Resleeving Mind Record Status +#define MR_NORMAL 0 +#define MR_UNSURE 1 +#define MR_DEAD 2 diff --git a/code/__defines/nifsoft.dm b/code/__defines/nifsoft.dm new file mode 100644 index 00000000000..daf63425ea4 --- /dev/null +++ b/code/__defines/nifsoft.dm @@ -0,0 +1,107 @@ +// List indexes for software datum references on mobs +// This also controls the order they are displayed in the NIF stat panel +//AR Overlays +#define NIF_CIVILIAN_AR 1 +#define NIF_MEDICAL_AR 2 +#define NIF_SECURITY_AR 3 +#define NIF_ENGINE_AR 4 +#define NIF_SCIENCE_AR 5 +#define NIF_OMNI_AR 6 +//Misc Vision +#define NIF_CORRECTIVE_GLASS 7 +#define NIF_MESONS 8 +#define NIF_MATERIAL 9 +#define NIF_THERMALS 10 +#define NIF_NIGHTVIS 11 +#define NIF_UVFILTER 12 +#define NIF_FLASHPROT 13 +//Health-related +#define NIF_CREWMONITOR 14 +#define NIF_ORGANIC_HEAL 15 +#define NIF_SYNTH_HEAL 16 +#define NIF_AUTOSTASIS 17 //These two are just part of +#define NIF_MED_ALARM 18 //medichines right now +#define NIF_TOXHEAL 19 //And this, for organics +#define NIF_SPAREBREATH 20 +//Combat Related +#define NIF_BRUTEARMOR 21 +#define NIF_BURNARMOR 22 +#define NIF_PAINKILLERS 23 +#define NIF_HARDCLAWS 24 +#define NIF_HIDDENLASER 25 +//Other +#define NIF_COMMLINK 26 +#define NIF_APCCHARGE 27 +#define NIF_PRESSURE 28 +#define NIF_HEATSINK 29 +#define NIF_COMPLIANCE 30 +#define NIF_SIZECHANGE 31 +#define NIF_SOULCATCHER 32 + +// Must be equal to the highest number above +#define TOTAL_NIF_SOFTWARE 32 + +////////////////////// +// NIF flag list hints +#define NIF_FLAGS_VISION 1 +#define NIF_FLAGS_HEALTH 2 +#define NIF_FLAGS_COMBAT 3 +#define NIF_FLAGS_OTHER 4 + +// NIF flags +//Vision +#define NIF_V_AR_CIVILIAN 0x1 +#define NIF_V_AR_MEDICAL 0x2 +#define NIF_V_AR_SECURITY 0x4 +#define NIF_V_AR_ENGINE 0x8 +#define NIF_V_AR_SCIENCE 0x10 +#define NIF_V_AR_OMNI 0x20 +#define NIF_V_CORRECTIVE 0x40 +#define NIF_V_MESONS 0x80 +#define NIF_V_MATERIAL 0x100 +#define NIF_V_THERMALS 0x200 +#define NIF_V_NIGHTVIS 0x400 +#define NIF_V_UVFILTER 0x800 +#define NIF_V_FLASHPROT 0x1000 + +//Health +#define NIF_H_ORGREPAIR 0x1 +#define NIF_H_SYNTHREPAIR 0x2 +#define NIF_H_AUTOSTASIS 0x4 //These two are just part of +#define NIF_H_ALERTMED 0x8 //medichines right now +#define NIF_H_TOXREGEN 0x10 +#define NIF_H_SPAREBREATH 0x20 + +//Combat +#define NIF_C_BRUTEARMOR 0x1 +#define NIF_C_BURNARMOR 0x2 +#define NIF_C_PAINKILLERS 0x4 +#define NIF_C_HARDCLAWS 0x8 +#define NIF_C_HIDELASER 0x10 + +//Other +#define NIF_O_COMMLINK 0x1 +#define NIF_O_APCCHARGE 0x2 +#define NIF_O_PRESSURESEAL 0x4 +#define NIF_O_HEATSINKS 0x8 +#define NIF_O_SCMYSELF 0x10 //Soulcatcher stuff +#define NIF_O_SCOTHERS 0x20 + +/////////////////// +// applies_to flags +#define NIF_ORGANIC 0x1 +#define NIF_SYNTHETIC 0x2 + +///////////// +// stat flags +#define NIF_WORKING 0 +#define NIF_POWFAIL 1 +#define NIF_TEMPFAIL 2 +#define NIF_INSTALLING 3 +#define NIF_PREINSTALL 4 + +/////////////////// +// tick_flags flags +#define NIF_NEVERTICK 0 +#define NIF_ALWAYSTICK 1 +#define NIF_ACTIVETICK 2 diff --git a/code/__defines/qdel.dm b/code/__defines/qdel.dm new file mode 100644 index 00000000000..168a6adf0c3 --- /dev/null +++ b/code/__defines/qdel.dm @@ -0,0 +1,17 @@ +//defines that give qdel hints. these can be given as a return in destory() or by calling + +#define QDEL_HINT_QUEUE 0 //qdel should queue the object for deletion. +#define QDEL_HINT_LETMELIVE 1 //qdel should let the object live after calling destory. +#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it. +#define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference. +#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste. +#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm. + //if TESTING is enabled, qdel will call this object's find_references() verb. +//defines for the gc_destroyed var + +#define GC_QUEUED_FOR_QUEUING -1 +#define GC_QUEUED_FOR_HARD_DEL -2 +#define GC_CURRENTLY_BEING_QDELETED -3 + +#define QDELETED(X) (!X || X.gc_destroyed) +#define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm new file mode 100644 index 00000000000..75780be3eb8 --- /dev/null +++ b/code/__defines/subsystems.dm @@ -0,0 +1,15 @@ + +// SS runlevels + +#define RUNLEVEL_INIT 0 // "Initialize Only" - Used for subsystems that should never be fired (Should also have SS_NO_FIRE set) +#define RUNLEVEL_LOBBY 1 // Initial runlevel before setup. Returns to here if setup fails. +#define RUNLEVEL_SETUP 2 // While the gamemode setup is running. I.E gameticker.setup() +#define RUNLEVEL_GAME 4 // After successful game ticker setup, while the round is running. +#define RUNLEVEL_POSTGAME 8 // When round completes but before reboot + +#define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME) + +var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_GAME, RUNLEVEL_POSTGAME) +#define RUNLEVEL_FLAG_TO_INDEX(flag) (log(2, flag) + 1) // Convert from the runlevel bitfield constants to index in runlevel_flags list + +#define INIT_ORDER_LIGHTING 0 diff --git a/code/__defines/tick.dm b/code/__defines/tick.dm new file mode 100644 index 00000000000..4c88fd643ea --- /dev/null +++ b/code/__defines/tick.dm @@ -0,0 +1,7 @@ +#define TICK_LIMIT_RUNNING 80 +#define TICK_LIMIT_TO_RUN 78 +#define TICK_LIMIT_MC 70 +#define TICK_LIMIT_MC_INIT_DEFAULT 98 + +#define TICK_CHECK ( world.tick_usage > Master.current_ticklimit ) +#define CHECK_TICK if TICK_CHECK stoplag() diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index b59857c8f6b..fb99da896f3 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -271,20 +271,25 @@ var/list/hear = dview(range,T,INVISIBILITY_MAXIMUM) var/list/hearturfs = list() - for(var/atom/movable/AM in hear) - if(ismob(AM)) - mobs += AM - hearturfs += AM.locs[1] - else if(isobj(AM)) - objs += AM - hearturfs += AM.locs[1] + for(var/thing in hear) + if(istype(thing,/obj)) + objs += thing + hearturfs += get_turf(thing) + else if(istype(thing,/mob)) + mobs += thing + hearturfs += get_turf(thing) //A list of every mob with a client - for(var/mob/M in player_list) - if(M.loc && M.locs[1] in hearturfs) - mobs |= M + for(var/mob in player_list) + if(isnull(mob)) //VOREStation Add - Fix for a weird bug with nulls in this list + player_list -= mob //VOREStation Add + continue //VOREStation Add + if(get_turf(mob) in hearturfs) + mobs |= mob + continue - else if(M.stat == DEAD && !M.forbid_seeing_deadchat) + var/mob/M = mob + if(M.stat == DEAD && !M.forbid_seeing_deadchat) switch(type) if(1) //Audio messages use ghost_ears if(M.is_preference_enabled(/datum/client_preference/ghost_ears)) @@ -294,9 +299,9 @@ mobs |= M //For objects below the top level who still want to hear - for(var/obj/O in listening_objects) - if(O.loc && O.locs[1] in hearturfs) - objs |= O + for(var/obj in listening_objects) + if(get_turf(obj) in hearturfs) + objs |= obj return list("mobs" = mobs, "objs" = objs) diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 72937092c4f..73d41048ed2 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -32,7 +32,7 @@ var/global/list/all_species[0] var/global/list/all_languages[0] var/global/list/language_keys[0] // Table of say codes for all languages var/global/list/whitelisted_species = list("Human") // Species that require a whitelist check. -var/global/list/playable_species = list("Human") // A list of ALL playable species, whitelisted, latejoin or otherwise. +var/global/list/playable_species = list("Custom Species","Human") // A list of ALL playable species, whitelisted, latejoin or otherwise. //VOREStation Edit - Making sure custom species is obvious. var/list/mannequins_ diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index fe953e1f1ba..3e83ce7fbf6 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -4,6 +4,11 @@ var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type +var/global/list/negative_traits = list() // Negative custom species traits, indexed by path +var/global/list/neutral_traits = list() // Neutral custom species traits, indexed by path +var/global/list/positive_traits = list() // Positive custom species traits, indexed by path +var/global/list/traits_costs = list() // Just path = cost list, saves time in char setup +var/global/list/all_traits = list() // All of 'em at once (same instances) //stores numeric player size options indexed by name var/global/list/player_sizes_list = list( @@ -120,4 +125,20 @@ var/global/list/tf_egg_types = list( for(var/path in paths) var/datum/sprite_accessory/tail/instance = new path() tail_styles_list[path] = instance - return 1 // Hooks must return 1 + + // Custom species traits + paths = typesof(/datum/trait) - /datum/trait + for(var/path in paths) + var/datum/trait/instance = new path() + var/cost = instance.cost + traits_costs[path] = cost + all_traits[path] = instance + switch(cost) + if(-INFINITY to -0.1) + negative_traits[path] = instance + if(0) + neutral_traits[path] = instance + if(0.1 to INFINITY) + positive_traits[path] = instance + + return 1 // Hooks must return 1 \ No newline at end of file diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm index 02a0ce19891..651e6af83c6 100644 --- a/code/_helpers/icons.dm +++ b/code/_helpers/icons.dm @@ -873,3 +873,22 @@ proc/sort_atoms_by_layer(var/list/atoms) result.Swap(i, gap + i) swapped = 1 return result + +// Mutable appearances are an inbuilt byond datastructure. Read the documentation on them by hitting F1 in DM. +// Basically use them instead of images for overlays/underlays and when changing an object's appearance if you're doing so with any regularity. +// Unless you need the overlay/underlay to have a different direction than the base object. Then you have to use an image due to a bug. + +// Mutable appearances are children of images, just so you know. + +/mutable_appearance/New() + ..() + plane = FLOAT_PLANE // No clue why this is 0 by default yet images are on FLOAT_PLANE + // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var + +// Helper similar to image() +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER) + var/mutable_appearance/MA = new() + MA.icon = icon + MA.icon_state = icon_state + MA.layer = layer + return MA diff --git a/code/_helpers/lists.dm b/code/_helpers/lists.dm index 30df4693db7..e647cd1df79 100644 --- a/code/_helpers/lists.dm +++ b/code/_helpers/lists.dm @@ -599,3 +599,66 @@ proc/dd_sortedTextList(list/incoming) for(var/path in subtypesof(prototype)) L += new path() return L + +//creates every subtype of prototype (excluding prototype) and adds it to list L as a type/instance pair. +//if no list/L is provided, one is created. +/proc/init_subtypes_assoc(prototype, list/L) + if(!istype(L)) L = list() + for(var/path in subtypesof(prototype)) + L[path] = new path() + return L + +//Move a single element from position fromIndex within a list, to position toIndex +//All elements in the range [1,toIndex) before the move will be before the pivot afterwards +//All elements in the range [toIndex, L.len+1) before the move will be after the pivot afterwards +//In other words, it's as if the range [fromIndex,toIndex) have been rotated using a <<< operation common to other languages. +//fromIndex and toIndex must be in the range [1,L.len+1] +//This will preserve associations ~Carnie +/proc/moveElement(list/L, fromIndex, toIndex) + if(fromIndex == toIndex || fromIndex+1 == toIndex) //no need to move + return + if(fromIndex > toIndex) + ++fromIndex //since a null will be inserted before fromIndex, the index needs to be nudged right by one + + L.Insert(toIndex, null) + L.Swap(fromIndex, toIndex) + L.Cut(fromIndex, fromIndex+1) + +//Move elements [fromIndex,fromIndex+len) to [toIndex-len, toIndex) +//Same as moveElement but for ranges of elements +//This will preserve associations ~Carnie +/proc/moveRange(list/L, fromIndex, toIndex, len=1) + var/distance = abs(toIndex - fromIndex) + if(len >= distance) //there are more elements to be moved than the distance to be moved. Therefore the same result can be achieved (with fewer operations) by moving elements between where we are and where we are going. The result being, our range we are moving is shifted left or right by dist elements + if(fromIndex <= toIndex) + return //no need to move + fromIndex += len //we want to shift left instead of right + + for(var/i=0, i toIndex) + fromIndex += len + + for(var/i=0, i= 2) + fromIndex = fromIndex % L.len + toIndex = toIndex % (L.len+1) + if(fromIndex <= 0) + fromIndex += L.len + if(toIndex <= 0) + toIndex += L.len + 1 + + sortInstance.L = L + sortInstance.cmp = cmp + sortInstance.associative = associative + + sortInstance.timSort(fromIndex, toIndex) + + return L diff --git a/code/_helpers/sorts/__main.dm b/code/_helpers/sorts/__main.dm new file mode 100644 index 00000000000..622d88f1472 --- /dev/null +++ b/code/_helpers/sorts/__main.dm @@ -0,0 +1,656 @@ + //These are macros used to reduce on proc calls +#define fetchElement(L, i) (associative) ? L[L[i]] : L[i] + + //Minimum sized sequence that will be merged. Anything smaller than this will use binary-insertion sort. + //Should be a power of 2 +#define MIN_MERGE 32 + + //When we get into galloping mode, we stay there until both runs win less often than MIN_GALLOP consecutive times. +#define MIN_GALLOP 7 + + //This is a global instance to allow much of this code to be reused. The interfaces are kept separately +var/datum/sortInstance/sortInstance = new() +/datum/sortInstance + //The array being sorted. + var/list/L + + //The comparator proc-reference + var/cmp = /proc/cmp_numeric_asc + + //whether we are sorting list keys (0: L[i]) or associated values (1: L[L[i]]) + var/associative = 0 + + //This controls when we get *into* galloping mode. It is initialized to MIN_GALLOP. + //The mergeLo and mergeHi methods nudge it higher for random data, and lower for highly structured data. + var/minGallop = MIN_GALLOP + + //Stores information regarding runs yet to be merged. + //Run i starts at runBase[i] and extends for runLen[i] elements. + //runBase[i] + runLen[i] == runBase[i+1] + //var/stackSize + var/list/runBases = list() + var/list/runLens = list() + + +/datum/sortInstance/proc/timSort(start, end) + runBases.Cut() + runLens.Cut() + + var/remaining = end - start + + //If array is small, do a 'mini-TimSort' with no merges + if(remaining < MIN_MERGE) + var/initRunLen = countRunAndMakeAscending(start, end) + binarySort(start, end, start+initRunLen) + return + + //March over the array finding natural runs + //Extend any short natural runs to runs of length minRun + var/minRun = minRunLength(remaining) + + do + //identify next run + var/runLen = countRunAndMakeAscending(start, end) + + //if run is short, extend to min(minRun, remaining) + if(runLen < minRun) + var/force = (remaining <= minRun) ? remaining : minRun + + binarySort(start, start+force, start+runLen) + runLen = force + + //add data about run to queue + runBases.Add(start) + runLens.Add(runLen) + + //maybe merge + mergeCollapse() + + //Advance to find next run + start += runLen + remaining -= runLen + + while(remaining > 0) + + + //Merge all remaining runs to complete sort + //ASSERT(start == end) + mergeForceCollapse(); + //ASSERT(runBases.len == 1) + + //reset minGallop, for successive calls + minGallop = MIN_GALLOP + + return L + +/* +Sorts the specified portion of the specified array using a binary +insertion sort. This is the best method for sorting small numbers +of elements. It requires O(n log n) compares, but O(n^2) data +movement (worst case). + +If the initial part of the specified range is already sorted, +this method can take advantage of it: the method assumes that the +elements in range [lo,start) are already sorted + +lo the index of the first element in the range to be sorted +hi the index after the last element in the range to be sorted +start the index of the first element in the range that is not already known to be sorted +*/ +/datum/sortInstance/proc/binarySort(lo, hi, start) + //ASSERT(lo <= start && start <= hi) + if(start <= lo) + start = lo + 1 + + for(,start < hi, ++start) + var/pivot = fetchElement(L,start) + + //set left and right to the index where pivot belongs + var/left = lo + var/right = start + //ASSERT(left <= right) + + //[lo, left) elements <= pivot < [right, start) elements + //in other words, find where the pivot element should go using bisection search + while(left < right) + var/mid = (left + right) >> 1 //round((left+right)/2) + if(call(cmp)(fetchElement(L,mid), pivot) > 0) + right = mid + else + left = mid+1 + + //ASSERT(left == right) + moveElement(L, start, left) //move pivot element to correct location in the sorted range + +/* +Returns the length of the run beginning at the specified position and reverses the run if it is back-to-front + +A run is the longest ascending sequence with: + a[lo] <= a[lo + 1] <= a[lo + 2] <= ... +or the longest descending sequence with: + a[lo] > a[lo + 1] > a[lo + 2] > ... + +For its intended use in a stable mergesort, the strictness of the +definition of "descending" is needed so that the call can safely +reverse a descending sequence without violating stability. +*/ +/datum/sortInstance/proc/countRunAndMakeAscending(lo, hi) + //ASSERT(lo < hi) + + var/runHi = lo + 1 + if(runHi >= hi) + return 1 + + var/last = fetchElement(L,lo) + var/current = fetchElement(L,runHi++) + + if(call(cmp)(current, last) < 0) + while(runHi < hi) + last = current + current = fetchElement(L,runHi) + if(call(cmp)(current, last) >= 0) + break + ++runHi + reverseRange(L, lo, runHi) + else + while(runHi < hi) + last = current + current = fetchElement(L,runHi) + if(call(cmp)(current, last) < 0) + break + ++runHi + + return runHi - lo + +//Returns the minimum acceptable run length for an array of the specified length. +//Natural runs shorter than this will be extended with binarySort +/datum/sortInstance/proc/minRunLength(n) + //ASSERT(n >= 0) + var/r = 0 //becomes 1 if any bits are shifted off + while(n >= MIN_MERGE) + r |= (n & 1) + n >>= 1 + return n + r + +//Examines the stack of runs waiting to be merged and merges adjacent runs until the stack invariants are reestablished: +// runLen[i-3] > runLen[i-2] + runLen[i-1] +// runLen[i-2] > runLen[i-1] +//This method is called each time a new run is pushed onto the stack. +//So the invariants are guaranteed to hold for i= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) + if(runLens[n-1] < runLens[n+1]) + --n + mergeAt(n) + else if(runLens[n] <= runLens[n+1]) + mergeAt(n) + else + break //Invariant is established + + +//Merges all runs on the stack until only one remains. +//Called only once, to finalise the sort +/datum/sortInstance/proc/mergeForceCollapse() + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] < runLens[n+1]) + --n + mergeAt(n) + + +//Merges the two consecutive runs at stack indices i and i+1 +//Run i must be the penultimate or antepenultimate run on the stack +//In other words, i must be equal to stackSize-2 or stackSize-3 +/datum/sortInstance/proc/mergeAt(i) + //ASSERT(runBases.len >= 2) + //ASSERT(i >= 1) + //ASSERT(i == runBases.len - 1 || i == runBases.len - 2) + + var/base1 = runBases[i] + var/base2 = runBases[i+1] + var/len1 = runLens[i] + var/len2 = runLens[i+1] + + //ASSERT(len1 > 0 && len2 > 0) + //ASSERT(base1 + len1 == base2) + + //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run + //(which isn't involved in this merge). The current run (i+1) goes away in any case. + runLens[i] += runLens[i+1] + runLens.Cut(i+1, i+2) + runBases.Cut(i+1, i+2) + + + //Find where the first element of run2 goes in run1. + //Prior elements in run1 can be ignored (because they're already in place) + var/k = gallopRight(fetchElement(L,base2), base1, len1, 0) + //ASSERT(k >= 0) + base1 += k + len1 -= k + if(len1 == 0) + return + + //Find where the last element of run1 goes in run2. + //Subsequent elements in run2 can be ignored (because they're already in place) + len2 = gallopLeft(fetchElement(L,base1 + len1 - 1), base2, len2, len2-1) + //ASSERT(len2 >= 0) + if(len2 == 0) + return + + //Merge remaining runs, using tmp array with min(len1, len2) elements + if(len1 <= len2) + mergeLo(base1, len1, base2, len2) + else + mergeHi(base1, len1, base2, len2) + + +/* + Locates the position to insert key within the specified sorted range + If the range contains elements equal to key, this will return the index of the LEFTMOST of those elements + + key the element to be inserted into the sorted range + base the index of the first element of the sorted range + len the length of the sorted range, must be greater than 0 + hint the offset from base at which to begin the search, such that 0 <= hint < len; i.e. base <= hint < base+hint + + Returns the index at which to insert element 'key' +*/ +/datum/sortInstance/proc/gallopLeft(key, base, len, hint) + //ASSERT(len > 0 && hint >= 0 && hint < len) + + var/lastOffset = 0 + var/offset = 1 + if(call(cmp)(key, fetchElement(L,base+hint)) > 0) + var/maxOffset = len - hint + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) > 0) + lastOffset = offset + offset = (offset << 1) + 1 + + if(offset > maxOffset) + offset = maxOffset + + lastOffset += hint + offset += hint + + else + var/maxOffset = hint + 1 + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) <= 0) + lastOffset = offset + offset = (offset << 1) + 1 + + if(offset > maxOffset) + offset = maxOffset + + var/temp = lastOffset + lastOffset = hint - offset + offset = hint - temp + + //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len) + + //Now L[base+lastOffset] < key <= L[base+offset], so key belongs somewhere to the right of lastOffset but no farther than + //offset. Do a binary search with invariant L[base+lastOffset-1] < key <= L[base+offset] + ++lastOffset + while(lastOffset < offset) + var/m = lastOffset + ((offset - lastOffset) >> 1) + + if(call(cmp)(key, fetchElement(L,base+m)) > 0) + lastOffset = m + 1 + else + offset = m + + //ASSERT(lastOffset == offset) + return offset + +/** + * Like gallopLeft, except that if the range contains an element equal to + * key, gallopRight returns the index after the rightmost equal element. + * + * @param key the key whose insertion point to search for + * @param a the array in which to search + * @param base the index of the first element in the range + * @param len the length of the range; must be > 0 + * @param hint the index at which to begin the search, 0 <= hint < n. + * The closer hint is to the result, the faster this method will run. + * @param c the comparator used to order the range, and to search + * @return the int k, 0 <= k <= n such that a[b + k - 1] <= key < a[b + k] + */ +/datum/sortInstance/proc/gallopRight(key, base, len, hint) + //ASSERT(len > 0 && hint >= 0 && hint < len) + + var/offset = 1 + var/lastOffset = 0 + if(call(cmp)(key, fetchElement(L,base+hint)) < 0) //key <= L[base+hint] + var/maxOffset = hint + 1 //therefore we want to insert somewhere in the range [base,base+hint] = [base+,base+(hint+1)) + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) < 0) //we are iterating backwards + lastOffset = offset + offset = (offset << 1) + 1 //1 3 7 15 + //if(offset <= 0) //int overflow, not an issue here since we are using floats + // offset = maxOffset + + if(offset > maxOffset) + offset = maxOffset + + var/temp = lastOffset + lastOffset = hint - offset + offset = hint - temp + + else //key > L[base+hint] + var/maxOffset = len - hint //therefore we want to insert somewhere in the range (base+hint,base+len) = [base+hint+1, base+hint+(len-hint)) + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) >= 0) + lastOffset = offset + offset = (offset << 1) + 1 + //if(offset <= 0) //int overflow, not an issue here since we are using floats + // offset = maxOffset + + if(offset > maxOffset) + offset = maxOffset + + lastOffset += hint + offset += hint + + //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len) + + ++lastOffset + while(lastOffset < offset) + var/m = lastOffset + ((offset - lastOffset) >> 1) + + if(call(cmp)(key, fetchElement(L,base+m)) < 0) //key <= L[base+m] + offset = m + else //key > L[base+m] + lastOffset = m + 1 + + //ASSERT(lastOffset == offset) + + return offset + + +//Merges two adjacent runs in-place in a stable fashion. +//For performance this method should only be called when len1 <= len2! +/datum/sortInstance/proc/mergeLo(base1, len1, base2, len2) + //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2) + + var/cursor1 = base1 + var/cursor2 = base2 + + //degenerate cases + if(len2 == 1) + moveElement(L, cursor2, cursor1) + return + + if(len1 == 1) + moveElement(L, cursor1, cursor2+len2) + return + + + //Move first element of second run + moveElement(L, cursor2++, cursor1++) + --len2 + + outer: + while(1) + var/count1 = 0 //# of times in a row that first run won + var/count2 = 0 // " " " " " " second run won + + //do the straightfoward thin until one run starts winning consistently + + do + //ASSERT(len1 > 1 && len2 > 0) + if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) + moveElement(L, cursor2++, cursor1++) + --len2 + + ++count2 + count1 = 0 + + if(len2 == 0) + break outer + else + ++cursor1 + + ++count1 + count2 = 0 + + if(--len1 == 1) + break outer + + while((count1 | count2) < minGallop) + + + //one run is winning consistently so galloping may provide huge benifits + //so try galloping, until such time as the run is no longer consistently winning + do + //ASSERT(len1 > 1 && len2 > 0) + + count1 = gallopRight(fetchElement(L,cursor2), cursor1, len1, 0) + if(count1) + cursor1 += count1 + len1 -= count1 + + if(len1 <= 1) + break outer + + moveElement(L, cursor2, cursor1) + ++cursor2 + ++cursor1 + if(--len2 == 0) + break outer + + count2 = gallopLeft(fetchElement(L,cursor1), cursor2, len2, 0) + if(count2) + moveRange(L, cursor2, cursor1, count2) + + cursor2 += count2 + cursor1 += count2 + len2 -= count2 + + if(len2 == 0) + break outer + + ++cursor1 + if(--len1 == 1) + break outer + + --minGallop + + while((count1|count2) > MIN_GALLOP) + + if(minGallop < 0) + minGallop = 0 + minGallop += 2; // Penalize for leaving gallop mode + + + if(len1 == 1) + //ASSERT(len2 > 0) + moveElement(L, cursor1, cursor2+len2) + + //else + //ASSERT(len2 == 0) + //ASSERT(len1 > 1) + + +/datum/sortInstance/proc/mergeHi(base1, len1, base2, len2) + //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2) + + var/cursor1 = base1 + len1 - 1 //start at end of sublists + var/cursor2 = base2 + len2 - 1 + + //degenerate cases + if(len2 == 1) + moveElement(L, base2, base1) + return + + if(len1 == 1) + moveElement(L, base1, cursor2+1) + return + + moveElement(L, cursor1--, cursor2-- + 1) + --len1 + + outer: + while(1) + var/count1 = 0 //# of times in a row that first run won + var/count2 = 0 // " " " " " " second run won + + //do the straightfoward thing until one run starts winning consistently + do + //ASSERT(len1 > 0 && len2 > 1) + if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) + moveElement(L, cursor1--, cursor2-- + 1) + --len1 + + ++count1 + count2 = 0 + + if(len1 == 0) + break outer + else + --cursor2 + --len2 + + ++count2 + count1 = 0 + + if(len2 == 1) + break outer + while((count1 | count2) < minGallop) + + //one run is winning consistently so galloping may provide huge benifits + //so try galloping, until such time as the run is no longer consistently winning + do + //ASSERT(len1 > 0 && len2 > 1) + + count1 = len1 - gallopRight(fetchElement(L,cursor2), base1, len1, len1-1) //should cursor1 be base1? + if(count1) + cursor1 -= count1 + + moveRange(L, cursor1+1, cursor2+1, count1) //cursor1+1 == cursor2 by definition + + cursor2 -= count1 + len1 -= count1 + + if(len1 == 0) + break outer + + --cursor2 + + if(--len2 == 1) + break outer + + count2 = len2 - gallopLeft(fetchElement(L,cursor1), cursor1+1, len2, len2-1) + if(count2) + cursor2 -= count2 + len2 -= count2 + + if(len2 <= 1) + break outer + + moveElement(L, cursor1--, cursor2-- + 1) + --len1 + + if(len1 == 0) + break outer + + --minGallop + while((count1|count2) > MIN_GALLOP) + + if(minGallop < 0) + minGallop = 0 + minGallop += 2 // Penalize for leaving gallop mode + + if(len2 == 1) + //ASSERT(len1 > 0) + + cursor1 -= len1 + moveRange(L, cursor1+1, cursor2+1, len1) + + //else + //ASSERT(len1 == 0) + //ASSERT(len2 > 0) + + +/datum/sortInstance/proc/mergeSort(start, end) + var/remaining = end - start + + //If array is small, do an insertion sort + if(remaining < MIN_MERGE) + //var/initRunLen = countRunAndMakeAscending(start, end) + binarySort(start, end, start/*+initRunLen*/) + return + + var/minRun = minRunLength(remaining) + + do + var/runLen = (remaining <= minRun) ? remaining : minRun + + binarySort(start, start+runLen, start) + + //add data about run to queue + runBases.Add(start) + runLens.Add(runLen) + + //Advance to find next run + start += runLen + remaining -= runLen + + while(remaining > 0) + + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) + if(runLens[n-1] < runLens[n+1]) + --n + mergeAt2(n) + else if(runLens[n] <= runLens[n+1]) + mergeAt2(n) + else + break //Invariant is established + + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] < runLens[n+1]) + --n + mergeAt2(n) + + return L + +/datum/sortInstance/proc/mergeAt2(i) + var/cursor1 = runBases[i] + var/cursor2 = runBases[i+1] + + var/end1 = cursor1+runLens[i] + var/end2 = cursor2+runLens[i+1] + + var/val1 = fetchElement(L,cursor1) + var/val2 = fetchElement(L,cursor2) + + while(1) + if(call(cmp)(val1,val2) < 0) + if(++cursor1 >= end1) + break + val1 = fetchElement(L,cursor1) + else + moveElement(L,cursor2,cursor1) + + ++cursor2 + if(++cursor2 >= end2) + break + ++end1 + ++cursor1 + //if(++cursor1 >= end1) + // break + + val2 = fetchElement(L,cursor2) + + + //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run + //(which isn't involved in this merge). The current run (i+1) goes away in any case. + runLens[i] += runLens[i+1] + runLens.Cut(i+1, i+2) + runBases.Cut(i+1, i+2) + +#undef MIN_GALLOP +#undef MIN_MERGE + +#undef fetchElement diff --git a/code/_helpers/sorts/comparators.dm b/code/_helpers/sorts/comparators.dm new file mode 100644 index 00000000000..8c1f954a00a --- /dev/null +++ b/code/_helpers/sorts/comparators.dm @@ -0,0 +1,20 @@ +// +// Comparators for use with /datum/sortInstance (or wherever you want) +// They should return negative, zero, or positive numbers for a < b, a == b, and a > b respectively. +// + +// Sorts numeric ascending +/proc/cmp_numeric_asc(a,b) + return a - b + +// Sorts subsystems alphabetically +/proc/cmp_subsystem_display(datum/controller/subsystem/a, datum/controller/subsystem/b) + return sorttext(b.name, a.name) + +// Sorts subsystems by init_order +/proc/cmp_subsystem_init(datum/controller/subsystem/a, datum/controller/subsystem/b) + return b.init_order - a.init_order + +// Sorts subsystems by priority +/proc/cmp_subsystem_priority(datum/controller/subsystem/a, datum/controller/subsystem/b) + return a.priority - b.priority diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index 991d64e20b9..3a6bcedcd11 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -100,4 +100,24 @@ var/round_start_time = 0 /hook/startup/proc/set_roundstart_hour() roundstart_hour = pick(2,7,12,17) - return 1 \ No newline at end of file + return 1 + +/var/midnight_rollovers = 0 +/var/rollovercheck_last_timeofday = 0 +/proc/update_midnight_rollover() + if (world.timeofday < rollovercheck_last_timeofday) //TIME IS GOING BACKWARDS! + return midnight_rollovers++ + return midnight_rollovers + +//Increases delay as the server gets more overloaded, +//as sleeps aren't cheap and sleeping only to wake up and sleep again is wasteful +#define DELTA_CALC max(((max(world.tick_usage, world.cpu) / 100) * max(Master.sleep_delta,1)), 1) + +/proc/stoplag() + . = 0 + var/i = 1 + do + . += round(i*DELTA_CALC) + sleep(i*world.tick_lag*DELTA_CALC) + i *= 2 + while (world.tick_usage > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 6fa9d4ec0c7..28868d08629 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1157,12 +1157,22 @@ proc/is_hot(obj/item/W as obj) istype(W, /obj/item/weapon/surgical/bonesetter) ) -//check if mob is lying down on something we can operate him on. +// check if mob is lying down on something we can operate him on. +// The RNG with table/rollerbeds comes into play in do_surgery() so that fail_step() can be used instead. /proc/can_operate(mob/living/carbon/M) - return (M.lying && \ - locate(/obj/machinery/optable, M.loc) || \ - (locate(/obj/structure/bed/roller, M.loc) && prob(75)) || \ - (locate(/obj/structure/table/, M.loc) && prob(66))) + return M.lying + +// Returns an instance of a valid surgery surface. +/mob/living/proc/get_surgery_surface() + if(!lying) + return null // Not lying down means no surface. + var/obj/surface = null + for(var/obj/O in loc) // Looks for the best surface. + if(O.surgery_odds) + if(!surface || surface.surgery_odds < O) + surface = O + if(surface) + return surface /proc/reverse_direction(var/dir) switch(dir) @@ -1254,6 +1264,10 @@ var/mob/dview/dview_mob = new if(!center) return + if(!dview_mob) //VOREStation Add - Emergency Backup + dview_mob = new() + WARNING("dview mob was lost, and had to be recreated!") + dview_mob.loc = center dview_mob.see_invisible = invis_flags @@ -1284,6 +1298,13 @@ var/mob/dview/dview_mob = new else living_mob_list -= src +/mob/dview/Destroy(var/force) + crash_with("Attempt to delete the dview_mob: [log_info_line(src)]") + if (!force) + return QDEL_HINT_LETMELIVE + global.dview_mob = new + return ..() + // call to generate a stack trace and print to runtime logs /proc/crash_with(msg) CRASH(msg) diff --git a/code/_macros.dm b/code/_macros.dm index 463a7da26d9..a3e40655444 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -49,5 +49,38 @@ #define RANDOM_BLOOD_TYPE pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") #define to_chat(target, message) target << message +#define to_world(message) world << message +#define to_world_log(message) world.log << message +// TODO - Baystation has this log to crazy places. For now lets just world.log, but maybe look into it later. +#define log_world(message) world.log << message + #define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE) + +#define qdel_null_list(x) if(x) { for(var/y in x) { qdel(y) } ; x = null } + +#define qdel_null(x) if(x) { qdel(x) ; x = null } + +#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } + +// Helper macros to aid in optimizing lazy instantiation of lists. +// All of these are null-safe, you can use them without knowing if the list var is initialized yet + +//Picks from the list, with some safeties, and returns the "default" arg if it fails +#define DEFAULTPICK(L, default) ((istype(L, /list) && L:len) ? pick(L) : default) +// Ensures L is initailized after this point +#define LAZYINITLIST(L) if (!L) L = list() +// Sets a L back to null iff it is empty +#define UNSETEMPTY(L) if (L && !L.len) L = null +// Removes I from list L, and sets I to null if it is now empty +#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } } +// Adds I to L, initalizing I if necessary +#define LAZYADD(L, I) if(!L) { L = list(); } L += I; +// Reads I from L safely - Works with both associative and traditional lists. +#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null) +// Reads the length of L, returning 0 if null +#define LAZYLEN(L) length(L) +// Null-safe L.Cut() +#define LAZYCLEARLIST(L) if(L) L.Cut() +// Reads L or an empty list if L is not a list. Note: Does NOT assign, L may be an expression. +#define SANITIZE_LIST(L) ( islist(L) ? L : list() ) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 42a0574f4d8..65974fe009a 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -5,6 +5,16 @@ recieving object instead, so that's the default action. This allows you to drag almost anything into a trash can. */ + +/atom/proc/CanMouseDrop(atom/over, var/mob/user = usr) + if(!user || !over) + return FALSE + if(user.incapacitated()) + return FALSE + if(!src.Adjacent(user) || !over.Adjacent(user)) + return FALSE // should stop you from dragging through windows + return TRUE + /atom/MouseDrop(atom/over) if(!usr || !over) return if(!Adjacent(usr) || !over.Adjacent(usr)) return // should stop you from dragging through windows diff --git a/code/_onclick/hud/ability_screen_objects.dm b/code/_onclick/hud/ability_screen_objects.dm index 2081e011b35..d29ef9dd967 100644 --- a/code/_onclick/hud/ability_screen_objects.dm +++ b/code/_onclick/hud/ability_screen_objects.dm @@ -20,7 +20,7 @@ message_admins("ERROR: ability_master's New() was not given an owner argument. This is a bug.") /obj/screen/movable/ability_master/Destroy() - ..() + . = ..() //Get rid of the ability objects. remove_all_abilities() ability_objects.Cut() diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 9781e9c236d..7e03151fd66 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -30,6 +30,9 @@ /datum/action/Destroy() if(owner) Remove(owner) + target = null + qdel_null(button) + return ..() /datum/action/proc/Grant(mob/living/T) if(owner) @@ -45,7 +48,7 @@ if(button) if(T.client) T.client.screen -= button - del(button) + qdel_null(button) T.actions.Remove(src) T.update_action_buttons() owner = null diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 7a7d82d1754..6e1b8b2c379 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -169,7 +169,7 @@ datum/hud/New(mob/owner) ..() /datum/hud/Destroy() - ..() + . = ..() grab_intent = null hurt_intent = null disarm_intent = null diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index e55323fb3a2..35ef300978c 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -46,7 +46,7 @@ var/obj/item/owner /obj/screen/item_action/Destroy() - ..() + . = ..() owner = null /obj/screen/item_action/Click() diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm index a599381730a..e79db287132 100644 --- a/code/_onclick/hud/spell_screen_objects.dm +++ b/code/_onclick/hud/spell_screen_objects.dm @@ -13,7 +13,7 @@ var/mob/spell_holder /obj/screen/movable/spell_master/Destroy() - ..() + . = ..() for(var/obj/screen/spell/spells in spell_objects) spells.spellmaster = null spell_objects.Cut() @@ -156,7 +156,7 @@ var/icon/last_charged_icon /obj/screen/spell/Destroy() - ..() + . = ..() spell = null last_charged_icon = null if(spellmaster) diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index 323c5f76639..9f08241978d 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -35,7 +35,6 @@ * Config vars */ // Process name - var/name // Process schedule interval // This controls how often the process would run under ideal conditions. @@ -388,6 +387,6 @@ exceptions[eid] = 0 /datum/controller/process/proc/catchBadType(var/datum/caught) - if(isnull(caught) || !istype(caught) || !isnull(caught.gcDestroyed)) + if(isnull(caught) || !istype(caught) || QDELETED(caught)) return // Only bother with types we can identify and that don't belong catchException("Type [caught.type] does not belong in process' queue") diff --git a/code/controllers/Processes/garbage.dm b/code/controllers/Processes/garbage.dm deleted file mode 100644 index 02f04113320..00000000000 --- a/code/controllers/Processes/garbage.dm +++ /dev/null @@ -1,254 +0,0 @@ -// The time a datum was destroyed by the GC, or null if it hasn't been -/datum/var/gcDestroyed - -#define GC_COLLECTIONS_PER_RUN 300 -#define GC_COLLECTION_TIMEOUT (30 SECONDS) -#define GC_FORCE_DEL_PER_RUN 30 - -var/datum/controller/process/garbage_collector/garbage_collector -var/list/delayed_garbage = list() - -/datum/controller/process/garbage_collector - var/garbage_collect = 1 // Whether or not to actually do work - var/total_dels = 0 // number of total del()'s - var/tick_dels = 0 // number of del()'s we've done this tick - var/soft_dels = 0 - var/hard_dels = 0 // number of hard dels in total - var/list/destroyed = list() // list of refID's of things that should be garbage collected - // refID's are associated with the time at which they time out and need to be manually del() - // we do this so we aren't constantly locating them and preventing them from being gc'd - - var/list/logging = list() // list of all types that have failed to GC associated with the number of times that's happened. - // the types are stored as strings - -/datum/controller/process/garbage_collector/setup() - name = "garbage" - schedule_interval = 5 SECONDS - start_delay = 3 - - if(!garbage_collector) - garbage_collector = src - - for(var/garbage in delayed_garbage) - qdel(garbage) - delayed_garbage.Cut() - delayed_garbage = null - -#ifdef GC_FINDREF -world/loop_checks = 0 -#endif - -/datum/controller/process/garbage_collector/doWork() - if(!garbage_collect) - return - - tick_dels = 0 - var/time_to_kill = world.time - GC_COLLECTION_TIMEOUT - var/checkRemain = GC_COLLECTIONS_PER_RUN - var/remaining_force_dels = GC_FORCE_DEL_PER_RUN - - - while(destroyed.len && --checkRemain >= 0) - if(remaining_force_dels <= 0) - #ifdef GC_DEBUG - testing("GC: Reached max force dels per tick [dels] vs [maxDels]") - #endif - break // Server's already pretty pounded, everything else can wait 2 seconds - var/refID = destroyed[1] - var/GCd_at_time = destroyed[refID] - if(GCd_at_time > time_to_kill) - #ifdef GC_DEBUG - testing("GC: [refID] not old enough, breaking at [world.time] for [GCd_at_time - time_to_kill] deciseconds until [GCd_at_time + collection_timeout]") - #endif - break // Everything else is newer, skip them - var/datum/A = locate(refID) - #ifdef GC_DEBUG - testing("GC: [refID] old enough to test: GCd_at_time: [GCd_at_time] time_to_kill: [time_to_kill] current: [world.time]") - #endif - if(A && A.gcDestroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake - // Something's still referring to the qdel'd object. Kill it. - testing("GC: -- \ref[A] | [A.type] was unable to be GC'd and was deleted --") - logging["[A.type]"]++ - del(A) - - hard_dels++ - remaining_force_dels-- - else - #ifdef GC_DEBUG - testing("GC: [refID] properly GC'd at [world.time] with timeout [GCd_at_time]") - #endif - soft_dels++ - tick_dels++ - total_dels++ - destroyed.Cut(1, 2) - SCHECK - -#undef GC_FORCE_DEL_PER_TICK -#undef GC_COLLECTION_TIMEOUT -#undef GC_COLLECTIONS_PER_TICK - -#ifdef GC_FINDREF -/datum/controller/process/garbage_collector/proc/LookForRefs(var/datum/D, var/list/targ) - . = 0 - for(var/V in D.vars) - if(V == "contents") - continue - if(istype(D.vars[V], /atom)) - var/atom/A = D.vars[V] - if(A in targ) - testing("GC: [A] | [A.type] referenced by [D] | [D.type], var [V]") - . += 1 - else if(islist(D.vars[V])) - . += LookForListRefs(D.vars[V], targ, D, V) - -/datum/controller/process/garbage_collector/proc/LookForListRefs(var/list/L, var/list/targ, var/datum/D, var/V) - . = 0 - for(var/F in L) - if(istype(F, /atom)) - var/atom/A = F - if(A in targ) - testing("GC: [A] | [A.type] referenced by [D] | [D.type], list [V]") - . += 1 - if(islist(F)) - . += LookForListRefs(F, targ, D, "[F] in list [V]") -#endif - -/datum/controller/process/garbage_collector/proc/AddTrash(datum/A) - if(!istype(A) || !isnull(A.gcDestroyed)) - return - #ifdef GC_DEBUG - testing("GC: AddTrash(\ref[A] - [A.type])") - #endif - A.gcDestroyed = world.time - destroyed -= "\ref[A]" // Removing any previous references that were GC'd so that the current object will be at the end of the list. - destroyed["\ref[A]"] = world.time - -/datum/controller/process/garbage_collector/statProcess() - ..() - stat(null, "[garbage_collect ? "On" : "Off"], [destroyed.len] queued") - stat(null, "Dels: [total_dels], [soft_dels] soft, [hard_dels] hard, [tick_dels] last run") - - -// Tests if an atom has been deleted. -/proc/deleted(atom/A) - return !A || !isnull(A.gcDestroyed) - -// Should be treated as a replacement for the 'del' keyword. -// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. -/proc/qdel(var/datum/A) - if(!A) - return - if(!istype(A)) - warning("qdel() passed object of type [A.type]. qdel() can only handle /datum types.") - crash_with("qdel() passed object of type [A.type]. qdel() can only handle /datum types.") - del(A) - if(garbage_collector) - garbage_collector.total_dels++ - garbage_collector.hard_dels++ - else if(isnull(A.gcDestroyed)) - // Let our friend know they're about to get collected - . = !A.Destroy() - if(. && A) - A.finalize_qdel() - -/datum/proc/finalize_qdel() - del(src) - -/atom/finalize_qdel() - if(garbage_collector) - garbage_collector.AddTrash(src) - else - delayed_garbage |= src - -/icon/finalize_qdel() - del(src) - -/image/finalize_qdel() - del(src) - -/mob/finalize_qdel() - del(src) - -/turf/finalize_qdel() - del(src) - -// Default implementation of clean-up code. -// This should be overridden to remove all references pointing to the object being destroyed. -// Return true if the the GC controller should allow the object to continue existing. -/datum/proc/Destroy() - nanomanager.close_uis(src) - tag = null - return - -#ifdef TESTING -/client/var/running_find_references - -/mob/verb/create_thing() - set category = "Debug" - set name = "Create Thing" - - var/path = input("Enter path") - var/atom/thing = new path(loc) - thing.find_references() - -/atom/verb/find_references() - set category = "Debug" - set name = "Find References" - set background = 1 - set src in world - - if(!usr || !usr.client) - return - - if(usr.client.running_find_references) - testing("CANCELLED search for references to a [usr.client.running_find_references].") - usr.client.running_find_references = null - return - - if(alert("Running this will create a lot of lag until it finishes. You can cancel it by running it again. Would you like to begin the search?", "Find References", "Yes", "No") == "No") - return - - // Remove this object from the list of things to be auto-deleted. - if(garbage_collector) - garbage_collector.destroyed -= "\ref[src]" - - usr.client.running_find_references = type - testing("Beginning search for references to a [type].") - var/list/things = list() - for(var/client/thing) - things += thing - for(var/datum/thing) - things += thing - for(var/atom/thing) - things += thing - testing("Collected list of things in search for references to a [type]. ([things.len] Thing\s)") - for(var/datum/thing in things) - if(!usr.client.running_find_references) return - for(var/varname in thing.vars) - var/variable = thing.vars[varname] - if(variable == src) - testing("Found [src.type] \ref[src] in [thing.type]'s [varname] var.") - else if(islist(variable)) - if(src in variable) - testing("Found [src.type] \ref[src] in [thing.type]'s [varname] list var.") - testing("Completed search for references to a [type].") - usr.client.running_find_references = null - -/client/verb/purge_all_destroyed_objects() - set category = "Debug" - if(garbage_collector) - while(garbage_collector.destroyed.len) - var/datum/o = locate(garbage_collector.destroyed[1]) - if(istype(o) && o.gcDestroyed) - del(o) - garbage_collector.dels++ - garbage_collector.destroyed.Cut(1, 2) -#endif - -#ifdef GC_DEBUG -#undef GC_DEBUG -#endif - -#ifdef GC_FINDREF -#undef GC_FINDREF -#endif \ No newline at end of file diff --git a/code/controllers/Processes/lighting.dm b/code/controllers/Processes/lighting.dm deleted file mode 100644 index d46cab1d19f..00000000000 --- a/code/controllers/Processes/lighting.dm +++ /dev/null @@ -1,98 +0,0 @@ -/var/lighting_overlays_initialised = FALSE - -/var/list/lighting_update_lights = list() // List of lighting sources queued for update. -/var/list/lighting_update_corners = list() // List of lighting corners queued for update. -/var/list/lighting_update_overlays = list() // List of lighting overlays queued for update. - -/var/list/lighting_update_lights_old = list() // List of lighting sources currently being updated. -/var/list/lighting_update_corners_old = list() // List of lighting corners currently being updated. -/var/list/lighting_update_overlays_old = list() // List of lighting overlays currently being updated. - - -/datum/controller/process/lighting - // Queues of update counts, waiting to be rolled into stats lists - var/list/stats_queues = list( - "Source" = list(), "Corner" = list(), "Overlay" = list()) - // Stats lists - var/list/stats_lists = list( - "Source" = list(), "Corner" = list(), "Overlay" = list()) - var/update_stats_every = (1 SECONDS) - var/next_stats_update = 0 - var/stat_updates_to_keep = 5 - -/datum/controller/process/lighting/setup() - name = "lighting" - - schedule_interval = 0 // run as fast as you possibly can - sleep_interval = 10 // Yield every 10% of a tick - defer_usage = 80 // Defer at 80% of a tick - create_all_lighting_overlays() - lighting_overlays_initialised = TRUE - - // Pre-process lighting once before the round starts. Wait 30 seconds so the away mission has time to load. - spawn(300) - doWork(1) - -/datum/controller/process/lighting/doWork(roundstart) - - lighting_update_lights_old = lighting_update_lights //We use a different list so any additions to the update lists during a delay from scheck() don't cause things to be cut from the list without being updated. - lighting_update_lights = list() - for(var/datum/light_source/L in lighting_update_lights_old) - - if(L.check() || L.destroyed || L.force_update) - L.remove_lum() - if(!L.destroyed) - L.apply_lum() - - else if(L.vis_update) //We smartly update only tiles that became (in) visible to use. - L.smart_vis_update() - - L.vis_update = FALSE - L.force_update = FALSE - L.needs_update = FALSE - - SCHECK - - lighting_update_corners_old = lighting_update_corners //Same as above. - lighting_update_corners = list() - for(var/A in lighting_update_corners_old) - var/datum/lighting_corner/C = A - - C.update_overlays() - - C.needs_update = FALSE - - SCHECK - - lighting_update_overlays_old = lighting_update_overlays //Same as above. - lighting_update_overlays = list() - - for(var/A in lighting_update_overlays_old) - var/atom/movable/lighting_overlay/O = A - O.update_overlay() - O.needs_update = 0 - SCHECK - - stats_queues["Source"] += lighting_update_lights_old.len - stats_queues["Corner"] += lighting_update_corners_old.len - stats_queues["Overlay"] += lighting_update_overlays_old.len - - if(next_stats_update <= world.time) - next_stats_update = world.time + update_stats_every - for(var/stat_name in stats_queues) - var/stat_sum = 0 - var/list/stats_queue = stats_queues[stat_name] - for(var/count in stats_queue) - stat_sum += count - stats_queue.Cut() - - var/list/stats_list = stats_lists[stat_name] - stats_list.Insert(1, stat_sum) - if(stats_list.len > stat_updates_to_keep) - stats_list.Cut(stats_list.len) - -/datum/controller/process/lighting/statProcess() - ..() - stat(null, "[total_lighting_sources] sources, [total_lighting_corners] corners, [total_lighting_overlays] overlays") - for(var/stat_type in stats_lists) - stat(null, "[stat_type] updates: [jointext(stats_lists[stat_type], " | ")]") diff --git a/code/controllers/Processes/machinery.dm b/code/controllers/Processes/machinery.dm index 405615dc1fe..1fd1f8ce456 100644 --- a/code/controllers/Processes/machinery.dm +++ b/code/controllers/Processes/machinery.dm @@ -20,7 +20,7 @@ /datum/controller/process/machinery/proc/internal_process_machinery() for(last_object in machines) var/obj/machinery/M = last_object - if(M && !M.gcDestroyed) + if(M && !QDELETED(M)) if(M.process() == PROCESS_KILL) //M.inMachineList = 0 We don't use this debugging function machines.Remove(M) @@ -34,7 +34,7 @@ /datum/controller/process/machinery/proc/internal_process_power() for(last_object in powernets) var/datum/powernet/powerNetwork = last_object - if(istype(powerNetwork) && isnull(powerNetwork.gcDestroyed)) + if(istype(powerNetwork) && !QDELETED(powerNetwork)) powerNetwork.reset() SCHECK continue @@ -52,7 +52,7 @@ /datum/controller/process/machinery/proc/internal_process_pipenets() for(last_object in pipe_networks) var/datum/pipe_network/pipeNetwork = last_object - if(istype(pipeNetwork) && isnull(pipeNetwork.gcDestroyed)) + if(istype(pipeNetwork) && !QDELETED(pipeNetwork)) pipeNetwork.process() SCHECK continue diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm deleted file mode 100644 index 8681803ac44..00000000000 --- a/code/controllers/Processes/mob.dm +++ /dev/null @@ -1,29 +0,0 @@ -/datum/controller/process/mob - var/tmp/datum/updateQueue/updateQueueInstance - -/datum/controller/process/mob/setup() - name = "mob" - schedule_interval = 20 // every 2 seconds - start_delay = 16 - -/datum/controller/process/mob/started() - ..() - if(!mob_list) - mob_list = list() - -/datum/controller/process/mob/doWork() - for(last_object in mob_list) - var/mob/M = last_object - if(M && isnull(M.gcDestroyed)) - try - M.Life() - catch(var/exception/e) - catchException(e, M) - SCHECK - else - catchBadType(M) - mob_list -= M - -/datum/controller/process/mob/statProcess() - ..() - stat(null, "[mob_list.len] mobs") \ No newline at end of file diff --git a/code/controllers/Processes/nanoui.dm b/code/controllers/Processes/nanoui.dm index 49b9048c078..21d2f8e5f01 100644 --- a/code/controllers/Processes/nanoui.dm +++ b/code/controllers/Processes/nanoui.dm @@ -9,7 +9,7 @@ /datum/controller/process/nanoui/doWork() for(last_object in nanomanager.processing_uis) var/datum/nanoui/NUI = last_object - if(istype(NUI) && isnull(NUI.gcDestroyed)) + if(istype(NUI) && !QDELETED(NUI)) try NUI.process() catch(var/exception/e) diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm index 1010c8cc977..6032cbb5412 100644 --- a/code/controllers/Processes/obj.dm +++ b/code/controllers/Processes/obj.dm @@ -11,7 +11,7 @@ /datum/controller/process/obj/doWork() for(last_object in processing_objects) var/datum/O = last_object - if(O && isnull(O.gcDestroyed)) + if(!QDELETED(O)) try O:process() catch(var/exception/e) diff --git a/code/controllers/Processes/radiation.dm b/code/controllers/Processes/radiation.dm new file mode 100644 index 00000000000..71d9c60233e --- /dev/null +++ b/code/controllers/Processes/radiation.dm @@ -0,0 +1,56 @@ +/datum/controller/process/radiation + var/repository/radiation/linked = null + +/datum/controller/process/radiation/setup() + name = "radiation controller" + schedule_interval = 20 // every 2 seconds + linked = radiation_repository + +/datum/controller/process/radiation/doWork() + sources_decay() + cache_expires() + irradiate_targets() + +// Step 1 - Sources Decay +/datum/controller/process/radiation/proc/sources_decay() + var/list/sources = linked.sources + for(var/thing in sources) + var/datum/radiation_source/S = thing + if(QDELETED(S)) + sources.Remove(S) + continue + if(S.decay) + S.update_rad_power(S.rad_power - config.radiation_decay_rate) + if(S.rad_power <= config.radiation_lower_limit) + sources.Remove(S) + SCHECK // This scheck probably just wastes resources, but better safe than sorry in this case. + +// Step 2 - Cache Expires +/datum/controller/process/radiation/proc/cache_expires() + var/list/resistance_cache = linked.resistance_cache + for(var/thing in resistance_cache) + var/turf/T = thing + if(QDELETED(T)) + resistance_cache.Remove(T) + continue + if((length(T.contents) + 1) != resistance_cache[T]) + resistance_cache.Remove(T) // If its stale REMOVE it! It will get added if its needed. + SCHECK + +// Step 3 - Registered irradiatable things are checked for radiation +/datum/controller/process/radiation/proc/irradiate_targets() + var/list/registered_listeners = living_mob_list // For now just use this. Nothing else is interested anyway. + if(length(linked.sources) > 0) + for(var/thing in registered_listeners) + var/atom/A = thing + if(QDELETED(A)) + continue + var/turf/T = get_turf(thing) + var/rads = linked.get_rads_at_turf(T) + if(rads) + A.rad_act(rads) + SCHECK + +/datum/controller/process/radiation/statProcess() + ..() + stat(null, "[linked.sources.len] sources, [linked.resistance_cache.len] cached turfs") diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm index 276249bd558..6031f2f4fe9 100644 --- a/code/controllers/Processes/scheduler.dm +++ b/code/controllers/Processes/scheduler.dm @@ -30,8 +30,8 @@ // Note: We won't be informed about tasks being destroyed, but this is the best we can do. /datum/controller/process/scheduler/copyStateFrom(var/datum/controller/process/scheduler/target) scheduled_tasks = list() - for(var/st in target.scheduled_tasks) - if(!deleted(st) && istype(st, /datum/scheduled_task)) + for(var/datum/scheduled_task/st in target.scheduled_tasks) + if(!QDELETED(st) && istype(st)) schedule(st) scheduler = src @@ -46,12 +46,9 @@ /datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st) scheduled_tasks += st - destroyed_event.register(st, src, /datum/controller/process/scheduler/proc/unschedule) /datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st) - if(st in scheduled_tasks) - scheduled_tasks -= st - destroyed_event.unregister(st, src) + scheduled_tasks -= st /********** * Helpers * @@ -102,6 +99,7 @@ task_after_process_args += src /datum/scheduled_task/Destroy() + scheduler.unschedule(src) procedure = null arguments.Cut() task_after_process = null diff --git a/code/controllers/Processes/ticker.dm b/code/controllers/Processes/ticker.dm index b7c45ba91a4..a70bb74c5ff 100644 --- a/code/controllers/Processes/ticker.dm +++ b/code/controllers/Processes/ticker.dm @@ -33,3 +33,10 @@ var/global/datum/controller/process/ticker/tickerProcess /datum/controller/process/ticker/proc/getLastTickerTimeDuration() return lastTickerTimeDuration + +// Use these preferentially to directly examining ticker.current_state to help prepare for transition to ticker as subsystem! +/datum/controller/process/ticker/proc/HasRoundStarted() + return (ticker && ticker.current_state >= GAME_STATE_PLAYING) + +/datum/controller/process/ticker/proc/IsRoundInProgress() + return (ticker && ticker.current_state == GAME_STATE_PLAYING) diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm index 796fb0b6649..332ab9af527 100644 --- a/code/controllers/communications.dm +++ b/code/controllers/communications.dm @@ -314,7 +314,6 @@ var/global/datum/controller/radio/radio_controller devices_line -= null if (devices_line.len==0) devices -= devices_filter - del(devices_line) /datum/signal var/obj/source diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index b03d3bc902d..d7091bfb946 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -46,7 +46,8 @@ var/list/gamemode_cache = list() var/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. var/allow_Metadata = 0 // Metadata is supported. var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. - var/Ticklag = 0.9 + var/fps = 20 + var/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling var/Tickcomp = 0 var/socket_talk = 0 // use socket_talk to communicate with other processes var/list/resource_urls = null @@ -220,6 +221,10 @@ var/list/gamemode_cache = list() var/show_human_death_message = 1 + var/radiation_decay_rate = 1 //How much radiation is reduced by each tick + var/radiation_resistance_multiplier = 8.5 //VOREstation edit + var/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. + /datum/configuration/New() var/list/L = typesof(/datum/game_mode) - /datum/game_mode for (var/T in L) @@ -568,7 +573,12 @@ var/list/gamemode_cache = list() irc_bot_export = 1 if("ticklag") - Ticklag = text2num(value) + var/ticklag = text2num(value) + if(ticklag > 0) + fps = 10 / ticklag + + if("tick_limit_mc_init") + tick_limit_mc_init = text2num(value) if("allow_antag_hud") config.antag_hud_allowed = 1 @@ -720,6 +730,9 @@ var/list/gamemode_cache = list() if(values.len > 0) language_prefixes = values + if("radiation_lower_limit") + radiation_lower_limit = text2num(value) + else log_misc("Unknown setting in configuration: '[name]'") diff --git a/code/controllers/controller.dm b/code/controllers/controller.dm new file mode 100644 index 00000000000..c9d5f1e5650 --- /dev/null +++ b/code/controllers/controller.dm @@ -0,0 +1,19 @@ +/datum/controller + var/name + // The object used for the clickable stat() button. + var/obj/effect/statclick/statclick + +/datum/controller/proc/Initialize() + +//cleanup actions +/datum/controller/proc/Shutdown() + +//when we enter dmm_suite.load_map +/datum/controller/proc/StartLoadingMap() + +//when we exit dmm_suite.load_map +/datum/controller/proc/StopLoadingMap() + +/datum/controller/proc/Recover() + +/datum/controller/proc/stat_entry() diff --git a/code/controllers/emergency_shuttle_controller.dm b/code/controllers/emergency_shuttle_controller.dm index 5b1b6a60d15..7fb3a56c61f 100644 --- a/code/controllers/emergency_shuttle_controller.dm +++ b/code/controllers/emergency_shuttle_controller.dm @@ -22,6 +22,10 @@ var/global/datum/emergency_shuttle_controller/emergency_shuttle var/datum/announcement/priority/emergency_shuttle_called = new(0, new_sound = sound('sound/AI/shuttlecalled.ogg')) var/datum/announcement/priority/emergency_shuttle_recalled = new(0, new_sound = sound('sound/AI/shuttlerecalled.ogg')) +/datum/emergency_shuttle_controller/New() + escape_pods = list() + ..() + /datum/emergency_shuttle_controller/proc/process() if (wait_for_launch) if (evac && auto_recall && world.time >= auto_recall_time) diff --git a/code/controllers/failsafe.dm b/code/controllers/failsafe.dm new file mode 100644 index 00000000000..0589d5fa7ff --- /dev/null +++ b/code/controllers/failsafe.dm @@ -0,0 +1,102 @@ + /** + * Failsafe + * + * Pretty much pokes the MC to make sure it's still alive. + **/ + +var/datum/controller/failsafe/Failsafe + +/datum/controller/failsafe // This thing pretty much just keeps poking the master controller + name = "Failsafe" + + // The length of time to check on the MC (in deciseconds). + // Set to 0 to disable. + var/processing_interval = 20 + // The alert level. For every failed poke, we drop a DEFCON level. Once we hit DEFCON 1, restart the MC. + var/defcon = 5 + //the world.time of the last check, so the mc can restart US if we hang. + // (Real friends look out for *eachother*) + var/lasttick = 0 + + // Track the MC iteration to make sure its still on track. + var/master_iteration = 0 + var/running = TRUE + +/datum/controller/failsafe/New() + // Highlander-style: there can only be one! Kill off the old and replace it with the new. + if(Failsafe != src) + if(istype(Failsafe)) + qdel(Failsafe) + Failsafe = src + Initialize() + +/datum/controller/failsafe/Initialize() + set waitfor = 0 + Failsafe.Loop() + if(!QDELETED(src)) + qdel(src) //when Loop() returns, we delete ourselves and let the mc recreate us + +/datum/controller/failsafe/Destroy() + running = FALSE + ..() + return QDEL_HINT_HARDDEL_NOW + +/datum/controller/failsafe/proc/Loop() + while(running) + lasttick = world.time + if(!Master) + // Replace the missing Master! This should never, ever happen. + new /datum/controller/master() + // Only poke it if overrides are not in effect. + if(processing_interval > 0) + if(Master.processing && Master.iteration) + // Check if processing is done yet. + if(Master.iteration == master_iteration) + switch(defcon) + if(4,5) + --defcon + if(3) + to_chat(admins, "Notice: DEFCON [defcon_pretty()]. The Master Controller has not fired in the last [(5-defcon) * processing_interval] ticks.") + --defcon + if(2) + to_chat(admins, "Warning: DEFCON [defcon_pretty()]. The Master Controller has not fired in the last [(5-defcon) * processing_interval] ticks. Automatic restart in [processing_interval] ticks.") + --defcon + if(1) + + to_chat(admins, "Warning: DEFCON [defcon_pretty()]. The Master Controller has still not fired within the last [(5-defcon) * processing_interval] ticks. Killing and restarting...") + --defcon + var/rtn = Recreate_MC() + if(rtn > 0) + defcon = 4 + master_iteration = 0 + to_chat(admins, "MC restarted successfully") + else if(rtn < 0) + log_game("FailSafe: Could not restart MC, runtime encountered. Entering defcon 0") + to_chat(admins, "ERROR: DEFCON [defcon_pretty()]. Could not restart MC, runtime encountered. I will silently keep retrying.") + //if the return number was 0, it just means the mc was restarted too recently, and it just needs some time before we try again + //no need to handle that specially when defcon 0 can handle it + if(0) //DEFCON 0! (mc failed to restart) + var/rtn = Recreate_MC() + if(rtn > 0) + defcon = 4 + master_iteration = 0 + to_chat(admins, "MC restarted successfully") + else + defcon = min(defcon + 1,5) + master_iteration = Master.iteration + if (defcon <= 1) + sleep(processing_interval*2) + else + sleep(processing_interval) + else + defcon = 5 + sleep(initial(processing_interval)) + +/datum/controller/failsafe/proc/defcon_pretty() + return defcon + +/datum/controller/failsafe/stat_entry() + if(!statclick) + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) + + stat("Failsafe Controller:", statclick.update("Defcon: [defcon_pretty()] (Interval: [Failsafe.processing_interval] | Iteration: [Failsafe.master_iteration])")) diff --git a/code/controllers/master.dm b/code/controllers/master.dm new file mode 100644 index 00000000000..7c2bc86a651 --- /dev/null +++ b/code/controllers/master.dm @@ -0,0 +1,556 @@ + /** + * StonedMC + * + * Designed to properly split up a given tick among subsystems + * Note: if you read parts of this code and think "why is it doing it that way" + * Odds are, there is a reason + * + **/ +var/datum/controller/master/Master = new() + +/datum/controller/master + name = "Master" + + // Are we processing (higher values increase the processing delay by n ticks) + var/processing = 1 + // How many times have we ran + var/iteration = 0 + + // world.time of last fire, for tracking lag outside of the mc + var/last_run + + // List of subsystems to process(). + var/list/subsystems + + // Vars for keeping track of tick drift. + var/init_timeofday + var/init_time + var/tickdrift = 0 + + var/sleep_delta + + var/make_runtime = 0 + + var/initializations_finished_with_no_players_logged_in //I wonder what this could be? + + // The type of the last subsystem to be process()'d. + var/last_type_processed + + var/datum/controller/subsystem/queue_head //Start of queue linked list + var/datum/controller/subsystem/queue_tail //End of queue linked list (used for appending to the list) + var/queue_priority_count = 0 //Running total so that we don't have to loop thru the queue each run to split up the tick + var/queue_priority_count_bg = 0 //Same, but for background subsystems + var/map_loading = FALSE //Are we loading in a new map? + + var/current_runlevel //for scheduling different subsystems for different stages of the round + + var/static/restart_clear = 0 + var/static/restart_timeout = 0 + var/static/restart_count = 0 + + //current tick limit, assigned before running a subsystem. + //used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits + var/static/current_ticklimit = TICK_LIMIT_RUNNING + +/datum/controller/master/New() + // Highlander-style: there can only be one! Kill off the old and replace it with the new. + subsystems = list() + if (Master != src) + if (istype(Master)) + Recover() + qdel(Master) + else + init_subtypes(/datum/controller/subsystem, subsystems) + Master = src + +/datum/controller/master/Destroy() + ..() + // Tell qdel() to Del() this object. + return QDEL_HINT_HARDDEL_NOW + +/datum/controller/master/Shutdown() + processing = FALSE + sortTim(subsystems, /proc/cmp_subsystem_init) + reverseRange(subsystems) + for(var/datum/controller/subsystem/ss in subsystems) + ss.Shutdown() + +// Returns 1 if we created a new mc, 0 if we couldn't due to a recent restart, +// -1 if we encountered a runtime trying to recreate it +/proc/Recreate_MC() + . = -1 //so if we runtime, things know we failed + if (world.time < Master.restart_timeout) + return 0 + if (world.time < Master.restart_clear) + Master.restart_count *= 0.5 + + var/delay = 50 * ++Master.restart_count + Master.restart_timeout = world.time + delay + Master.restart_clear = world.time + (delay * 2) + Master.processing = 0 //stop ticking this one + try + new/datum/controller/master() + catch + return -1 + return 1 + + +/datum/controller/master/Recover() + var/msg = "## DEBUG: [time2text(world.timeofday)] MC restarted. Reports:\n" + for (var/varname in Master.vars) + switch (varname) + if("name", "tag", "bestF", "type", "parent_type", "vars", "statclick") // Built-in junk. + continue + else + var/varval = Master.vars[varname] + if (istype(varval, /datum)) // Check if it has a type var. + var/datum/D = varval + msg += "\t [varname] = [D]([D.type])\n" + else + msg += "\t [varname] = [varval]\n" + log_world(msg) + + var/datum/controller/subsystem/BadBoy = Master.last_type_processed + var/FireHim = FALSE + if(istype(BadBoy)) + msg = null + switch(++BadBoy.failure_strikes) + if(2) + msg = "The [BadBoy.name] subsystem was the last to fire for 2 controller restarts. It will be recovered now and disabled if it happens again." + FireHim = TRUE + if(3) + msg = "The [BadBoy.name] subsystem seems to be destabilizing the MC and will be offlined." + BadBoy.flags |= SS_NO_FIRE + if(msg) + log_game(msg) + message_admins("[msg]") + log_world(msg) + + if (istype(Master.subsystems)) + if(FireHim) + Master.subsystems += new BadBoy.type //NEW_SS_GLOBAL will remove the old one + subsystems = Master.subsystems + current_runlevel = Master.current_runlevel + StartProcessing(10) + else + to_chat(world, "The Master Controller is having some issues, we will need to re-initialize EVERYTHING") + Initialize(20, TRUE) + + +// Please don't stuff random bullshit here, +// Make a subsystem, give it the SS_NO_FIRE flag, and do your work in it's Initialize() +/datum/controller/master/Initialize(delay, init_sss) + set waitfor = 0 + + if(delay) + sleep(delay) + + if(init_sss) + init_subtypes(/datum/controller/subsystem, subsystems) + + to_chat(world, "Initializing subsystems...") + + // Sort subsystems by init_order, so they initialize in the correct order. + sortTim(subsystems, /proc/cmp_subsystem_init) + + var/start_timeofday = REALTIMEOFDAY + // Initialize subsystems. + current_ticklimit = config.tick_limit_mc_init + for (var/datum/controller/subsystem/SS in subsystems) + if (SS.flags & SS_NO_INIT) + continue + SS.Initialize(REALTIMEOFDAY) + CHECK_TICK + current_ticklimit = TICK_LIMIT_RUNNING + var/time = (REALTIMEOFDAY - start_timeofday) / 10 + + var/msg = "Initializations complete within [time] second[time == 1 ? "" : "s"]!" + to_chat(world, "[msg]") + log_world(msg) + + if (!current_runlevel) + SetRunLevel(RUNLEVEL_LOBBY) + + // Sort subsystems by display setting for easy access. + sortTim(subsystems, /proc/cmp_subsystem_display) + // Set world options. + #ifdef UNIT_TEST + world.sleep_offline = 0 + #else + world.sleep_offline = 1 + #endif + world.fps = config.fps + var/initialized_tod = REALTIMEOFDAY + sleep(1) + initializations_finished_with_no_players_logged_in = initialized_tod < REALTIMEOFDAY - 10 + // Loop. + Master.StartProcessing(0) + +/datum/controller/master/proc/SetRunLevel(new_runlevel) + var/old_runlevel = isnull(current_runlevel) ? "NULL" : runlevel_flags[current_runlevel] + testing("MC: Runlevel changed from [old_runlevel] to [new_runlevel]") + current_runlevel = RUNLEVEL_FLAG_TO_INDEX(new_runlevel) + if(current_runlevel < 1) + CRASH("Attempted to set invalid runlevel: [new_runlevel]") + +// Starts the mc, and sticks around to restart it if the loop ever ends. +/datum/controller/master/proc/StartProcessing(delay) + set waitfor = 0 + if(delay) + sleep(delay) + var/rtn = Loop() + if (rtn > 0 || processing < 0) + return //this was suppose to happen. + //loop ended, restart the mc + log_game("MC crashed or runtimed, restarting") + message_admins("MC crashed or runtimed, restarting") + var/rtn2 = Recreate_MC() + if (rtn2 <= 0) + log_game("Failed to recreate MC (Error code: [rtn2]), it's up to the failsafe now") + message_admins("Failed to recreate MC (Error code: [rtn2]), it's up to the failsafe now") + Failsafe.defcon = 2 + +// Main loop. +/datum/controller/master/proc/Loop() + . = -1 + //Prep the loop (most of this is because we want MC restarts to reset as much state as we can, and because + // local vars rock + + //all this shit is here so that flag edits can be refreshed by restarting the MC. (and for speed) + var/list/tickersubsystems = list() + var/list/runlevel_sorted_subsystems = list(list()) //ensure we always have at least one runlevel + var/timer = world.time + for (var/thing in subsystems) + var/datum/controller/subsystem/SS = thing + if (SS.flags & SS_NO_FIRE) + continue + SS.queued_time = 0 + SS.queue_next = null + SS.queue_prev = null + SS.state = SS_IDLE + if (SS.flags & SS_TICKER) + tickersubsystems += SS + timer += world.tick_lag * rand(1, 5) + SS.next_fire = timer + continue + + var/ss_runlevels = SS.runlevels + var/added_to_any = FALSE + for(var/I in 1 to global.runlevel_flags.len) + if(ss_runlevels & global.runlevel_flags[I]) + while(runlevel_sorted_subsystems.len < I) + runlevel_sorted_subsystems += list(list()) + runlevel_sorted_subsystems[I] += SS + added_to_any = TRUE + if(!added_to_any) + WARNING("[SS.name] subsystem is not SS_NO_FIRE but also does not have any runlevels set!") + + queue_head = null + queue_tail = null + //these sort by lower priorities first to reduce the number of loops needed to add subsequent SS's to the queue + //(higher subsystems will be sooner in the queue, adding them later in the loop means we don't have to loop thru them next queue add) + sortTim(tickersubsystems, /proc/cmp_subsystem_priority) + for(var/I in runlevel_sorted_subsystems) + sortTim(runlevel_sorted_subsystems, /proc/cmp_subsystem_priority) + I += tickersubsystems + + var/cached_runlevel = current_runlevel + var/list/current_runlevel_subsystems = runlevel_sorted_subsystems[cached_runlevel] + + init_timeofday = REALTIMEOFDAY + init_time = world.time + + iteration = 1 + var/error_level = 0 + var/sleep_delta = 0 + var/list/subsystems_to_check + //the actual loop. + while (1) + tickdrift = max(0, MC_AVERAGE_FAST(tickdrift, (((REALTIMEOFDAY - init_timeofday) - (world.time - init_time)) / world.tick_lag))) + if (processing <= 0) + current_ticklimit = TICK_LIMIT_RUNNING + sleep(10) + continue + + //if there are mutiple sleeping procs running before us hogging the cpu, we have to run later + // because sleeps are processed in the order received, so longer sleeps are more likely to run first + if (world.tick_usage > TICK_LIMIT_MC) + sleep_delta += 2 + current_ticklimit = TICK_LIMIT_RUNNING * 0.5 + sleep(world.tick_lag * (processing + sleep_delta)) + continue + + sleep_delta = MC_AVERAGE_FAST(sleep_delta, 0) + if (last_run + (world.tick_lag * processing) > world.time) + sleep_delta += 1 + if (world.tick_usage > (TICK_LIMIT_MC*0.5)) + sleep_delta += 1 + + if (make_runtime) + var/datum/controller/subsystem/SS + SS.can_fire = 0 + if (!Failsafe || (Failsafe.processing_interval > 0 && (Failsafe.lasttick+(Failsafe.processing_interval*5)) < world.time)) + new/datum/controller/failsafe() // (re)Start the failsafe. + if (!queue_head || !(iteration % 3)) + var/checking_runlevel = current_runlevel + if(cached_runlevel != checking_runlevel) + //resechedule subsystems + cached_runlevel = checking_runlevel + current_runlevel_subsystems = runlevel_sorted_subsystems[cached_runlevel] + var/stagger = world.time + for(var/I in current_runlevel_subsystems) + var/datum/controller/subsystem/SS = I + if(SS.next_fire <= world.time) + stagger += world.tick_lag * rand(1, 5) + SS.next_fire = stagger + + subsystems_to_check = current_runlevel_subsystems + else + subsystems_to_check = tickersubsystems + if (CheckQueue(subsystems_to_check) <= 0) + if (!SoftReset(tickersubsystems, runlevel_sorted_subsystems)) + log_world("MC: SoftReset() failed, crashing") + return + if (!error_level) + iteration++ + error_level++ + current_ticklimit = TICK_LIMIT_RUNNING + sleep(10) + continue + + if (queue_head) + if (RunQueue() <= 0) + if (!SoftReset(tickersubsystems, runlevel_sorted_subsystems)) + log_world("MC: SoftReset() failed, crashing") + return + if (!error_level) + iteration++ + error_level++ + current_ticklimit = TICK_LIMIT_RUNNING + sleep(10) + continue + error_level-- + if (!queue_head) //reset the counts if the queue is empty, in the off chance they get out of sync + queue_priority_count = 0 + queue_priority_count_bg = 0 + + iteration++ + last_run = world.time + src.sleep_delta = MC_AVERAGE_FAST(src.sleep_delta, sleep_delta) + current_ticklimit = TICK_LIMIT_RUNNING - (TICK_LIMIT_RUNNING * 0.25) //reserve the tail 1/4 of the next tick for the mc. + sleep(world.tick_lag * (processing + sleep_delta)) + + + + +// This is what decides if something should run. +/datum/controller/master/proc/CheckQueue(list/subsystemstocheck) + . = 0 //so the mc knows if we runtimed + + //we create our variables outside of the loops to save on overhead + var/datum/controller/subsystem/SS + var/SS_flags + + for (var/thing in subsystemstocheck) + if (!thing) + subsystemstocheck -= thing + SS = thing + if (SS.state != SS_IDLE) + continue + if (SS.can_fire <= 0) + continue + if (SS.next_fire > world.time) + continue + SS_flags = SS.flags + if (SS_flags & SS_NO_FIRE) + subsystemstocheck -= SS + continue + if (!(SS_flags & SS_TICKER) && (SS_flags & SS_KEEP_TIMING) && SS.last_fire + (SS.wait * 0.75) > world.time) + continue + SS.enqueue() + . = 1 + + +// Run thru the queue of subsystems to run, running them while balancing out their allocated tick precentage +/datum/controller/master/proc/RunQueue() + . = 0 + var/datum/controller/subsystem/queue_node + var/queue_node_flags + var/queue_node_priority + var/queue_node_paused + + var/current_tick_budget + var/tick_precentage + var/tick_remaining + var/ran = TRUE //this is right + var/ran_non_ticker = FALSE + var/bg_calc //have we swtiched current_tick_budget to background mode yet? + var/tick_usage + + //keep running while we have stuff to run and we haven't gone over a tick + // this is so subsystems paused eariler can use tick time that later subsystems never used + while (ran && queue_head && world.tick_usage < TICK_LIMIT_MC) + ran = FALSE + bg_calc = FALSE + current_tick_budget = queue_priority_count + queue_node = queue_head + while (queue_node) + if (ran && world.tick_usage > TICK_LIMIT_RUNNING) + break + + queue_node_flags = queue_node.flags + queue_node_priority = queue_node.queued_priority + + //super special case, subsystems where we can't make them pause mid way through + //if we can't run them this tick (without going over a tick) + //we bump up their priority and attempt to run them next tick + //(unless we haven't even ran anything this tick, since its unlikely they will ever be able run + // in those cases, so we just let them run) + if (queue_node_flags & SS_NO_TICK_CHECK) + if (queue_node.tick_usage > TICK_LIMIT_RUNNING - world.tick_usage && ran_non_ticker) + queue_node.queued_priority += queue_priority_count * 0.10 + queue_priority_count -= queue_node_priority + queue_priority_count += queue_node.queued_priority + current_tick_budget -= queue_node_priority + queue_node = queue_node.queue_next + continue + + if ((queue_node_flags & SS_BACKGROUND) && !bg_calc) + current_tick_budget = queue_priority_count_bg + bg_calc = TRUE + + tick_remaining = TICK_LIMIT_RUNNING - world.tick_usage + + if (current_tick_budget > 0 && queue_node_priority > 0) + tick_precentage = tick_remaining / (current_tick_budget / queue_node_priority) + else + tick_precentage = tick_remaining + + current_ticklimit = world.tick_usage + tick_precentage + + if (!(queue_node_flags & SS_TICKER)) + ran_non_ticker = TRUE + ran = TRUE + tick_usage = world.tick_usage + queue_node_paused = (queue_node.state == SS_PAUSED || queue_node.state == SS_PAUSING) + last_type_processed = queue_node + + queue_node.state = SS_RUNNING + + var/state = queue_node.ignite(queue_node_paused) + if (state == SS_RUNNING) + state = SS_IDLE + current_tick_budget -= queue_node_priority + tick_usage = world.tick_usage - tick_usage + + if (tick_usage < 0) + tick_usage = 0 + + queue_node.state = state + + if (state == SS_PAUSED) + queue_node.paused_ticks++ + queue_node.paused_tick_usage += tick_usage + queue_node = queue_node.queue_next + continue + + queue_node.ticks = MC_AVERAGE(queue_node.ticks, queue_node.paused_ticks) + tick_usage += queue_node.paused_tick_usage + + queue_node.tick_usage = MC_AVERAGE_FAST(queue_node.tick_usage, tick_usage) + + queue_node.cost = MC_AVERAGE_FAST(queue_node.cost, TICK_DELTA_TO_MS(tick_usage)) + queue_node.paused_ticks = 0 + queue_node.paused_tick_usage = 0 + + if (queue_node_flags & SS_BACKGROUND) //update our running total + queue_priority_count_bg -= queue_node_priority + else + queue_priority_count -= queue_node_priority + + queue_node.last_fire = world.time + queue_node.times_fired++ + + if (queue_node_flags & SS_TICKER) + queue_node.next_fire = world.time + (world.tick_lag * queue_node.wait) + else if (queue_node_flags & SS_POST_FIRE_TIMING) + queue_node.next_fire = world.time + queue_node.wait + else if (queue_node_flags & SS_KEEP_TIMING) + queue_node.next_fire += queue_node.wait + else + queue_node.next_fire = queue_node.queued_time + queue_node.wait + + queue_node.queued_time = 0 + + //remove from queue + queue_node.dequeue() + + queue_node = queue_node.queue_next + + . = 1 + +//resets the queue, and all subsystems, while filtering out the subsystem lists +// called if any mc's queue procs runtime or exit improperly. +/datum/controller/master/proc/SoftReset(list/ticker_SS, list/runlevel_SS) + . = 0 + log_world("MC: SoftReset called, resetting MC queue state.") + if (!istype(subsystems) || !istype(ticker_SS) || !istype(runlevel_SS)) + log_world("MC: SoftReset: Bad list contents: '[subsystems]' '[ticker_SS]' '[runlevel_SS]'") + return + var/subsystemstocheck = subsystems + ticker_SS + for(var/I in runlevel_SS) + subsystemstocheck |= I + + for (var/thing in subsystemstocheck) + var/datum/controller/subsystem/SS = thing + if (!SS || !istype(SS)) + //list(SS) is so if a list makes it in the subsystem list, we remove the list, not the contents + subsystems -= list(SS) + ticker_SS -= list(SS) + for(var/I in runlevel_SS) + I -= list(SS) + log_world("MC: SoftReset: Found bad entry in subsystem list, '[SS]'") + continue + if (SS.queue_next && !istype(SS.queue_next)) + log_world("MC: SoftReset: Found bad data in subsystem queue, queue_next = '[SS.queue_next]'") + SS.queue_next = null + if (SS.queue_prev && !istype(SS.queue_prev)) + log_world("MC: SoftReset: Found bad data in subsystem queue, queue_prev = '[SS.queue_prev]'") + SS.queue_prev = null + SS.queued_priority = 0 + SS.queued_time = 0 + SS.state = SS_IDLE + if (queue_head && !istype(queue_head)) + log_world("MC: SoftReset: Found bad data in subsystem queue, queue_head = '[queue_head]'") + queue_head = null + if (queue_tail && !istype(queue_tail)) + log_world("MC: SoftReset: Found bad data in subsystem queue, queue_tail = '[queue_tail]'") + queue_tail = null + queue_priority_count = 0 + queue_priority_count_bg = 0 + log_world("MC: SoftReset: Finished.") + . = 1 + + + +/datum/controller/master/stat_entry() + if(!statclick) + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) + + stat("Byond:", "(FPS:[world.fps]) (TickCount:[world.time/world.tick_lag]) (TickDrift:[round(Master.tickdrift,1)]([round((Master.tickdrift/(world.time/world.tick_lag))*100,0.1)]%))") + stat("Master Controller:", statclick.update("(TickRate:[Master.processing]) (Iteration:[Master.iteration])")) + +/datum/controller/master/StartLoadingMap() + //disallow more than one map to load at once, multithreading it will just cause race conditions + while(map_loading) + stoplag() + for(var/S in subsystems) + var/datum/controller/subsystem/SS = S + SS.StartLoadingMap() + map_loading = TRUE + +/datum/controller/master/StopLoadingMap(bounds = null) + map_loading = FALSE + for(var/S in subsystems) + var/datum/controller/subsystem/SS = S + SS.StopLoadingMap() diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index e20f62ea861..fef25b9d10b 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -2,6 +2,10 @@ //It ensures master_controller.process() is never doubled up by killing the MC (hence terminating any of its sleeping procs) //WIP, needs lots of work still +// +// TODO - This will be completely replaced by master.dm in time. +// + var/global/datum/controller/game_controller/master_controller //Set in world.New() var/global/controller_iteration = 0 @@ -31,7 +35,6 @@ datum/controller/game_controller/New() if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() datum/controller/game_controller/proc/setup() - world.tick_lag = config.Ticklag setup_objects() setupgenetics() @@ -71,8 +74,8 @@ datum/controller/game_controller/proc/setup_objects() sleep(1) admin_notice("Initializing objects", R_DEBUG) - for(var/obj/object in world) - if(isnull(object.gcDestroyed)) + for(var/atom/movable/object in world) + if(!QDELETED(object)) object.initialize() CHECK_SLEEP_MASTER sleep(1) @@ -100,7 +103,7 @@ datum/controller/game_controller/proc/setup_objects() admin_notice("Initializing turbolifts", R_DEBUG) for(var/thing in turbolifts) - if(!deleted(thing)) - var/obj/turbolift_map_holder/lift = thing + var/obj/turbolift_map_holder/lift = thing + if(!QDELETED(lift)) lift.initialize() CHECK_SLEEP_MASTER diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 8a22539f51d..d881a65a4a2 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -15,8 +15,13 @@ var/global/datum/shuttle_controller/shuttle_controller //This is called by gameticker after all the machines and radio frequencies have been properly initialized /datum/shuttle_controller/proc/setup_shuttle_docks() - for(var/shuttle_tag in shuttles) - var/datum/shuttle/shuttle = shuttles[shuttle_tag] +// for(var/shuttle_tag in shuttles) +// var/datum/shuttle/shuttle = shuttles[shuttle_tag] + for(var/shuttle_type in subtypesof(/datum/shuttle)) + var/datum/shuttle/shuttle = shuttle_type + if(initial(shuttle.category) == shuttle_type) + continue + shuttle = new shuttle() shuttle.init_docking_controllers() shuttle.dock() //makes all shuttles docked to something at round start go into the docked state @@ -28,389 +33,3 @@ var/global/datum/shuttle_controller/shuttle_controller shuttles = list() process_shuttles = list() - var/datum/shuttle/ferry/shuttle - - // Escape shuttle and pods - shuttle = new/datum/shuttle/ferry/emergency() - shuttle.location = 1 - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/escape/centcom) - shuttle.area_station = locate(/area/shuttle/escape/station) - shuttle.area_transition = locate(/area/shuttle/escape/transit) - shuttle.docking_controller_tag = "escape_shuttle" - shuttle.dock_target_station = "escape_dock" - shuttle.dock_target_offsite = "centcom_dock" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN - //shuttle.docking_controller_tag = "supply_shuttle" - //shuttle.dock_target_station = "cargo_bay" - shuttles["Escape"] = shuttle - process_shuttles += shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod1/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod1/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod1/transit) - shuttle.docking_controller_tag = "escape_pod_1" - shuttle.dock_target_station = "escape_pod_1_berth" - shuttle.dock_target_offsite = "escape_pod_1_recovery" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 1"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod2/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod2/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod2/transit) - shuttle.docking_controller_tag = "escape_pod_2" - shuttle.dock_target_station = "escape_pod_2_berth" - shuttle.dock_target_offsite = "escape_pod_2_recovery" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 2"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod3/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod3/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod3/transit) - shuttle.docking_controller_tag = "escape_pod_3" - shuttle.dock_target_station = "escape_pod_3_berth" - shuttle.dock_target_offsite = "escape_pod_3_recovery" - shuttle.transit_direction = NORTH - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 3"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod4/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod4/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod4/transit) - shuttle.docking_controller_tag = "escape_pod_4" - shuttle.dock_target_station = "escape_pod_4_berth" - shuttle.dock_target_offsite = "escape_pod_4_recovery" - shuttle.transit_direction = NORTH //should this be SOUTH? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 4"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod5/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod5/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod5/transit) - shuttle.docking_controller_tag = "escape_pod_5" - shuttle.dock_target_station = "escape_pod_5_berth" - shuttle.dock_target_offsite = "escape_pod_5_recovery" - shuttle.transit_direction = NORTH //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 5"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/escape_pod6/station) - shuttle.area_offsite = locate(/area/shuttle/escape_pod6/centcom) - shuttle.area_transition = locate(/area/shuttle/escape_pod6/transit) - shuttle.docking_controller_tag = "escape_pod_6" - shuttle.dock_target_station = "escape_pod_6_berth" - shuttle.dock_target_offsite = "escape_pod_6_recovery" - shuttle.transit_direction = NORTH //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Escape Pod 6"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/cryo/station) - shuttle.area_offsite = locate(/area/shuttle/cryo/centcom) - shuttle.area_transition = locate(/area/shuttle/cryo/transit) - shuttle.docking_controller_tag = "cryostorage_shuttle" - shuttle.dock_target_station = "cryostorage_shuttle_berth" - shuttle.dock_target_offsite = "cryostorage_shuttle_recovery" - shuttle.transit_direction = NORTH //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Cryostorage Shuttle"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/large_escape_pod1/station) - shuttle.area_offsite = locate(/area/shuttle/large_escape_pod1/centcom) - shuttle.area_transition = locate(/area/shuttle/large_escape_pod1/transit) - shuttle.docking_controller_tag = "large_escape_pod_1" - shuttle.dock_target_station = "large_escape_pod_1_berth" - shuttle.dock_target_offsite = "large_escape_pod_1_recovery" - shuttle.transit_direction = EAST //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Large Escape Pod 1"] = shuttle - - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/large_escape_pod2/station) - shuttle.area_offsite = locate(/area/shuttle/large_escape_pod2/centcom) - shuttle.area_transition = locate(/area/shuttle/large_escape_pod2/transit) - shuttle.docking_controller_tag = "large_escape_pod_2" - shuttle.dock_target_station = "large_escape_pod_2_berth" - shuttle.dock_target_offsite = "large_escape_pod_2_recovery" - shuttle.transit_direction = EAST //should this be WEST? I have no idea. - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Large Escape Pod 2"] = shuttle - - //give the emergency shuttle controller it's shuttles - emergency_shuttle.shuttle = shuttles["Escape"] - emergency_shuttle.escape_pods = list( - shuttles["Escape Pod 1"], - shuttles["Escape Pod 2"], - shuttles["Escape Pod 3"], - shuttles["Escape Pod 4"], - shuttles["Escape Pod 5"], - shuttles["Escape Pod 6"], - shuttles["Cryostorage Shuttle"], - shuttles["Large Escape Pod 1"], - shuttles["Large Escape Pod 2"], - ) - - // Supply shuttle - shuttle = new/datum/shuttle/ferry/supply() - shuttle.location = 1 - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/supply/dock) - shuttle.area_station = locate(/area/supply/station) - shuttle.docking_controller_tag = "supply_shuttle" - shuttle.dock_target_station = "cargo_bay" - shuttles["Supply"] = shuttle - process_shuttles += shuttle - - supply_controller.shuttle = shuttle - - // Admin shuttles. - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/transport1/centcom) - shuttle.area_station = locate(/area/shuttle/transport1/station) - shuttle.docking_controller_tag = "centcom_shuttle" - shuttle.dock_target_station = "centcom_shuttle_dock_airlock" - shuttle.dock_target_offsite = "centcom_shuttle_bay" - shuttles["CentCom"] = shuttle - process_shuttles += shuttle - /* VOREStation Removal - This is a multishuttle now and is down there with them. - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 //want some warmup time so people can cancel. - shuttle.area_offsite = locate(/area/shuttle/administration/centcom) - shuttle.area_station = locate(/area/shuttle/administration/station) - shuttle.docking_controller_tag = "admin_shuttle" - shuttle.dock_target_station = "admin_shuttle_dock_airlock" - shuttle.dock_target_offsite = "admin_shuttle_bay" - shuttles["Administration"] = shuttle - process_shuttles += shuttle - VOREStation Removal End */ - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 //want some warmup time so people can cancel. - shuttle.area_offsite = locate(/area/shuttle/trade/centcom) - shuttle.area_station = locate(/area/shuttle/trade/station) - shuttle.docking_controller_tag = "trade_shuttle" - shuttle.dock_target_station = "trade_shuttle_dock_airlock" - shuttle.dock_target_offsite = "trade_shuttle_bay" - shuttles["Trade"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.area_offsite = locate(/area/shuttle/alien/base) - shuttle.area_station = locate(/area/shuttle/alien/mine) - shuttles["Alien"] = shuttle - //process_shuttles += shuttle //don't need to process this. It can only be moved using admin magic anyways. - - // Public shuttles - shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/constructionsite/site) - shuttle.area_station = locate(/area/shuttle/constructionsite/station) - shuttle.docking_controller_tag = "engineering_shuttle" - shuttle.dock_target_station = "engineering_dock_airlock" - shuttle.dock_target_offsite = "edock_airlock" - shuttles["Engineering"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/mining/outpost) - shuttle.area_station = locate(/area/shuttle/mining/station) - shuttle.docking_controller_tag = "mining_shuttle" - shuttle.dock_target_station = "mining_dock_airlock" - shuttle.dock_target_offsite = "mining_outpost_airlock" - shuttles["Mining"] = shuttle - process_shuttles += shuttle - - shuttle = new() - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/research/outpost) - shuttle.area_station = locate(/area/shuttle/research/station) - shuttle.docking_controller_tag = "research_shuttle" - shuttle.dock_target_station = "research_dock_airlock" - shuttle.dock_target_offsite = "research_outpost_dock" - shuttles["Research"] = shuttle - process_shuttles += shuttle - - // ERT Shuttle - var/datum/shuttle/ferry/multidock/specops/ERT = new() - ERT.location = 0 - ERT.warmup_time = 10 - ERT.area_offsite = locate(/area/shuttle/specops/station) //centcom is the home station, the player station is offsite - ERT.area_station = locate(/area/shuttle/specops/centcom) - ERT.docking_controller_tag = "specops_shuttle_port" - ERT.docking_controller_tag_station = "specops_shuttle_port" - ERT.docking_controller_tag_offsite = "specops_shuttle_fore" - ERT.dock_target_station = "specops_centcom_dock" - ERT.dock_target_offsite = "specops_dock_airlock" - shuttles["Special Operations"] = ERT - process_shuttles += ERT - - //Skipjack. - var/datum/shuttle/multi_shuttle/VS = new/datum/shuttle/multi_shuttle() - VS.origin = locate(/area/skipjack_station/start) - - VS.destinations = list( - "Fore Starboard Solars" = locate(/area/skipjack_station/northeast_solars), - "Fore Port Solars" = locate(/area/skipjack_station/northwest_solars), - "Aft Starboard Solars" = locate(/area/skipjack_station/southeast_solars), - "Aft Port Solars" = locate(/area/skipjack_station/southwest_solars), // Vorestation edit - "Station Arrivals Dock" = locate(/area/skipjack_station/southwest_solars), - "Mining Station" = locate(/area/skipjack_station/mining) - ) - - VS.announcer = "Colony Automated Radar Array" - VS.arrival_message = "Attention. Unidentified object approaching the colony." - VS.departure_message = "Attention. Unidentified object exiting local space. Unidentified object expected to escape Virgo-3's gravity well with current velocity." // Vorestation edit - VS.interim = locate(/area/skipjack_station/transit) - - VS.warmup_time = 0 - shuttles["Skipjack"] = VS - - //Nuke Ops shuttle. - var/datum/shuttle/multi_shuttle/MS = new/datum/shuttle/multi_shuttle() - MS.origin = locate(/area/syndicate_station/start) - MS.start_location = "Mercenary Base" - - MS.destinations = list( - "Northwest of the station" = locate(/area/syndicate_station/northwest), - "North of the station" = locate(/area/syndicate_station/north), - "Northeast of the station" = locate(/area/syndicate_station/northeast), - "Southwest of the station" = locate(/area/syndicate_station/southwest), - "South of the station" = locate(/area/syndicate_station/south), - "Southeast of the station" = locate(/area/syndicate_station/southeast), - "Telecomms Satellite" = locate(/area/syndicate_station/commssat), - "Mining Station" = locate(/area/syndicate_station/mining), - "Arrivals dock" = locate(/area/syndicate_station/arrivals_dock), - ) - - MS.docking_controller_tag = "merc_shuttle" - MS.destination_dock_targets = list( - "Mercenary Base" = "merc_base", - "Arrivals dock" = "nuke_shuttle_dock_airlock", - ) - - MS.announcer = "Automated Traffic Control" - MS.arrival_message = "Attention. A vessel is approaching the colony." - MS.departure_message = "Attention. A vessel is now leaving from the colony." - MS.interim = locate(/area/syndicate_station/transit) - - MS.warmup_time = 0 - shuttles["Mercenary"] = MS - - // VOREStation Add - The admin shuttle is a multishuttle now. - //Centcom admin shuttle. - var/datum/shuttle/multi_shuttle/CC = new/datum/shuttle/multi_shuttle() - CC.legit = 1 - CC.origin = locate(/area/shuttle/administration/centcom) - CC.start_location = "Central Command (AS)" - - CC.destinations = list( - "Deep Space (AS)" = locate(/area/shuttle/administration/transit), - "NSS Adephagia (AS)" = locate(/area/shuttle/administration/station) - ) - - CC.docking_controller_tag = "admin_shuttle" - CC.destination_dock_targets = list( - "Central Command (AS)" = "admin_shuttle_bay", - "NSS Adephagia (AS)" = "admin_shuttle_dock_airlock" - ) - - var/area/ccaway_dest = locate(/area/shuttle/administration/away_mission) - if(ccaway_dest.contents.len) //Otherwise this is an empty imaginary area - CC.destinations["Unknown Location [rand(1000,9999)]"] = ccaway_dest - - CC.announcer = "Automated Traffic Control" - //These seem backwards because they are written from the perspective of the merc and vox ships - CC.departure_message = "Attention. A Centcom vessel is approaching the colony." - CC.arrival_message = "Attention. A Centcom vessel is now leaving from the colony." - - CC.move_time = 0 - CC.warmup_time = 0 - shuttles["Administration"] = CC - //VOREStation Add End - Admin shuttle. - ////////////////////////////////////////////////////////////// - //VOREStation Add - Away-mission shuttle - var/datum/shuttle/multi_shuttle/AM = new/datum/shuttle/multi_shuttle() - AM.legit = 1 - AM.origin = locate(/area/shuttle/awaymission/home) - AM.start_location = "NSS Adephagia (AM)" - - AM.destinations = list( - "Old Engineering Base (AM)" = locate(/area/shuttle/awaymission/oldengbase) - ) - - AM.docking_controller_tag = "awaymission_shuttle" - AM.destination_dock_targets = list( - "NSS Adephagia (AM)" = "d1a2_dock_airlock" - ) - - var/area/awaym_dest = locate(/area/shuttle/awaymission/away) - if(awaym_dest.contents.len) //Otherwise this is an empty imaginary area - AM.destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest - - AM.announcer = "Automated Traffic Control" - //These seem backwards because they are written from the perspective of the merc and vox ships - AM.departure_message = "Attention. The away mission vessel is approaching the colony." - AM.arrival_message = "Attention. The away mission vessel is now leaving from the colony." - AM.interim = locate(/area/shuttle/awaymission/warp) - - AM.move_time = 60 - AM.warmup_time = 8 - shuttles["AwayMission"] = AM - //VOREStation Add End - Away-mission shuttle - /////////////////////////////////////////////// - //VOREStation Add - Belter Shuttle - shuttle = new/datum/shuttle/ferry() - shuttle.location = 0 - shuttle.warmup_time = 6 - shuttle.area_station = locate(/area/shuttle/belter/station) - shuttle.area_offsite = locate(/area/shuttle/belter/belt/zone1) - shuttle.area_transition = locate(/area/shuttle/belter/transit) - shuttle.docking_controller_tag = "belter_docking" - shuttle.dock_target_station = "belter_nodocking" //Fake tags to prevent the shuttle from opening doors. - shuttle.dock_target_offsite = "belter_nodocking" - shuttle.transit_direction = EAST - shuttle.move_time = 60 + rand(10,40) - process_shuttles += shuttle - shuttles["Belter"] = shuttle - //VOREStation Add End - Belter Shuttle \ No newline at end of file diff --git a/code/controllers/shuttle_controller_vr.dm b/code/controllers/shuttle_controller_vr.dm deleted file mode 100644 index e3cca605141..00000000000 --- a/code/controllers/shuttle_controller_vr.dm +++ /dev/null @@ -1,210 +0,0 @@ - -var/global/datum/shuttle_controller/shuttle_controller - - -/datum/shuttle_controller - var/list/shuttles //maps shuttle tags to shuttle datums, so that they can be looked up. - var/list/process_shuttles //simple list of shuttles, for processing - -/datum/shuttle_controller/proc/process() - //process ferry shuttles - for (var/datum/shuttle/ferry/shuttle in process_shuttles) - if (shuttle.process_state) - shuttle.process() - - -//This is called by gameticker after all the machines and radio frequencies have been properly initialized -/datum/shuttle_controller/proc/setup_shuttle_docks() - for(var/shuttle_tag in shuttles) - var/datum/shuttle/shuttle = shuttles[shuttle_tag] - shuttle.init_docking_controllers() - shuttle.dock() //makes all shuttles docked to something at round start go into the docked state - - for(var/obj/machinery/embedded_controller/C in machines) - if(istype(C.program, /datum/computer/file/embedded_program/docking)) - C.program.tag = null //clear the tags, 'cause we don't need 'em anymore - -/datum/shuttle_controller/New() - shuttles = list() - process_shuttles = list() - - var/datum/shuttle/ferry/shuttle - - ////////////////////////////////////////////////////////////// - // Escape shuttle and pods - shuttle = new/datum/shuttle/ferry/emergency() - shuttle.location = 1 // At offsite - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/shuttle/escape/centcom) - shuttle.area_station = locate(/area/shuttle/escape/station) - shuttle.area_transition = locate(/area/shuttle/escape/transit) - shuttle.docking_controller_tag = "escape_shuttle" - shuttle.dock_target_station = "escape_dock" - shuttle.dock_target_offsite = "centcom_dock" - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN - shuttles["Escape"] = shuttle - process_shuttles += shuttle - - ////////////////////////////////////////////////////////////// - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 // At station - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/large_escape_pod1/station) - shuttle.area_offsite = locate(/area/shuttle/large_escape_pod1/centcom) - shuttle.area_transition = locate(/area/shuttle/large_escape_pod1/transit) - shuttle.docking_controller_tag = "large_escape_pod_1" - shuttle.dock_target_station = "large_escape_pod_1_berth" - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Large Escape Pod 1"] = shuttle - - ////////////////////////////////////////////////////////////// - shuttle = new/datum/shuttle/ferry/escape_pod() - shuttle.location = 0 // At station - shuttle.warmup_time = 0 - shuttle.area_station = locate(/area/shuttle/large_escape_pod2/station) - shuttle.area_offsite = locate(/area/shuttle/large_escape_pod2/centcom) - shuttle.area_transition = locate(/area/shuttle/large_escape_pod2/transit) - shuttle.docking_controller_tag = "large_escape_pod_2" - shuttle.dock_target_station = "large_escape_pod_2_berth" - shuttle.move_time = SHUTTLE_TRANSIT_DURATION_RETURN + rand(-30, 60) //randomize this so it seems like the pods are being picked up one by one - process_shuttles += shuttle - shuttles["Large Escape Pod 2"] = shuttle - - //give the emergency shuttle controller it's shuttles - emergency_shuttle.shuttle = shuttles["Escape"] - emergency_shuttle.escape_pods = list( - shuttles["Large Escape Pod 1"], - shuttles["Large Escape Pod 2"], - ) - - ////////////////////////////////////////////////////////////// - // Supply shuttle - shuttle = new/datum/shuttle/ferry/supply() - shuttle.location = 1 - shuttle.warmup_time = 10 - shuttle.area_offsite = locate(/area/supply/dock) - shuttle.area_station = locate(/area/supply/station) - shuttle.docking_controller_tag = "supply_shuttle" - shuttle.dock_target_station = "cargo_bay" - shuttles["Supply"] = shuttle - process_shuttles += shuttle - - supply_controller.shuttle = shuttle - - ////////////////////////////////////////////////////////////// - // Trade Ship - shuttle = new() - shuttle.location = 1 - shuttle.warmup_time = 10 //want some warmup time so people can cancel. - shuttle.area_offsite = locate(/area/shuttle/trade/centcom) - shuttle.area_station = locate(/area/shuttle/trade/station) - shuttle.docking_controller_tag = "trade_shuttle" - shuttle.dock_target_station = "trade_shuttle_dock_airlock" - shuttle.dock_target_offsite = "trade_shuttle_bay" - shuttles["Trade"] = shuttle - process_shuttles += shuttle - - ////////////////////////////////////////////////////////////// - // Away Mission Shuttle - var/datum/shuttle/multi_shuttle/AM = new/datum/shuttle/multi_shuttle() - AM.legit = 1 - AM.origin = locate(/area/shuttle/awaymission/home) - AM.start_location = "NSS Adephagia (AM)" - - AM.destinations = list( - "Old Engineering Base (AM)" = locate(/area/shuttle/awaymission/oldengbase) - ) - - AM.docking_controller_tag = "awaymission_shuttle" - AM.destination_dock_targets = list( - "NSS Adephagia (AM)" = "d1a2_dock_airlock" - ) - - var/area/awaym_dest = locate(/area/shuttle/awaymission/away) - if(awaym_dest.contents.len) //Otherwise this is an empty imaginary area - AM.destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest - - AM.announcer = "Automated Traffic Control" - //These seem backwards because they are written from the perspective of the merc and vox ships - AM.departure_message = "Attention. The away mission vessel is approaching the colony." - AM.arrival_message = "Attention. The away mission vessel is now leaving from the colony." - AM.interim = locate(/area/shuttle/awaymission/warp) - - AM.move_time = 60 - AM.warmup_time = 8 - shuttles["AwayMission"] = AM - - - // TODO - Not implemented yet on new map - /////////////////////////////////////////////// - //VOREStation Add - Belter Shuttle - // shuttle = new/datum/shuttle/ferry() - // shuttle.location = 0 - // shuttle.warmup_time = 6 - // shuttle.area_station = locate(/area/shuttle/belter/station) - // shuttle.area_offsite = locate(/area/shuttle/belter/belt/zone1) - // shuttle.area_transition = locate(/area/shuttle/belter/transit) - // shuttle.docking_controller_tag = "belter_docking" - // shuttle.dock_target_station = "belter_nodocking" //Fake tags to prevent the shuttle from opening doors. - // shuttle.dock_target_offsite = "belter_nodocking" - // shuttle.transit_direction = EAST - // shuttle.move_time = 60 + rand(10,40) - // process_shuttles += shuttle - // shuttles["Belter"] = shuttle - //VOREStation Add End - Belter Shuttle - - ////////////////////////////////////////////////////////////// - // Tether Shuttle - var/datum/shuttle/ferry/tether_backup/TB = new() - TB.location = 1 // At offsite - TB.warmup_time = 5 - TB.move_time = 45 - TB.area_offsite = locate(/area/shuttle/tether/surface) - TB.area_station = locate(/area/shuttle/tether/station) - TB.area_transition = locate(/area/shuttle/tether/transit) - TB.crash_areas = list(locate(/area/shuttle/tether/crash1), locate(/area/shuttle/tether/crash2)) - TB.docking_controller_tag = "tether_shuttle" - TB.dock_target_station = "tether_dock_airlock" - TB.dock_target_offsite = "tether_pad_airlock" - shuttles["Tether Backup"] = TB - process_shuttles += TB - - for(var/obj/structure/shuttle/engine/propulsion/E in TB.area_offsite) - TB.engines += E - for(var/obj/machinery/computer/shuttle_control/tether_backup/comp in TB.area_offsite) - TB.computer = comp - break - - - ////////////////////////////////////////////////////////////// - // Antag Space "Proto Shuttle" Shuttle - AM = new/datum/shuttle/multi_shuttle() - AM.docking_controller_tag = "antag_space_shuttle" - AM.start_location = "Home Base" - AM.origin = locate(/area/shuttle/antag_space/base) - AM.interim = locate(/area/shuttle/antag_space/transit) - AM.destinations = list( - "Nearby" = locate(/area/shuttle/antag_space/north), - "Docks" = locate(/area/shuttle/antag_space/docks) - ) - AM.destination_dock_targets = list("Home Base" = "antag_space_dock") - AM.move_time = 60 - AM.warmup_time = 8 - shuttles["Proto"] = AM - - ////////////////////////////////////////////////////////////// - // Antag Surface "Land Crawler" Shuttle - AM = new/datum/shuttle/multi_shuttle() - AM.docking_controller_tag = "antag_ground_shuttle" - AM.start_location = "Home Base" - AM.origin = locate(/area/shuttle/antag_ground/base) - AM.interim = locate(/area/shuttle/antag_ground/transit) - AM.destinations = list( - "Solar Array" = locate(/area/shuttle/antag_ground/solars), - "Mining Outpost" = locate(/area/shuttle/antag_ground/mining) - ) - AM.destination_dock_targets = list("Home Base" = "antag_ground_dock") - AM.move_time = 60 - AM.warmup_time = 8 - shuttles["Land Crawler"] = AM diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm new file mode 100644 index 00000000000..7dff609c76d --- /dev/null +++ b/code/controllers/subsystem.dm @@ -0,0 +1,202 @@ +/datum/controller/subsystem + // Metadata; you should define these. + name = "fire coderbus" //name of the subsystem + var/init_order = 0 //order of initialization. Higher numbers are initialized first, lower numbers later. Can be decimal and negative values. + var/wait = 20 //time to wait (in deciseconds) between each call to fire(). Must be a positive integer. + var/priority = 50 //When mutiple subsystems need to run in the same tick, higher priority subsystems will run first and be given a higher share of the tick before MC_TICK_CHECK triggers a sleep + + var/flags = 0 //see MC.dm in __DEFINES Most flags must be set on world start to take full effect. (You can also restart the mc to force them to process again) + var/runlevels = RUNLEVELS_DEFAULT //points of the game at which the SS can fire + + //set to 0 to prevent fire() calls, mostly for admin use or subsystems that may be resumed later + // use the SS_NO_FIRE flag instead for systems that never fire to keep it from even being added to the list + var/can_fire = TRUE + + // Bookkeeping variables; probably shouldn't mess with these. + var/last_fire = 0 //last world.time we called fire() + var/next_fire = 0 //scheduled world.time for next fire() + var/cost = 0 //average time to execute + var/tick_usage = 0 //average tick usage + var/state = SS_IDLE //tracks the current state of the ss, running, paused, etc. + var/paused_ticks = 0 //ticks this ss is taking to run right now. + var/paused_tick_usage //total tick_usage of all of our runs while pausing this run + var/ticks = 1 //how many ticks does this ss take to run on avg. + var/times_fired = 0 //number of times we have called fire() + var/queued_time = 0 //time we entered the queue, (for timing and priority reasons) + var/queued_priority //we keep a running total to make the math easier, if priority changes mid-fire that would break our running total, so we store it here + //linked list stuff for the queue + var/datum/controller/subsystem/queue_next + var/datum/controller/subsystem/queue_prev + + var/static/failure_strikes = 0 //How many times we suspect this subsystem has crashed the MC, 3 strikes and you're out! + +//Do not override +/datum/controller/subsystem/New() + return + +// Used to initialize the subsystem BEFORE the map has loaded +// Called AFTER Recover if that is called +// Prefer to use Initialize if possible +/datum/controller/subsystem/proc/PreInit() + return + +//This is used so the mc knows when the subsystem sleeps. do not override. +/datum/controller/subsystem/proc/ignite(resumed = 0) + set waitfor = 0 + . = SS_SLEEPING + fire(resumed) + . = state + if (state == SS_SLEEPING) + state = SS_IDLE + if (state == SS_PAUSING) + var/QT = queued_time + enqueue() + state = SS_PAUSED + queued_time = QT + +//previously, this would have been named 'process()' but that name is used everywhere for different things! +//fire() seems more suitable. This is the procedure that gets called every 'wait' deciseconds. +//Sleeping in here prevents future fires until returned. +/datum/controller/subsystem/proc/fire(resumed = 0) + flags |= SS_NO_FIRE + throw EXCEPTION("Subsystem [src]([type]) does not fire() but did not set the SS_NO_FIRE flag. Please add the SS_NO_FIRE flag to any subsystem that doesn't fire so it doesn't get added to the processing list and waste cpu.") + +/datum/controller/subsystem/Destroy() + dequeue() + can_fire = 0 + flags |= SS_NO_FIRE + Master.subsystems -= src + + +//Queue it to run. +// (we loop thru a linked list until we get to the end or find the right point) +// (this lets us sort our run order correctly without having to re-sort the entire already sorted list) +/datum/controller/subsystem/proc/enqueue() + var/SS_priority = priority + var/SS_flags = flags + var/datum/controller/subsystem/queue_node + var/queue_node_priority + var/queue_node_flags + + for (queue_node = Master.queue_head; queue_node; queue_node = queue_node.queue_next) + queue_node_priority = queue_node.queued_priority + queue_node_flags = queue_node.flags + + if (queue_node_flags & SS_TICKER) + if (!(SS_flags & SS_TICKER)) + continue + if (queue_node_priority < SS_priority) + break + + else if (queue_node_flags & SS_BACKGROUND) + if (!(SS_flags & SS_BACKGROUND)) + break + if (queue_node_priority < SS_priority) + break + + else + if (SS_flags & SS_BACKGROUND) + continue + if (SS_flags & SS_TICKER) + break + if (queue_node_priority < SS_priority) + break + + queued_time = world.time + queued_priority = SS_priority + state = SS_QUEUED + if (SS_flags & SS_BACKGROUND) //update our running total + Master.queue_priority_count_bg += SS_priority + else + Master.queue_priority_count += SS_priority + + queue_next = queue_node + if (!queue_node)//we stopped at the end, add to tail + queue_prev = Master.queue_tail + if (Master.queue_tail) + Master.queue_tail.queue_next = src + else //empty queue, we also need to set the head + Master.queue_head = src + Master.queue_tail = src + + else if (queue_node == Master.queue_head)//insert at start of list + Master.queue_head.queue_prev = src + Master.queue_head = src + queue_prev = null + else + queue_node.queue_prev.queue_next = src + queue_prev = queue_node.queue_prev + queue_node.queue_prev = src + + +/datum/controller/subsystem/proc/dequeue() + if (queue_next) + queue_next.queue_prev = queue_prev + if (queue_prev) + queue_prev.queue_next = queue_next + if (src == Master.queue_tail) + Master.queue_tail = queue_prev + if (src == Master.queue_head) + Master.queue_head = queue_next + queued_time = 0 + if (state == SS_QUEUED) + state = SS_IDLE + + +/datum/controller/subsystem/proc/pause() + . = 1 + switch(state) + if(SS_RUNNING) + state = SS_PAUSED + if(SS_SLEEPING) + state = SS_PAUSING + + +//used to initialize the subsystem AFTER the map has loaded +/datum/controller/subsystem/Initialize(start_timeofday) + var/time = (REALTIMEOFDAY - start_timeofday) / 10 + var/msg = "Initialized [name] subsystem within [time] second[time == 1 ? "" : "s"]!" + to_chat(world, "[msg]") + log_world(msg) + return time + +//hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc. +/datum/controller/subsystem/stat_entry(msg) + if(!statclick) + statclick = new/obj/effect/statclick/debug(null, "Initializing...", src) + + + + if(can_fire && !(SS_NO_FIRE in flags)) + msg = "[round(cost,1)]ms|[round(tick_usage,1)]%|[round(ticks,0.1)]\t[msg]" + else + msg = "OFFLINE\t[msg]" + + var/title = name + if (can_fire) + title = "\[[state_letter()]][title]" + + stat(title, statclick.update(msg)) + +/datum/controller/subsystem/proc/state_letter() + switch (state) + if (SS_RUNNING) + . = "R" + if (SS_QUEUED) + . = "Q" + if (SS_PAUSED, SS_PAUSING) + . = "P" + if (SS_SLEEPING) + . = "S" + if (SS_IDLE) + . = " " + +//could be used to postpone a costly subsystem for (default one) var/cycles, cycles +//for instance, during cpu intensive operations like explosions +/datum/controller/subsystem/proc/postpone(cycles = 1) + if(next_fire - world.time < wait) + next_fire += (wait*cycles) + +//usually called via datum/controller/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash) +//should attempt to salvage what it can from the old instance of subsystem +/datum/controller/subsystem/Recover() diff --git a/code/controllers/subsystems.dm b/code/controllers/subsystems.dm deleted file mode 100644 index 11025d8d535..00000000000 --- a/code/controllers/subsystems.dm +++ /dev/null @@ -1,46 +0,0 @@ -#define NEW_SS_GLOBAL(varname) if(varname != src){if(istype(varname)){Recover();qdel(varname);}varname = src;} - -/datum/subsystem - //things you will want to define - var/name //name of the subsystem - var/priority = 0 //priority affects order of initialization. Higher priorities are initialized first, lower priorities later. Can be decimal and negative values. - var/wait = 20 //time to wait (in deciseconds) between each call to fire(). Must be a positive integer. - - //things you will probably want to leave alone - var/can_fire = 0 //prevent fire() calls - var/last_fire = 0 //last world.time we called fire() - var/next_fire = 0 //scheduled world.time for next fire() - var/cpu = 0 //cpu-usage stats (somewhat vague) - var/cost = 0 //average time to execute - var/times_fired = 0 //number of times we have called fire() - -//used to initialize the subsystem BEFORE the map has loaded -/datum/subsystem/New() - -//previously, this would have been named 'process()' but that name is used everywhere for different things! -//fire() seems more suitable. This is the procedure that gets called every 'wait' deciseconds. -//fire(), and the procs it calls, SHOULD NOT HAVE ANY SLEEP OPERATIONS in them! -//YE BE WARNED! -/datum/subsystem/proc/fire() - can_fire = 0 - -//used to initialize the subsystem AFTER the map has loaded -/datum/subsystem/proc/Initialize(start_timeofday) - var/time = (world.timeofday - start_timeofday) / 10 - var/msg = "Initialized [name] SubSystem within [time] seconds" - world << "[msg]" - world.log << msg - -//hook for printing stats to the "MC" statuspanel for admins to see performance and related stats etc. -/datum/subsystem/proc/stat_entry() - stat(name, "[round(cost,0.001)]ds\t(CPU:[round(cpu,1)]%)") - -//could be used to postpone a costly subsystem for one cycle -//for instance, during cpu intensive operations like explosions -/datum/subsystem/proc/postpone() - if(next_fire - world.time < wait) - next_fire += wait - -//usually called via datum/subsystem/New() when replacing a subsystem (i.e. due to a recurring crash) -//should attempt to salvage what it can from the old instance of subsystem -/datum/subsystem/proc/Recover() diff --git a/code/controllers/subsystems/garbage.dm b/code/controllers/subsystems/garbage.dm new file mode 100644 index 00000000000..d6db860d5de --- /dev/null +++ b/code/controllers/subsystems/garbage.dm @@ -0,0 +1,378 @@ +// +// Garbage Collector Subsystem - Implements qdel() and the GC queue +// +SUBSYSTEM_DEF(garbage) + name = "Garbage" + priority = 15 + wait = 5 + flags = SS_POST_FIRE_TIMING|SS_BACKGROUND|SS_NO_INIT + runlevels = RUNLEVELS_DEFAULT | RUNLEVEL_LOBBY + + var/collection_timeout = 3000// deciseconds to wait to let running procs finish before we just say fuck it and force del() the object + var/delslasttick = 0 // number of del()'s we've done this tick + var/gcedlasttick = 0 // number of things that gc'ed last tick + var/totaldels = 0 + var/totalgcs = 0 + + var/highest_del_time = 0 + var/highest_del_tickusage = 0 + + var/list/queue = list() // list of refID's of things that should be garbage collected + // refID's are associated with the time at which they time out and need to be manually del() + // we do this so we aren't constantly locating them and preventing them from being gc'd + + var/list/tobequeued = list() //We store the references of things to be added to the queue seperately so we can spread out GC overhead over a few ticks + + var/list/didntgc = list() // list of all types that have failed to GC associated with the number of times that's happened. + // the types are stored as strings + var/list/sleptDestroy = list() //Same as above but these are paths that slept during their Destroy call + + var/list/noqdelhint = list()// list of all types that do not return a QDEL_HINT + // all types that did not respect qdel(A, force=TRUE) and returned one + // of the immortality qdel hints + var/list/noforcerespect = list() + +#ifdef TESTING + var/list/qdel_list = list() // list of all types that have been qdel()eted +#endif + +/datum/controller/subsystem/garbage/stat_entry(msg) + msg += "Q:[queue.len]|D:[delslasttick]|G:[gcedlasttick]|" + msg += "GR:" + if (!(delslasttick+gcedlasttick)) + msg += "n/a|" + else + msg += "[round((gcedlasttick/(delslasttick+gcedlasttick))*100, 0.01)]%|" + + msg += "TD:[totaldels]|TG:[totalgcs]|" + if (!(totaldels+totalgcs)) + msg += "n/a|" + else + msg += "TGR:[round((totalgcs/(totaldels+totalgcs))*100, 0.01)]%" + ..(msg) + +/datum/controller/subsystem/garbage/Shutdown() + //Adds the del() log to world.log in a format condensable by the runtime condenser found in tools + if(didntgc.len || sleptDestroy.len) + var/list/dellog = list() + for(var/path in didntgc) + dellog += "Path : [path] \n" + dellog += "Failures : [didntgc[path]] \n" + if(path in sleptDestroy) + dellog += "Sleeps : [sleptDestroy[path]] \n" + sleptDestroy -= path + for(var/path in sleptDestroy) + dellog += "Path : [path] \n" + dellog += "Sleeps : [sleptDestroy[path]] \n" + log_misc(dellog.Join()) + +/datum/controller/subsystem/garbage/fire() + HandleToBeQueued() + if(state == SS_RUNNING) + HandleQueue() + + if (state == SS_PAUSED) //make us wait again before the next run. + state = SS_RUNNING + +//If you see this proc high on the profile, what you are really seeing is the garbage collection/soft delete overhead in byond. +//Don't attempt to optimize, not worth the effort. +/datum/controller/subsystem/garbage/proc/HandleToBeQueued() + var/list/tobequeued = src.tobequeued + var/starttime = world.time + var/starttimeofday = world.timeofday + while(tobequeued.len && starttime == world.time && starttimeofday == world.timeofday) + if (MC_TICK_CHECK) + break + var/ref = tobequeued[1] + Queue(ref) + tobequeued.Cut(1, 2) + +/datum/controller/subsystem/garbage/proc/HandleQueue() + delslasttick = 0 + gcedlasttick = 0 + var/time_to_kill = world.time - collection_timeout // Anything qdel() but not GC'd BEFORE this time needs to be manually del() + var/list/queue = src.queue + var/starttime = world.time + var/starttimeofday = world.timeofday + while(queue.len && starttime == world.time && starttimeofday == world.timeofday) + if (MC_TICK_CHECK) + break + var/refID = queue[1] + if (!refID) + queue.Cut(1, 2) + continue + + var/GCd_at_time = queue[refID] + if(GCd_at_time > time_to_kill) + break // Everything else is newer, skip them + queue.Cut(1, 2) + var/datum/A + A = locate(refID) + if (A && A.gc_destroyed == GCd_at_time) // So if something else coincidently gets the same ref, it's not deleted by mistake + #ifdef GC_FAILURE_HARD_LOOKUP + A.find_references() + #endif + + // Something's still referring to the qdel'd object. Kill it. + var/type = A.type + testing("GC: -- \ref[A] | [type] was unable to be GC'd and was deleted --") + didntgc["[type]"]++ + + HardDelete(A) + + ++delslasttick + ++totaldels + else + ++gcedlasttick + ++totalgcs + +/datum/controller/subsystem/garbage/proc/QueueForQueuing(datum/A) + if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) + tobequeued += A + A.gc_destroyed = GC_QUEUED_FOR_QUEUING + +/datum/controller/subsystem/garbage/proc/Queue(datum/A) + if (isnull(A) || (!isnull(A.gc_destroyed) && A.gc_destroyed >= 0)) + return + if (A.gc_destroyed == GC_QUEUED_FOR_HARD_DEL) + HardDelete(A) + return + var/gctime = world.time + var/refid = "\ref[A]" + + A.gc_destroyed = gctime + + if (queue[refid]) + queue -= refid // Removing any previous references that were GC'd so that the current object will be at the end of the list. + + queue[refid] = gctime + +//this is purely to seperate things profile wise. +/datum/controller/subsystem/garbage/proc/HardDelete(datum/A) + var/time = world.timeofday + var/tick = world.tick_usage + var/ticktime = world.time + + var/type = A.type + var/refID = "\ref[A]" + + del(A) + + tick = (world.tick_usage-tick+((world.time-ticktime)/world.tick_lag*100)) + if (tick > highest_del_tickusage) + highest_del_tickusage = tick + time = world.timeofday - time + if (!time && TICK_DELTA_TO_MS(tick) > 1) + time = TICK_DELTA_TO_MS(tick)/100 + if (time > highest_del_time) + highest_del_time = time + if (time > 10) + log_game("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete)") + message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time/10] seconds to delete).") + postpone(time/5) + +/datum/controller/subsystem/garbage/proc/HardQueue(datum/A) + if (istype(A) && A.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) + tobequeued += A + A.gc_destroyed = GC_QUEUED_FOR_HARD_DEL + +/datum/controller/subsystem/garbage/Recover() + if (istype(SSgarbage.queue)) + queue |= SSgarbage.queue + if (istype(SSgarbage.tobequeued)) + tobequeued |= SSgarbage.tobequeued + +// Should be treated as a replacement for the 'del' keyword. +// Datums passed to this will be given a chance to clean up references to allow the GC to collect them. +/proc/qdel(datum/D, force=FALSE) + if(!istype(D)) + del(D) + return +#ifdef TESTING + SSgarbage.qdel_list += D.type +#endif + if(isnull(D.gc_destroyed)) + D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED + var/start_time = world.time + var/hint = D.Destroy(force) // Let our friend know they're about to get fucked up. + if(world.time != start_time) + SSgarbage.sleptDestroy[D.type]++ + if(!D) + return + switch(hint) + if (QDEL_HINT_QUEUE) //qdel should queue the object for deletion. + SSgarbage.QueueForQueuing(D) + if (QDEL_HINT_IWILLGC) + D.gc_destroyed = world.time + return + if (QDEL_HINT_LETMELIVE) //qdel should let the object live after calling destory. + if(!force) + D.gc_destroyed = null //clear the gc variable (important!) + return + // Returning LETMELIVE after being told to force destroy + // indicates the objects Destroy() does not respect force + if(!SSgarbage.noforcerespect[D.type]) + SSgarbage.noforcerespect[D.type] = D.type + crash_with("[D.type] has been force deleted, but is \ + returning an immortal QDEL_HINT, indicating it does \ + not respect the force flag for qdel(). It has been \ + placed in the queue, further instances of this type \ + will also be queued.") + SSgarbage.QueueForQueuing(D) + if (QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() + SSgarbage.HardQueue(D) + if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. + SSgarbage.HardDelete(D) + if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. + SSgarbage.QueueForQueuing(D) + #ifdef TESTING + D.find_references() + #endif + else + if(!SSgarbage.noqdelhint[D.type]) + SSgarbage.noqdelhint[D.type] = D.type + crash_with("[D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.") + SSgarbage.QueueForQueuing(D) + else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) + CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") + +// Default implementation of clean-up code. +// This should be overridden to remove all references pointing to the object being destroyed. +// Return the appropriate QDEL_HINT; in most cases this is QDEL_HINT_QUEUE. +/datum/proc/Destroy(force=FALSE) + tag = null + nanomanager.close_uis(src) + return QDEL_HINT_QUEUE + +/datum/var/gc_destroyed //Time when this object was destroyed. + +#ifdef TESTING +/datum/var/running_find_references +/datum/var/last_find_references = 0 + +/datum/verb/find_refs() + set category = "Debug" + set name = "Find References" + set background = 1 + set src in world + + find_references(FALSE) + +/datum/proc/find_references(skip_alert) + running_find_references = type + if(usr && usr.client) + if(usr.client.running_find_references) + testing("CANCELLED search for references to a [usr.client.running_find_references].") + usr.client.running_find_references = null + running_find_references = null + //restart the garbage collector + SSgarbage.can_fire = 1 + SSgarbage.next_fire = world.time + world.tick_lag + return + + if(!skip_alert) + if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") == "No") + running_find_references = null + return + + //this keeps the garbage collector from failing to collect objects being searched for in here + SSgarbage.can_fire = 0 + + if(usr && usr.client) + usr.client.running_find_references = type + + testing("Beginning search for references to a [type].") + last_find_references = world.time + find_references_in_globals() + for(var/datum/thing in world) + DoSearchVar(thing, "WorldRef: [thing]") + testing("Completed search for references to a [type].") + if(usr && usr.client) + usr.client.running_find_references = null + running_find_references = null + + //restart the garbage collector + SSgarbage.can_fire = 1 + SSgarbage.next_fire = world.time + world.tick_lag + +/client/verb/purge_all_destroyed_objects() + set category = "Debug" + if(SSgarbage) + while(SSgarbage.queue.len) + var/datum/o = locate(SSgarbage.queue[1]) + if(istype(o) && o.gc_destroyed) + del(o) + SSgarbage.totaldels++ + SSgarbage.queue.Cut(1, 2) + +/datum/verb/qdel_then_find_references() + set category = "Debug" + set name = "qdel() then Find References" + set background = 1 + set src in world + + qdel(src) + if(!running_find_references) + find_references(TRUE) + +/client/verb/show_qdeleted() + set category = "Debug" + set name = "Show qdel() Log" + set desc = "Render the qdel() log and display it" + + var/dat = "List of things that have been qdel()eted this round

" + + var/tmplist = list() + for(var/elem in SSgarbage.qdel_list) + if(!(elem in tmplist)) + tmplist[elem] = 0 + tmplist[elem]++ + + for(var/path in tmplist) + dat += "[path] - [tmplist[path]] times
" + + usr << browse(dat, "window=qdeletedlog") + +/datum/proc/DoSearchVar(X, Xname) + if(usr && usr.client && !usr.client.running_find_references) return + if(istype(X, /datum)) + var/datum/D = X + if(D.last_find_references == last_find_references) + return + D.last_find_references = last_find_references + for(var/V in D.vars) + for(var/varname in D.vars) + var/variable = D.vars[varname] + if(variable == src) + testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]") + else if(islist(variable)) + if(src in variable) + testing("Found [src.type] \ref[src] in [D.type]'s [varname] list var. Global: [Xname]") +#ifdef GC_FAILURE_HARD_LOOKUP + for(var/I in variable) + DoSearchVar(I, TRUE) + else + DoSearchVar(variable, "[Xname]: [varname]") +#endif + else if(islist(X)) + if(src in X) + testing("Found [src.type] \ref[src] in list [Xname].") +#ifdef GC_FAILURE_HARD_LOOKUP + for(var/I in X) + DoSearchVar(I, Xname + ": list") +#else + CHECK_TICK +#endif + +//if find_references isn't working for some datum +//update this list using tools/GenerateGlobalVarAccess +/datum/proc/find_references_in_globals() + // TODO - Impement Global Variable Access + // for(var/global_var in _all_globals) + // DoSearchVar(readglobal(global_var), "Global: [global_var]") +#endif + + +/image/Destroy() + ..() + return QDEL_HINT_HARDDEL_NOW diff --git a/code/controllers/subsystems/lighting.dm b/code/controllers/subsystems/lighting.dm new file mode 100644 index 00000000000..dd59d0629cd --- /dev/null +++ b/code/controllers/subsystems/lighting.dm @@ -0,0 +1,166 @@ +/* +** Lighting Subsystem - Process the lighting! Do it! +*/ + +#define SSLIGHTING_STAGE_LIGHTS 1 +#define SSLIGHTING_STAGE_CORNERS 2 +#define SSLIGHTING_STAGE_OVERLAYS 3 +#define SSLIGHTING_STAGE_DONE 4 +// This subsystem's fire() method also gets called once during Master.Initialize(). +// During this fire we need to use CHECK_TICK to sleep and continue, but in all other fires we need to use MC_CHECK_TICK to pause and return. +// This leads us to a rather annoying little tidbit of code that I have stuffed into this macro so I don't have to see it. +#define DUAL_TICK_CHECK if (init_tick_checks) { CHECK_TICK; } else if (MC_TICK_CHECK) { return; } + +// Globals +/var/lighting_overlays_initialised = FALSE +/var/list/lighting_update_lights = list() // List of lighting sources queued for update. +/var/list/lighting_update_corners = list() // List of lighting corners queued for update. +/var/list/lighting_update_overlays = list() // List of lighting overlays queued for update. + +SUBSYSTEM_DEF(lighting) + name = "Lighting" + wait = 2 // Ticks, not deciseconds + init_order = INIT_ORDER_LIGHTING + flags = SS_TICKER + + var/list/currentrun = list() + var/stage = null + + var/cost_lights = 0 + var/cost_corners = 0 + var/cost_overlays = 0 + +/datum/controller/subsystem/lighting/Initialize(timeofday) + if(!lighting_overlays_initialised) + // TODO - TG initializes starlight here. + create_all_lighting_overlays() + lighting_overlays_initialised = TRUE + + // Pre-process lighting once before the round starts. + internal_process_lights(FALSE, TRUE) + internal_process_corners(FALSE, TRUE) + internal_process_overlays(FALSE, TRUE) + return ..() + +/datum/controller/subsystem/lighting/fire(resumed = FALSE) + var/timer + if(!resumed) + ASSERT(LAZYLEN(currentrun) == 0) // Santity checks to make sure we don't somehow have items left over from last cycle + ASSERT(stage == null) // Or somehow didn't finish all the steps from last cycle + stage = SSLIGHTING_STAGE_LIGHTS // Start with Step 1 of course + + if(stage == SSLIGHTING_STAGE_LIGHTS) + timer = world.tick_usage + internal_process_lights(resumed) + cost_lights = MC_AVERAGE(cost_lights, TICK_DELTA_TO_MS(world.tick_usage - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + stage = SSLIGHTING_STAGE_CORNERS + + if(stage == SSLIGHTING_STAGE_CORNERS) + timer = world.tick_usage + internal_process_corners(resumed) + cost_corners = MC_AVERAGE(cost_corners, TICK_DELTA_TO_MS(world.tick_usage - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + stage = SSLIGHTING_STAGE_OVERLAYS + + if(stage == SSLIGHTING_STAGE_OVERLAYS) + timer = world.tick_usage + internal_process_overlays(resumed) + cost_overlays = MC_AVERAGE(cost_overlays, TICK_DELTA_TO_MS(world.tick_usage - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + stage = SSLIGHTING_STAGE_DONE + + // Okay, we're done! Woo! Got thru a whole air_master cycle! + ASSERT(LAZYLEN(currentrun) == 0) // Sanity checks to make sure there are really none left + ASSERT(stage == SSLIGHTING_STAGE_DONE) // And that we didn't somehow skip past the last step + currentrun = null + stage = null + +/datum/controller/subsystem/lighting/proc/internal_process_lights(resumed = FALSE, init_tick_checks = FALSE) + if (!resumed) + // We swap out the lists so any additions to the global list during a pause don't make things wierd. + src.currentrun = global.lighting_update_lights + global.lighting_update_lights = list() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/datum/light_source/L = currentrun[currentrun.len] + currentrun.len-- + + if(!L) continue + if(L.check() || L.destroyed || L.force_update) + L.remove_lum() + if(!L.destroyed) + L.apply_lum() + + else if(L.vis_update) //We smartly update only tiles that became (in) visible to use. + L.smart_vis_update() + + L.vis_update = FALSE + L.force_update = FALSE + L.needs_update = FALSE + + DUAL_TICK_CHECK + +/datum/controller/subsystem/lighting/proc/internal_process_corners(resumed = FALSE, init_tick_checks = FALSE) + if (!resumed) + // We swap out the lists so any additions to the global list during a pause don't make things wierd. + src.currentrun = global.lighting_update_corners + global.lighting_update_corners = list() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/datum/lighting_corner/C = currentrun[currentrun.len] + currentrun.len-- + + if(!C) continue + C.update_overlays() + C.needs_update = FALSE + + DUAL_TICK_CHECK + +/datum/controller/subsystem/lighting/proc/internal_process_overlays(resumed = FALSE, init_tick_checks = FALSE) + if (!resumed) + // We swap out the lists so any additions to the global list during a pause don't make things wierd. + src.currentrun = global.lighting_update_overlays + global.lighting_update_overlays = list() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + while(currentrun.len) + var/atom/movable/lighting_overlay/O = currentrun[currentrun.len] + currentrun.len-- + + if(!O) continue + O.update_overlay() + O.needs_update = FALSE + + DUAL_TICK_CHECK + +/datum/controller/subsystem/lighting/stat_entry(msg_prefix) + var/list/msg = list(msg_prefix) + msg += "T:{" + msg += "S [total_lighting_sources] | " + msg += "C [total_lighting_corners] | " + msg += "O [total_lighting_overlays]" + msg += "}" + msg += "C:{" + msg += "S [round(cost_lights, 1)] | " + msg += "C [round(cost_corners, 1)] | " + msg += "O [round(cost_overlays, 1)]" + msg += "}" + ..(msg.Join()) + +#undef DUAL_TICK_CHECK +#undef SSLIGHTING_STAGE_LIGHTS +#undef SSLIGHTING_STAGE_CORNERS +#undef SSLIGHTING_STAGE_OVERLAYS +#undef SSLIGHTING_STAGE_STATS diff --git a/code/controllers/subsystems/mobs.dm b/code/controllers/subsystems/mobs.dm new file mode 100644 index 00000000000..fcca3bd9a24 --- /dev/null +++ b/code/controllers/subsystems/mobs.dm @@ -0,0 +1,38 @@ +// +// Mobs Subsystem - Process mob.Life() +// +SUBSYSTEM_DEF(mobs) + name = "Mobs" + priority = 100 + wait = 2 SECONDS + flags = SS_KEEP_TIMING|SS_NO_INIT + runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME + + var/list/currentrun = list() + +/datum/controller/subsystem/mobs/stat_entry() + ..("P: [global.mob_list.len]") + +/datum/controller/subsystem/mobs/fire(resumed = 0) + if (!resumed) + src.currentrun = mob_list.Copy() + + //cache for sanic speed (lists are references anyways) + var/list/currentrun = src.currentrun + var/times_fired = src.times_fired + while(currentrun.len) + var/mob/M = currentrun[currentrun.len] + currentrun.len-- + + if(QDELETED(M)) + mob_list -= M + else + // Right now mob.Life() is unstable enough I think we need to use a try catch. + // Obviously we should try and get rid of this for performance reasons when we can. + try + M.Life(times_fired) + catch(var/exception/e) + log_runtime(e, M, "Caught by [name] subsystem") + + if (MC_TICK_CHECK) + return diff --git a/code/controllers/subsystems/transcore_vr.dm b/code/controllers/subsystems/transcore_vr.dm new file mode 100644 index 00000000000..4663406485a --- /dev/null +++ b/code/controllers/subsystems/transcore_vr.dm @@ -0,0 +1,133 @@ +//////////////////////////////// +//// Mind/body data storage system +//// for the resleeving tech +//////////////////////////////// + +SUBSYSTEM_DEF(transcore) + name = "Transcore" + priority = 20 + wait = 1 MINUTE + flags = SS_BACKGROUND|SS_NO_TICK_CHECK|SS_NO_INIT + runlevels = RUNLEVEL_GAME + + // THINGS + var/overdue_time = 15 MINUTES + var/core_dumped = FALSE // Core has been dumped! Also set can_fire = 0 when you set this. + + var/datum/transhuman/mind_record/list/backed_up = list() // All known mind records, indexed by MR.mindname/mind.name + var/datum/transhuman/mind_record/list/has_left = list() // Why do we even have this? + var/datum/transhuman/body_record/list/body_scans = list() // All known body records, indexed by BR.mydna.name + +/datum/controller/subsystem/transcore/fire() + for(var/N in backed_up) + var/datum/transhuman/mind_record/curr_MR = backed_up[N] + if(!curr_MR) + log_debug("Tried to process [N] in transcore w/o a record!") + continue + if(curr_MR.one_time) + continue + var/since_backup = world.time - curr_MR.last_update + if(since_backup < overdue_time) + curr_MR.dead_state = MR_NORMAL + else + if(curr_MR.dead_state != MR_DEAD) //First time switching to dead + notify(N) + curr_MR.dead_state = MR_DEAD + +/datum/controller/subsystem/transcore/stat_entry(msg) + if(core_dumped) + msg += "CORE DUMPED | " + msg += "MR: [backed_up.len] | BR: [body_scans.len]" + ..(msg) + +/datum/controller/subsystem/transcore/Recover() + if (istype(SStranscore.body_scans)) + for(var/N in SStranscore.body_scans[N]) + if(N) body_scans[N] = SStranscore.body_scans[N] + if(SStranscore.core_dumped) + core_dumped = TRUE + can_fire = FALSE + else if (istype(SStranscore.backed_up)) + for(var/N in SStranscore.backed_up[N]) + if(N) backed_up[N] = SStranscore.backed_up[N] + +/datum/controller/subsystem/transcore/proc/m_backup(var/datum/mind/mind, var/obj/item/device/nif/nif, var/one_time = FALSE) + ASSERT(mind) + if(!mind.name || core_dumped) + return 0 + + var/datum/transhuman/mind_record/MR + + if(mind.name in backed_up) + MR = backed_up[mind.name] + MR.last_update = world.time + MR.one_time = one_time + + //Pass a 0 to not change NIF status (because the elseif is checking for null) + if(nif) + MR.nif_path = nif.type + MR.nif_durability = nif.durability + var/list/nifsofts = list() + for(var/N in nif.nifsofts) + if(N) + var/datum/nifsoft/nifsoft = N + nifsofts += nifsoft.type + MR.nif_software = nifsofts + else if(isnull(nif)) //Didn't pass anything, so no NIF + MR.nif_path = null + MR.nif_durability = null + MR.nif_software = null + + else + MR = new(mind, mind.current, add_to_db = TRUE, one_time = one_time) + + return 1 + +// Send a past-due notification to the medical radio channel. +/datum/controller/subsystem/transcore/proc/notify(var/name) + ASSERT(name) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) + a.autosay("[name] is past-due for a mind backup. This will be the only notification.", "TransCore Oversight", "Medical") + qdel(a) + +// Called from mind_record to add itself to the transcore. +/datum/controller/subsystem/transcore/proc/add_backup(var/datum/transhuman/mind_record/MR) + ASSERT(MR) + backed_up[MR.mindname] = MR + backed_up = sortAssoc(backed_up) + log_debug("Added [MR.mindname] to transcore DB.") + +// Remove a mind_record from the backup-checking list. Keeps track of it in has_left // Why do we do that? ~Leshana +/datum/controller/subsystem/transcore/proc/stop_backup(var/datum/transhuman/mind_record/MR) + ASSERT(MR) + has_left[MR.mindname] = MR + backed_up.Remove("[MR.mindname]") + MR.cryo_at = world.time + log_debug("Put [MR.mindname] in transcore suspended DB.") + +// Called from body_record to add itself to the transcore. +/datum/controller/subsystem/transcore/proc/add_body(var/datum/transhuman/body_record/BR) + ASSERT(BR) + body_scans[BR.mydna.name] = BR + body_scans = sortAssoc(body_scans) + log_debug("Added [BR.mydna.name] to transcore body DB.") + +// Remove a body record from the database (Usually done when someone cryos) // Why? ~Leshana +/datum/controller/subsystem/transcore/proc/remove_body(var/datum/transhuman/body_record/BR) + ASSERT(BR) + body_scans.Remove("[BR.mydna.name]") + log_debug("Removed [BR.mydna.name] from transcore body DB.") + +// Moves all mind records from the databaes into the disk and shuts down all backup canary processing. +/datum/controller/subsystem/transcore/proc/core_dump(var/obj/item/weapon/disk/transcore/disk) + ASSERT(disk) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) + a.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Command") + a.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Medical") + qdel(a) + + disk.stored += backed_up + backed_up.Cut() + core_dumped = TRUE + can_fire = FALSE + return disk.stored.len diff --git a/code/controllers/verbs.dm b/code/controllers/verbs.dm index 7acc6b28ce6..8339803dd9c 100644 --- a/code/controllers/verbs.dm +++ b/code/controllers/verbs.dm @@ -1,19 +1,57 @@ //TODO: rewrite and standardise all controller datums to the datum/controller type //TODO: allow all controllers to be deleted for clean restarts (see WIP master controller stuff) - MC done - lighting done -/client/proc/restart_controller(controller in list("Supply")) + +// Clickable stat() button. +/obj/effect/statclick + name = "Initializing..." + var/target + +/obj/effect/statclick/New(loc, text, target) //Don't port this to Initialize it's too critical + ..() + name = text + src.target = target + +/obj/effect/statclick/proc/update(text) + name = text + return src + +/obj/effect/statclick/debug + var/class + +/obj/effect/statclick/debug/Click() + if(!usr.client.holder || !target) + return + if(!class) + if(istype(target, /datum/controller/subsystem)) + class = "subsystem" + else if(istype(target, /datum/controller)) + class = "controller" + else if(istype(target, /datum)) + class = "datum" + else + class = "unknown" + + usr.client.debug_variables(target) + message_admins("Admin [key_name_admin(usr)] is debugging the [target] [class].") + + +// Debug verbs. +/client/proc/restart_controller(controller in list("Master", "Failsafe")) set category = "Debug" set name = "Restart Controller" set desc = "Restart one of the various periodic loop controllers for the game (be careful!)" - if(!holder) return - usr = null - src = null + if(!holder) + return switch(controller) - if("Supply") - supply_controller.process() - feedback_add_details("admin_verb","RSupply") + if("Master") + Recreate_MC() + feedback_add_details("admin_verb","RMC") + if("Failsafe") + new /datum/controller/failsafe() + feedback_add_details("admin_verb","RFailsafe") + message_admins("Admin [key_name_admin(usr)] has restarted the [controller] controller.") - return /client/proc/debug_antagonist_template(antag_type in all_antag_types) set category = "Debug" diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index aa06984f692..ba1bb23c33a 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -23,9 +23,15 @@ var/global/list/round_voters = list() // Keeps track of the individuals voting f /datum/controller/vote/New() if(vote != src) if(istype(vote)) - del(vote) + Recover() + qdel(vote) vote = src +/datum/controller/vote/Destroy() + ..() + // Tell qdel() to Del() this object. + return QDEL_HINT_HARDDEL_NOW + /datum/controller/vote/proc/process() //called by master_controller if(mode) // No more change mode votes after the game has started. diff --git a/code/datums/autolathe/arms.dm b/code/datums/autolathe/arms.dm index efe5791b11f..b40bf27e471 100644 --- a/code/datums/autolathe/arms.dm +++ b/code/datums/autolathe/arms.dm @@ -8,29 +8,29 @@ /datum/category_item/autolathe/arms/shotgun_blanks name = "ammunition (12g, blank)" - path =/obj/item/ammo_casing/shotgun/blank + path =/obj/item/ammo_casing/a12g/blank /datum/category_item/autolathe/arms/shotgun_beanbag name = "ammunition (12g, beanbag)" - path =/obj/item/ammo_casing/shotgun/beanbag + path =/obj/item/ammo_casing/a12g/beanbag /datum/category_item/autolathe/arms/shotgun_flash name = "ammunition (12g, flash)" - path =/obj/item/ammo_casing/shotgun/flash + path =/obj/item/ammo_casing/a12g/flash /datum/category_item/autolathe/arms/shotgun name = "ammunition (12g, slug)" - path =/obj/item/ammo_casing/shotgun + path =/obj/item/ammo_casing/a12g hidden = 1 /datum/category_item/autolathe/arms/shotgun_pellet name = "ammunition (12g, pellet)" - path =/obj/item/ammo_casing/shotgun/pellet + path =/obj/item/ammo_casing/a12g/pellet hidden = 1 /datum/category_item/autolathe/arms/stunshell name = "ammunition (stun cartridge, shotgun)" - path =/obj/item/ammo_casing/shotgun/stunshell + path =/obj/item/ammo_casing/a12g/stunshell hidden = 1 ////////////////// @@ -49,119 +49,119 @@ /////// .45 /datum/category_item/autolathe/arms/pistol_45 name = "pistol magazine (.45)" - path =/obj/item/ammo_magazine/c45m + path =/obj/item/ammo_magazine/m45 hidden = 1 /datum/category_item/autolathe/arms/pistol_45p name = "pistol magazine (.45 practice)" - path =/obj/item/ammo_magazine/c45m/practice + path =/obj/item/ammo_magazine/m45/practice /datum/category_item/autolathe/arms/pistol_45r name = "pistol magazine (.45 rubber)" - path =/obj/item/ammo_magazine/c45m/rubber + path =/obj/item/ammo_magazine/m45/rubber /datum/category_item/autolathe/arms/pistol_45f name = "pistol magazine (.45 flash)" - path =/obj/item/ammo_magazine/c45m/flash + path =/obj/item/ammo_magazine/m45/flash /datum/category_item/autolathe/arms/pistol_45uzi name = "uzi magazine (.45)" - path =/obj/item/ammo_magazine/c45uzi + path =/obj/item/ammo_magazine/m45uzi hidden = 1 /datum/category_item/autolathe/arms/tommymag name = "Tommygun magazine (.45)" - path =/obj/item/ammo_magazine/tommymag + path =/obj/item/ammo_magazine/m45tommy hidden = 1 /datum/category_item/autolathe/arms/tommydrum name = "Tommygun drum magazine (.45)" - path =/obj/item/ammo_magazine/tommydrum + path =/obj/item/ammo_magazine/m45tommydrum hidden = 1 /////// 9mm -/obj/item/ammo_magazine/mc9mm/flash - ammo_type =/obj/item/ammo_casing/c9mmf +/obj/item/ammo_magazine/m9mm/flash + ammo_type =/obj/item/ammo_casing/a9mmf -/obj/item/ammo_magazine/mc9mm/rubber +/obj/item/ammo_magazine/m9mm/rubber name = "magazine (9mm rubber)" - ammo_type =/obj/item/ammo_casing/c9mmr + ammo_type =/obj/item/ammo_casing/a9mmr -/obj/item/ammo_magazine/mc9mm/practice +/obj/item/ammo_magazine/m9mm/practice name = "magazine (9mm practice)" - ammo_type =/obj/item/ammo_casing/c9mmp + ammo_type =/obj/item/ammo_casing/a9mmp /datum/category_item/autolathe/arms/pistol_9mm name = "pistol magazine (9mm)" - path =/obj/item/ammo_magazine/mc9mm + path =/obj/item/ammo_magazine/m9mm hidden = 1 /datum/category_item/autolathe/arms/pistol_9mmr name = "pistol magazine (9mm rubber)" - path =/obj/item/ammo_magazine/mc9mm/rubber + path =/obj/item/ammo_magazine/m9mm/rubber /datum/category_item/autolathe/arms/pistol_9mmp name = "pistol magazine (9mm practice)" - path =/obj/item/ammo_magazine/mc9mm/practice + path =/obj/item/ammo_magazine/m9mm/practice /datum/category_item/autolathe/arms/pistol_9mmf name = "pistol magazine (9mm flash)" - path =/obj/item/ammo_magazine/mc9mm/flash + path =/obj/item/ammo_magazine/m9mm/flash /datum/category_item/autolathe/arms/smg_9mm name = "top-mounted SMG magazine (9mm)" - path =/obj/item/ammo_magazine/mc9mmt + path =/obj/item/ammo_magazine/m9mmt hidden = 1 /datum/category_item/autolathe/arms/smg_9mmr name = "top-mounted SMG magazine (9mm rubber)" - path =/obj/item/ammo_magazine/mc9mmt/rubber + path =/obj/item/ammo_magazine/m9mmt/rubber /datum/category_item/autolathe/arms/smg_9mmp name = "top-mounted SMG magazine (9mm practice)" - path =/obj/item/ammo_magazine/mc9mmt/practice + path =/obj/item/ammo_magazine/m9mmt/practice /datum/category_item/autolathe/arms/smg_9mmf name = "top-mounted SMG magazine (9mm flash)" - path =/obj/item/ammo_magazine/mc9mmt/flash + path =/obj/item/ammo_magazine/m9mmt/flash /////// 10mm /datum/category_item/autolathe/arms/smg_10mm name = "SMG magazine (10mm)" - path =/obj/item/ammo_magazine/a10mm + path =/obj/item/ammo_magazine/m10mm hidden = 1 /datum/category_item/autolathe/arms/pistol_50 name = "pistol magazine (.50AE)" - path =/obj/item/ammo_magazine/a50 + path =/obj/item/ammo_magazine/m50 hidden = 1 /////// 5.56mm /datum/category_item/autolathe/arms/rifle_556 name = "rifle magazine (5.56mm)" - path =/obj/item/ammo_magazine/c556 + path =/obj/item/ammo_magazine/m556 hidden = 1 /datum/category_item/autolathe/arms/rifle_556p name = "rifle magazine (5.56mm practice)" - path =/obj/item/ammo_magazine/c556/practice + path =/obj/item/ammo_magazine/m556/practice /datum/category_item/autolathe/arms/machinegun_556 name = "machinegun box magazine (5.56)" - path =/obj/item/ammo_magazine/a556 + path =/obj/item/ammo_magazine/m556saw hidden = 1 /////// 7.62 /datum/category_item/autolathe/arms/rifle_762 name = "rifle magazine (7.62mm)" - path =/obj/item/ammo_magazine/c762 + path =/obj/item/ammo_magazine/m762 hidden = 1 /datum/category_item/autolathe/arms/shotgun_magazine name = "24rnd shotgun magazine (12g)" - path =/obj/item/ammo_magazine/g12 + path =/obj/item/ammo_magazine/m12gdrum hidden = 1 /* @@ -188,57 +188,57 @@ /datum/category_item/autolathe/arms/pistol_45 name = "pistol magazine (.45)" - path =/obj/item/ammo_magazine/c45m/empty + path =/obj/item/ammo_magazine/m45/empty category = "Arms and Ammunition" /datum/category_item/autolathe/arms/pistol_45uzi name = "uzi magazine (.45)" - path =/obj/item/ammo_magazine/c45uzi/empty + path =/obj/item/ammo_magazine/m45uzi/empty category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/tommymag name = "Tommygun magazine (.45)" - path =/obj/item/ammo_magazine/tommymag/empty + path =/obj/item/ammo_magazine/m45tommy/empty category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/tommydrum name = "Tommygun drum magazine (.45)" - path =/obj/item/ammo_magazine/tommydrum/empty + path =/obj/item/ammo_magazine/m45tommydrum/empty category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/pistol_9mm name = "pistol magazine (9mm)" - path =/obj/item/ammo_magazine/mc9mm/empty + path =/obj/item/ammo_magazine/m9mm/empty category = "Arms and Ammunition" /datum/category_item/autolathe/arms/smg_9mm name = "top-mounted SMG magazine (9mm)" - path =/obj/item/ammo_magazine/mc9mmt/empty + path =/obj/item/ammo_magazine/m9mmt/empty category = "Arms and Ammunition" /datum/category_item/autolathe/arms/smg_10mm name = "SMG magazine (10mm)" - path =/obj/item/ammo_magazine/a10mm/empty + path =/obj/item/ammo_magazine/m10mm/empty category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/pistol_50 name = "pistol magazine (.50AE)" - path =/obj/item/ammo_magazine/a50/empty + path =/obj/item/ammo_magazine/m50/empty category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/rifle_556 name = "10rnd rifle magazine (5.56mm)" - path =/obj/item/ammo_magazine/a556/empty + path =/obj/item/ammo_magazine/m556saw/empty category = "Arms and Ammunition" /datum/category_item/autolathe/arms/rifle_556m name = "20rnd rifle magazine (5.56mm)" - path =/obj/item/ammo_magazine/a556m/empty + path =/obj/item/ammo_magazine/m556sawm/empty category = "Arms and Ammunition" hidden = 1 @@ -250,7 +250,7 @@ /datum/category_item/autolathe/arms/rifle_762 name = "20rnd rifle magazine (7.62mm)" - path =/obj/item/ammo_magazine/c762/empty + path =/obj/item/ammo_magazine/m762/empty category = "Arms and Ammunition" hidden = 1 @@ -262,7 +262,7 @@ /datum/category_item/autolathe/arms/shotgun_magazine name = "24rnd shotgun magazine (12g)" - path =/obj/item/ammo_magazine/g12/empty + path =/obj/item/ammo_magazine/m12gdrum/empty category = "Arms and Ammunition" hidden = 1*/ @@ -272,17 +272,17 @@ /datum/category_item/autolathe/arms/speedloader_357 name = "speedloader (.357)" - path =/obj/item/ammo_magazine/a357 + path =/obj/item/ammo_magazine/s357 hidden = 1 /datum/category_item/autolathe/arms/speedloader_38 name = "speedloader (.38)" - path =/obj/item/ammo_magazine/c38 + path =/obj/item/ammo_magazine/s38 hidden = 1 /datum/category_item/autolathe/arms/speedloader_38r name = "speedloader (.38 rubber)" - path =/obj/item/ammo_magazine/c38/rubber + path =/obj/item/ammo_magazine/s38/rubber // Commented out until metal exploits with autolathe is fixed. /*/datum/category_item/autolathe/arms/pistol_clip_45 @@ -335,35 +335,35 @@ /datum/category_item/autolathe/arms/pistol_clip_10mm name = "ammo clip (10mm)" - path =/obj/item/ammo_magazine/clip/a10mm + path =/obj/item/ammo_magazine/clip/c10mm category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/pistol_clip_50 name = "ammo clip (.50AE)" - path =/obj/item/ammo_magazine/clip/a50 + path =/obj/item/ammo_magazine/clip/c50 category = "Arms and Ammunition" hidden = 1 */ /datum/category_item/autolathe/arms/rifle_clip_556 name = "ammo clip (5.56mm)" - path =/obj/item/ammo_magazine/clip/a556 + path =/obj/item/ammo_magazine/clip/c556 category = "Arms and Ammunition" hidden = 1 /datum/category_item/autolathe/arms/rifle_clip_556_practice name = "ammo clip (5.56mm practice)" - path =/obj/item/ammo_magazine/clip/a556/practice + path =/obj/item/ammo_magazine/clip/c556/practice category = "Arms and Ammunition" /datum/category_item/autolathe/arms/rifle_clip_762 name = "ammo clip (7.62mm)" - path =/obj/item/ammo_magazine/clip/a762 + path =/obj/item/ammo_magazine/clip/c762 hidden = 1 /datum/category_item/autolathe/arms/rifle_clip_762_practice name = "ammo clip (7.62mm practice)" - path =/obj/item/ammo_magazine/clip/a762/practice + path =/obj/item/ammo_magazine/clip/c762/practice /datum/category_item/autolathe/arms/knuckledusters name = "knuckle dusters" diff --git a/code/datums/autolathe/arms_vr.dm b/code/datums/autolathe/arms_vr.dm index 9db276b6784..e517c557e01 100644 --- a/code/datums/autolathe/arms_vr.dm +++ b/code/datums/autolathe/arms_vr.dm @@ -1,34 +1,34 @@ /datum/category_item/autolathe/arms/speedloader_357_flash name = "speedloader (.357 flash)" - path =/obj/item/ammo_magazine/a357/flash + path =/obj/item/ammo_magazine/m357/flash hidden = 1 /datum/category_item/autolathe/arms/speedloader_357_stun name = "speedloader (.357 stun)" - path =/obj/item/ammo_magazine/a357/stun + path =/obj/item/ammo_magazine/m357/stun hidden = 1 /datum/category_item/autolathe/arms/speedloader_357_rubber name = "speedloader (.357 rubber)" - path =/obj/item/ammo_magazine/a357/rubber + path =/obj/item/ammo_magazine/m357/rubber hidden = 1 /datum/category_item/autolathe/arms/speedloader_44 name = "speedloader (.44)" - path =/obj/item/ammo_magazine/a44sl + path =/obj/item/ammo_magazine/m44sl hidden = 1 /datum/category_item/autolathe/arms/speedloader_44_rubber name = "speedloader (.44 rubber)" - path =/obj/item/ammo_magazine/a44sl/rubber + path =/obj/item/ammo_magazine/m44sl/rubber hidden = 1 /datum/category_item/autolathe/arms/mag_44 name = "magazine (.44)" - path =/obj/item/ammo_magazine/a44 + path =/obj/item/ammo_magazine/m44 hidden = 1 /datum/category_item/autolathe/arms/mag_44_rubber name = "magazine (.44 rubber)" - path =/obj/item/ammo_magazine/a44/rubber + path =/obj/item/ammo_magazine/m44/rubber hidden = 1 diff --git a/code/datums/helper_datums/global_iterator.dm b/code/datums/helper_datums/global_iterator.dm index 3bf80f06d0d..d511b5d2337 100644 --- a/code/datums/helper_datums/global_iterator.dm +++ b/code/datums/helper_datums/global_iterator.dm @@ -155,4 +155,5 @@ Data storage vars: tag = null arg_list.Cut() stop() + return QDEL_HINT_LETMELIVE //Do not call ..() diff --git a/code/datums/mixed.dm b/code/datums/mixed.dm index f0f0c70abda..ab53596d8cc 100644 --- a/code/datums/mixed.dm +++ b/code/datums/mixed.dm @@ -1,34 +1,47 @@ -//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - -/datum/data - var/name = "data" - var/size = 1.0 - - -/datum/data/function - name = "function" - size = 2.0 - - -/datum/data/function/data_control - name = "data control" - - -/datum/data/function/id_changer - name = "id changer" - - -/datum/data/record - name = "record" - size = 5.0 - var/list/fields = list( ) - - -/datum/data/text - name = "text" - var/data = null - - - -/datum/debug - var/list/debuglist +//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 + +/datum/data + var/name = "data" + var/size = 1.0 + + +/datum/data/function + name = "function" + size = 2.0 + + +/datum/data/function/data_control + name = "data control" + + +/datum/data/function/id_changer + name = "id changer" + + +/datum/data/record + name = "record" + size = 5.0 + var/list/fields = list( ) + +// Mostly used for data_core records, but unfortuantely used some other places too. But mostly here, so lets make a good effort. +// TODO - Some machines/computers might be holding references to us. Lets look into that, but at least for now lets make sure that the manifest is cleaned up. +/datum/data/record/Destroy(var/force) + if(data_core.locked.Find(src)) + if(!force) + crash_with("Someone tried to qdel a record that was in data_core.locked [log_info_line(src)]") + return QDEL_HINT_LETMELIVE + data_core.locked -= src + data_core.medical -= src + data_core.general -= src + data_core.security -= src + ..() + return QDEL_HINT_FINDREFERENCE // If we must, we can resort to QDEL_HINT_HARDDEL. But lets see how this works in practice ~Leshana + +/datum/data/text + name = "text" + var/data = null + + + +/datum/debug + var/list/debuglist diff --git a/code/datums/repositories/decls.dm b/code/datums/repositories/decls.dm index e87be74f531..61b24c21e9e 100644 --- a/code/datums/repositories/decls.dm +++ b/code/datums/repositories/decls.dm @@ -36,4 +36,4 @@ /decls/Destroy() crash_with("Prevented attempt to delete a decl instance: [log_info_line(src)]") - return 1 // Prevents Decl destruction \ No newline at end of file + return QDEL_HINT_LETMELIVE // Prevents Decl destruction diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm new file mode 100644 index 00000000000..4e3259a6de8 --- /dev/null +++ b/code/datums/repositories/radiation.dm @@ -0,0 +1,138 @@ +var/global/repository/radiation/radiation_repository = new() + +/repository/radiation + var/list/sources = list() // all radiation source datums + var/list/sources_assoc = list() // Sources indexed by turf for de-duplication. + var/list/resistance_cache = list() // Cache of turf's radiation resistance. + +// Describes a point source of radiation. Created either in response to a pulse of radiation, or over an irradiated atom. +// Sources will decay over time, unless something is renewing their power! +/datum/radiation_source + var/turf/source_turf // Location of the radiation source. + var/rad_power // Strength of the radiation being emitted. + var/decay = TRUE // True for automatic decay. False if owner promises to handle it (i.e. supermatter) + var/respect_maint = FALSE // True for not affecting RAD_SHIELDED areas. + var/flat = FALSE // True for power falloff with distance. + var/range // Cached maximum range, used for quick checks against mobs. + +/datum/radiation_source/Destroy() + radiation_repository.sources -= src + if(radiation_repository.sources_assoc[src.source_turf] == src) + radiation_repository.sources -= src.source_turf + src.source_turf = null + . = ..() + +/datum/radiation_source/proc/update_rad_power(var/new_power = null) + if(new_power == null || new_power == rad_power) + return // No change + else if(new_power <= 0) + qdel(src) // Decayed to nothing + else + rad_power = new_power + if(!flat) + range = min(round(sqrt(rad_power / config.radiation_lower_limit)), 31) // R = rad_power / dist**2 - Solve for dist + +// Ray trace from all active radiation sources to T and return the strongest effect. +/repository/radiation/proc/get_rads_at_turf(var/turf/T) + if(!istype(T)) return 0 + + . = 0 + for(var/value in sources) + var/datum/radiation_source/source = value + if(source.rad_power < .) + continue // Already being affected by a stronger source + if(source.source_turf.z != T.z) + continue // Radiation is not multi-z + var/dist = get_dist(source.source_turf, T) + if(dist > source.range) + continue // Too far to possibly affect + if(source.respect_maint) + var/atom/A = T.loc + if(A.flags & RAD_SHIELDED) + continue // In shielded area + if(source.flat) + . = max(., source.rad_power) + continue // No need to ray trace for flat field + + // Okay, now ray trace to find resistence! + var/turf/origin = source.source_turf + var/working = source.rad_power + while(origin != T) + origin = get_step_towards(origin, T) //Raytracing + if(!(origin in resistance_cache)) //Only get the resistance if we don't already know it. + origin.calc_rad_resistance() + working = max((working - (origin.cached_rad_resistance * config.radiation_resistance_multiplier)), 0) + if(working <= .) + break // Already affected by a stronger source (or its zero...) + . = max((working * (1 / (dist ** 2))), .) //Butchered version of the inverse square law. Works for this purpose + +// Add a radiation source instance to the repository. It will override any existing source on the same turf. +/repository/radiation/proc/add_source(var/datum/radiation_source/S) + if(!isturf(S.source_turf)) + return + var/datum/radiation_source/existing = sources_assoc[S.source_turf] + if(existing) + qdel(existing) + sources += S + sources_assoc[S.source_turf] = S + +// Creates a temporary radiation source that will decay +/repository/radiation/proc/radiate(source, power) //Sends out a radiation pulse, taking walls into account + if(!(source && power)) //Sanity checking + return + var/datum/radiation_source/S = new() + S.source_turf = get_turf(source) + S.update_rad_power(power) + add_source(S) + +// Sets the radiation in a range to a constant value. +/repository/radiation/proc/flat_radiate(source, power, range, var/respect_maint = FALSE) + if(!(source && power && range)) + return + var/datum/radiation_source/S = new() + S.flat = TRUE + S.range = range + S.respect_maint = respect_maint + S.source_turf = get_turf(source) + S.update_rad_power(power) + add_source(S) + +// Irradiates a full Z-level. Hacky way of doing it, but not too expensive. +/repository/radiation/proc/z_radiate(var/atom/source, power, var/respect_maint = FALSE) + if(!(power && source)) + return + var/turf/epicentre = locate(round(world.maxx / 2), round(world.maxy / 2), source.z) + flat_radiate(epicentre, power, world.maxx, respect_maint) + +/turf + var/cached_rad_resistance = 0 + +/turf/proc/calc_rad_resistance() + cached_rad_resistance = 0 + for(var/obj/O in src.contents) + if(O.rad_resistance) //Override + cached_rad_resistance += O.rad_resistance + + else if(O.density) //So open doors don't get counted + var/material/M = O.get_material() + if(!M) continue + cached_rad_resistance += M.weight + // Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana + radiation_repository.resistance_cache[src] = (length(contents) + 1) + +/turf/simulated/wall/calc_rad_resistance() + radiation_repository.resistance_cache[src] = (length(contents) + 1) + cached_rad_resistance = (density ? material.weight : 0) + +/obj + var/rad_resistance = 0 // Allow overriding rad resistance + +// If people expand the system, this may be useful. Here as a placeholder until then +/atom/proc/rad_act(var/severity) + return 1 + +/mob/living/rad_act(var/severity) + if(severity) + src.apply_effect(severity, IRRADIATE, src.getarmor(null, "rad")) + for(var/atom/I in src) + I.rad_act(severity) diff --git a/code/datums/supplypacks/contraband.dm b/code/datums/supplypacks/contraband.dm index 0c7fd3f4eda..c200e2edda7 100644 --- a/code/datums/supplypacks/contraband.dm +++ b/code/datums/supplypacks/contraband.dm @@ -47,7 +47,7 @@ name = "Surplus militia rifles" contains = list( /obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin = 3, - /obj/item/ammo_magazine/clip/a762 = 6 + /obj/item/ammo_magazine/clip/c762 = 6 ) cost = 50 contraband = 1 diff --git a/code/datums/supplypacks/munitions.dm b/code/datums/supplypacks/munitions.dm index e2df9609adc..b61abb46736 100644 --- a/code/datums/supplypacks/munitions.dm +++ b/code/datums/supplypacks/munitions.dm @@ -27,7 +27,7 @@ name = "Flare guns crate" contains = list( /obj/item/weapon/gun/projectile/sec/flash, - /obj/item/ammo_magazine/c45m/flash, + /obj/item/ammo_magazine/m45/flash, /obj/item/weapon/gun/projectile/shotgun/doublebarrel/flare, /obj/item/weapon/storage/box/flashshells ) @@ -73,7 +73,7 @@ containertype = /obj/structure/closet/crate/secure containername = "Energy marksman crate" access = access_armory - +/* VOREStation edit -- This is a bad idea. /datum/supply_packs/munitions/burstlaser name = "Burst laser crate" contains = list(/obj/item/weapon/gun/energy/gun/burst = 2) @@ -81,7 +81,7 @@ containertype = /obj/structure/closet/crate/secure containername = "Burst laser crate" access = access_armory - +*/ /datum/supply_packs/munitions/ionweapons name = "Electromagnetic weapons crate" contains = list( @@ -129,7 +129,7 @@ contains = list( /obj/item/device/assembly/timer, /obj/item/weapon/gun/projectile/shotgun/pump/rifle/practice = 2, - /obj/item/ammo_magazine/clip/a762/practice = 4, + /obj/item/ammo_magazine/clip/c762/practice = 4, /obj/item/target = 2, /obj/item/target/alien = 2, /obj/item/target/syndicate = 2 @@ -154,9 +154,9 @@ name = "Automatic weapon ammunition crate" num_contained = 6 contains = list( - /obj/item/ammo_magazine/mc9mmt, - /obj/item/ammo_magazine/mc9mmt/rubber, - /obj/item/ammo_magazine/a556 + /obj/item/ammo_magazine/m9mmt, + /obj/item/ammo_magazine/m9mmt/rubber, + /obj/item/ammo_magazine/m556saw ) cost = 25 containertype = /obj/structure/closet/crate/secure diff --git a/code/datums/supplypacks/science_vr.dm b/code/datums/supplypacks/science_vr.dm index 7ffcf0db964..0bc0b3f740d 100644 --- a/code/datums/supplypacks/science_vr.dm +++ b/code/datums/supplypacks/science_vr.dm @@ -49,7 +49,7 @@ containername = "Dangerous Predator crate" access = access_xenobiology -/datum/supply_packs/sci/pred +/datum/supply_packs/sci/pred_doom name = "EXTREMELY Dangerous Predator crate" cost = 200 containertype = /obj/structure/largecrate/animal/dangerous diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm index 4aefe349fdb..03f1296ad9a 100644 --- a/code/datums/uplink/ammunition.dm +++ b/code/datums/uplink/ammunition.dm @@ -8,36 +8,36 @@ /datum/uplink_item/item/ammo/a357 name = ".357 Speedloader" - path = /obj/item/ammo_magazine/a357 + path = /obj/item/ammo_magazine/s357 /datum/uplink_item/item/ammo/mc9mm name = "Pistol Magazine (9mm)" - path = /obj/item/ammo_magazine/mc9mm + path = /obj/item/ammo_magazine/m9mm /datum/uplink_item/item/ammo/c45m name = "Pistol Magazine (.45)" - path = /obj/item/ammo_magazine/c45m + path = /obj/item/ammo_magazine/m45 /datum/uplink_item/item/ammo/c45map name = "Pistol Magazine (.45 AP)" - path = /obj/item/ammo_magazine/c45m/ap + path = /obj/item/ammo_magazine/m45/ap /datum/uplink_item/item/ammo/tommymag name = "Tommygun Magazine (.45)" - path = /obj/item/ammo_magazine/tommymag + path = /obj/item/ammo_magazine/m45tommy /datum/uplink_item/item/ammo/tommymagap name = "Tommygun Magazine (.45 AP)" - path = /obj/item/ammo_magazine/tommymag/ap + path = /obj/item/ammo_magazine/m45tommy/ap /datum/uplink_item/item/ammo/tommydrum name = "Tommygun Drum Magazine (.45)" - path = /obj/item/ammo_magazine/tommydrum + path = /obj/item/ammo_magazine/m45tommydrum item_cost = 40 /datum/uplink_item/item/ammo/tommydrumap name = "Tommygun Drum Magazine (.45 AP)" - path = /obj/item/ammo_magazine/tommydrum/ap + path = /obj/item/ammo_magazine/m45tommydrum/ap /datum/uplink_item/item/ammo/darts name = "Darts" @@ -50,39 +50,39 @@ /datum/uplink_item/item/ammo/c556 name = "Rifle Magazine (5.56mm)" - path = /obj/item/ammo_magazine/c556 + path = /obj/item/ammo_magazine/m556 /datum/uplink_item/item/ammo/c556/ext name = "Rifle Magazine (5.56mm Extended)" - path = /obj/item/ammo_magazine/c556/ext + path = /obj/item/ammo_magazine/m556/ext /datum/uplink_item/item/ammo/c556/ap name = "Rifle Magazine (5.56mm AP)" - path = /obj/item/ammo_magazine/c556/ap + path = /obj/item/ammo_magazine/m556/ap /datum/uplink_item/item/ammo/c556/ap/ext name = "Rifle Magazine (5.56mm AP Extended)" - path = /obj/item/ammo_magazine/c556/ap/ext + path = /obj/item/ammo_magazine/m556/ap/ext /datum/uplink_item/item/ammo/c762 name = "Rifle Magazine (7.62mm)" - path = /obj/item/ammo_magazine/c762 + path = /obj/item/ammo_magazine/m762 /datum/uplink_item/item/ammo/c762/ap name = "Rifle Magazine (7.62mm AP)" - path = /obj/item/ammo_magazine/c762/ap + path = /obj/item/ammo_magazine/m762/ap /datum/uplink_item/item/ammo/a10mm name = "SMG Magazine (10mm)" - path = /obj/item/ammo_magazine/a10mm + path = /obj/item/ammo_magazine/m10mm /datum/uplink_item/item/ammo/a556 name = "Machinegun Magazine (5.56mm)" - path = /obj/item/ammo_magazine/a556 + path = /obj/item/ammo_magazine/m556saw /datum/uplink_item/item/ammo/a556/ap name = "Machinegun Magazine (5.56mm AP)" - path = /obj/item/ammo_magazine/a556/ap + path = /obj/item/ammo_magazine/m556saw/ap /datum/uplink_item/item/ammo/g12 name = "12g Shotgun Ammo Box (Slug)" diff --git a/code/datums/weakref.dm b/code/datums/weakref.dm index 1a7d844ca87..348d73b0b23 100644 --- a/code/datums/weakref.dm +++ b/code/datums/weakref.dm @@ -7,7 +7,9 @@ //obtain a weak reference to a datum /proc/weakref(datum/D) - if(D.gcDestroyed) + if(!istype(D)) + return + if(QDELETED(D)) return if(!D.weakref) D.weakref = new/weakref(D) @@ -22,7 +24,7 @@ /weakref/Destroy() // A weakref datum should not be manually destroyed as it is a shared resource, // rather it should be automatically collected by the BYOND GC when all references are gone. - return 0 + return QDEL_HINT_LETMELIVE /weakref/proc/resolve() var/datum/D = locate(ref) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index 066c357a22e..c1ee225dce5 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -48,6 +48,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown" /datum/wires/Destroy() holder = null + signallers.Cut() return ..() /datum/wires/proc/GenerateWires() diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index be536612b4c..5d869021af9 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -48,7 +48,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station var/obj/machinery/power/apc/apc = null var/no_air = null // var/list/lights // list of all lights on this area - var/list/all_doors = list() //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area + var/list/all_doors = null //Added by Strumpetplaya - Alarm Change - Contains a list of doors adjacent to this area var/firedoors_closed = 0 var/list/ambience = list('sound/ambience/ambigen1.ogg','sound/ambience/ambigen3.ogg','sound/ambience/ambigen4.ogg','sound/ambience/ambigen5.ogg','sound/ambience/ambigen6.ogg','sound/ambience/ambigen7.ogg','sound/ambience/ambigen8.ogg','sound/ambience/ambigen9.ogg','sound/ambience/ambigen10.ogg','sound/ambience/ambigen11.ogg','sound/ambience/ambigen12.ogg','sound/ambience/ambigen14.ogg') var/list/forced_ambience = null diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index db79ad8d51a..e9cd135aec6 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -87,6 +87,8 @@ /area/proc/firedoors_close() if(!firedoors_closed) firedoors_closed = TRUE + if(!all_doors) + return for(var/obj/machinery/door/firedoor/E in all_doors) if(!E.blocked) if(E.operating) @@ -99,6 +101,8 @@ /area/proc/firedoors_open() if(firedoors_closed) firedoors_closed = FALSE + if(!all_doors) + return for(var/obj/machinery/door/firedoor/E in all_doors) if(!E.blocked) if(E.operating) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index fe9f99b0328..64ae0722f83 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -23,16 +23,6 @@ if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING) initialize() -/atom/movable/Del() - if(isnull(gcDestroyed) && loc) - testing("GC: -- [type] was deleted via del() rather than qdel() --") - crash_with("GC: -- [type] was deleted via del() rather than qdel() --") // stick a stack trace in the runtime logs -// else if(isnull(gcDestroyed)) -// testing("GC: [type] was deleted via GC without qdel()") //Not really a huge issue but from now on, please qdel() -// else -// testing("GC: [type] was deleted via GC with qdel()") - ..() - /atom/movable/Destroy() . = ..() if(reagents) @@ -53,7 +43,7 @@ pulledby = null /atom/movable/proc/initialize() - if(!isnull(gcDestroyed)) + if(QDELETED(src)) crash_with("GC: -- [type] had initialize() called after qdel() --") /atom/movable/Bump(var/atom/A, yes) diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index 6866f8fcb46..e13f50075a4 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -90,6 +90,9 @@ var/global/list/datum/dna/gene/dna_genes[0] // VOREStation var/custom_species + var/base_species = "Human" + var/list/species_traits = list() + var/blood_color = "#A10808" // VOREStation // New stuff @@ -105,6 +108,9 @@ var/global/list/datum/dna/gene/dna_genes[0] new_dna.real_name=real_name new_dna.species=species new_dna.body_markings=body_markings.Copy() + new_dna.base_species=base_species //VOREStation Edit + new_dna.species_traits=species_traits.Copy() //VOREStation Edit + new_dna.blood_color=blood_color //VOREStation Edit for(var/b=1;b<=DNA_SE_LENGTH;b++) new_dna.SE[b]=SE[b] if(b<=DNA_UI_LENGTH) @@ -163,6 +169,11 @@ var/global/list/datum/dna/gene/dna_genes[0] // Technically custom_species is not part of the UI, but this place avoids merge problems. src.custom_species = character.custom_species + if(istype(character.species,/datum/species/custom)) + var/datum/species/custom/CS = character.species + src.species_traits = CS.traits.Copy() + src.base_species = CS.base_species + src.blood_color = CS.blood_color // +1 to account for the none-of-the-above possibility SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 4482967cf93..662a522d4a3 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -201,11 +201,16 @@ // Technically custom_species is not part of the UI, but this place avoids merge problems. H.custom_species = dna.custom_species + if(istype(H.species,/datum/species/custom)) + var/datum/species/custom/CS = H.species + var/datum/species/custom/new_CS = CS.produceCopy(dna.base_species,dna.species_traits,src) + new_CS.blood_color = dna.blood_color // VOREStation Edit End + H.force_update_organs() //VOREStation Add - Gotta do this too H.force_update_limbs() - H.update_body(0) + //H.update_body(0) //VOREStation Edit - Done in force_update_limbs already H.update_eyes() H.update_hair() @@ -213,6 +218,13 @@ else return 0 +//VOREStation Add +/mob/living/carbon/human/proc/force_update_organs() + for(var/organ in organs + internal_organs) + var/obj/item/organ/O = organ + O.species = species +//VOREStation Add End + // Used below, simple injection modifier. /proc/probinj(var/pr, var/inj) return prob(pr+inj*pr) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index 6f549d15f4e..90ac43379fa 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -37,7 +37,6 @@ var/global/universe_has_ended = 0 // Apply changes when entering state /datum/universal_state/supermatter_cascade/OnEnter() set background = 1 - garbage_collector.garbage_collect = 0 world << "You are blinded by a brilliant flash of energy." world << sound('sound/effects/cascade.ogg') diff --git a/code/game/gamemodes/events/clang.dm b/code/game/gamemodes/events/clang.dm index 8ab197a1cb4..e88492e5d1a 100644 --- a/code/game/gamemodes/events/clang.dm +++ b/code/game/gamemodes/events/clang.dm @@ -41,6 +41,10 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 if(clong && prob(25)) src.loc = clong.loc + Destroy() + walk(src, 0) // Because we might have called walk_towards, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /proc/immovablerod() var/startx = 0 var/starty = 0 diff --git a/code/game/gamemodes/events/dust.dm b/code/game/gamemodes/events/dust.dm index 2397ae1a142..d7d551396e4 100644 --- a/code/game/gamemodes/events/dust.dm +++ b/code/game/gamemodes/events/dust.dm @@ -90,6 +90,10 @@ The "dust" will damage the hull of the station causin minor hull breaches. walk_towards(src, goal, 1) return + Destroy() + walk(src, 0) // Because we might have called walk_towards, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + touch_map_edge() qdel(src) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 15e4eb48042..34a3e45877f 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -51,6 +51,7 @@ var/global/datum/controller/gameticker/ticker vote.process() if(pregame_timeleft <= 0) current_state = GAME_STATE_SETTING_UP + Master.SetRunLevel(RUNLEVEL_SETUP) while (!setup()) @@ -63,6 +64,7 @@ var/global/datum/controller/gameticker/ticker if((master_mode=="random") || (master_mode=="secret")) if(!runnable_modes.len) current_state = GAME_STATE_PREGAME + Master.SetRunLevel(RUNLEVEL_LOBBY) world << "Unable to choose playable game mode. Reverting to pre-game lobby." return 0 if(secret_force_mode != "secret") @@ -77,6 +79,7 @@ var/global/datum/controller/gameticker/ticker if(!src.mode) current_state = GAME_STATE_PREGAME + Master.SetRunLevel(RUNLEVEL_LOBBY) world << "Serious error in mode setup! Reverting to pre-game lobby." return 0 @@ -88,6 +91,7 @@ var/global/datum/controller/gameticker/ticker if(!src.mode.can_start()) world << "Unable to start [mode.name]. Not enough players, [mode.required_players] players needed. Reverting to pre-game lobby." current_state = GAME_STATE_PREGAME + Master.SetRunLevel(RUNLEVEL_LOBBY) mode.fail_setup() mode = null job_master.ResetOccupations() @@ -116,6 +120,7 @@ var/global/datum/controller/gameticker/ticker shuttle_controller.setup_shuttle_docks() + // TODO - Leshana - Dear God Fix This. Fix all of this. Not just this line, this entire proc. This entire file! spawn(0)//Forking here so we dont have to wait for this to finish mode.post_setup() //Cleanup some stuff @@ -144,6 +149,7 @@ var/global/datum/controller/gameticker/ticker */ processScheduler.start() + Master.SetRunLevel(RUNLEVEL_GAME) if(config.sql_enabled) statistic_cycle() // Polls population totals regularly and stores them in an SQL DB -- TLE @@ -308,6 +314,7 @@ var/global/datum/controller/gameticker/ticker if(!mode.explosion_in_progress && game_finished && (mode_finished || post_game)) current_state = GAME_STATE_FINISHED + Master.SetRunLevel(RUNLEVEL_POSTGAME) spawn declare_completion() diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index ad8b89ec804..f0135c53565 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -133,7 +133,7 @@ /obj/effect/meteor/Destroy() walk(src,0) //this cancels the walk_towards() proc - ..() + return ..() /obj/effect/meteor/New() ..() @@ -271,8 +271,7 @@ if(explode) explosion(src.loc, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 4, flash_range = 6, adminlog = 0) new /obj/effect/decal/cleanable/greenglow(get_turf(src)) - for(var/mob/living/L in view(10, src)) - L.apply_effect(40, IRRADIATE) + radiation_repository.radiate(src, 50) // This meteor fries toasters. /obj/effect/meteor/emp diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index cc0faede190..22c4efd7f19 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -11,7 +11,7 @@ economic_modifier = 1 access = list() //See /datum/job/assistant/get_access() minimal_access = list() //See /datum/job/assistant/get_access() - alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor", "Resident") + alt_titles = list("Technical Assistant","Test Subject","Medical Intern","Research Assistant","Visitor", "Resident") // Test Subject is a VOREStation edit. /datum/job/assistant/equip(var/mob/living/carbon/human/H, var/alt_title) if(!H) return 0 diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 5d105d6e874..59f365dac25 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -231,8 +231,8 @@ department = "Civilian" department_flag = CIVILIAN faction = "Station" - total_positions = 1 - spawn_positions = 1 + total_positions = 2 // VOREStation Edit. Original number is 1. + spawn_positions = 2 // VOREStation Edit. Original number is 1. supervisors = "the head of personnel" selection_color = "#515151" idtype = /obj/item/weapon/card/id/civilian diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 6add65ce553..dd265203d68 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -54,7 +54,7 @@ if(COMPANY_OPPOSED) loyalty = 0.70 //give them an account in the station database - var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * ECO_MODIFIER + var/money_amount = (rand(15,40) + rand(15,40)) * loyalty * economic_modifier * ECO_MODIFIER //VOREStation Edit - Smoothed peaks. var/datum/money_account/M = create_account(H.real_name, money_amount, null) if(H.mind) var/remembered_info = "" diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 2b4eae9a0d3..2e10ed3b1b0 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -73,7 +73,7 @@ visible_message("A red light flashes on \the [src].") return cable.use(amount) - if(deleted(cable)) + if(QDELETED(cable)) cable = null return 1 diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 4d56d6662d9..5696892ddc8 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -8,6 +8,7 @@ use_power = 1 idle_power_usage = 1 active_power_usage = 5 + surgery_odds = 100 var/mob/living/carbon/human/victim = null var/strapped = 0.0 var/obj/machinery/computer/operating/computer = null diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 238bb95efc9..7bcbae5515d 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -291,8 +291,9 @@ var/bloodData[0] if(H.vessel) var/blood_volume = round(H.vessel.get_reagent_amount("blood")) + var/blood_max = H.species.blood_volume bloodData["volume"] = blood_volume - bloodData["percent"] = round(((blood_volume / 560)*100)) + bloodData["percent"] = round(((blood_volume / blood_max)*100)) occupantData["blood"] = bloodData @@ -463,7 +464,8 @@ if(occupant.vessel) var/blood_volume = round(occupant.vessel.get_reagent_amount("blood")) - var/blood_percent = blood_volume / 560 + var/blood_max = occupant.species.blood_volume + var/blood_percent = blood_volume / blood_max blood_percent *= 100 extra_font = " 448 ? "blue" : "red"]>" diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index b7bcc53e91e..deee8ed76b9 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -21,9 +21,9 @@ return 1 /obj/machinery/portable_atmospherics/Destroy() - qdel(air_contents) - qdel(holding) - ..() + qdel_null(air_contents) + qdel_null(holding) + . = ..() /obj/machinery/portable_atmospherics/initialize() . = ..() @@ -40,11 +40,6 @@ else update_icon() -/obj/machinery/portable_atmospherics/Destroy() - qdel(air_contents) - - ..() - /obj/machinery/portable_atmospherics/proc/StandardAirMix() return list( "oxygen" = O2STANDARD * MolesForPressure(), diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 946b18ecc20..eb7b7049ef8 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -145,7 +145,7 @@ if(is_robot_module(O)) return 0 - if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/a357) || istype(O,/obj/item/ammo_magazine/c38)) // Prevents ammo recycling exploit with speedloaders. + if(istype(O,/obj/item/ammo_magazine/clip) || istype(O,/obj/item/ammo_magazine/s357) || istype(O,/obj/item/ammo_magazine/s38)) // Prevents ammo recycling exploit with speedloaders. user << "\The [O] is too hazardous to recycle with the autolathe!" return /* ToDo: Make this actually check for ammo and change the value of the magazine if it's empty. -Spades @@ -263,7 +263,7 @@ stored_material[material] = max(0, stored_material[material] - round(making.resources[material] * mat_efficiency) * multiplier) update_icon() // So lid closes - + sleep(build_time) busy = 0 diff --git a/code/game/machinery/autolathe_vr.dm b/code/game/machinery/autolathe_vr.dm index 0a22326d44e..252a31e6afb 100644 --- a/code/game/machinery/autolathe_vr.dm +++ b/code/game/machinery/autolathe_vr.dm @@ -1,16 +1,16 @@ /datum/category_item/autolathe/arms/classic_smg_9mm name = "SMG magazine (9mm)" - path = /obj/item/ammo_magazine/mc9mml + path = /obj/item/ammo_magazine/m9mml hidden = 1 /datum/category_item/autolathe/arms/classic_smg_9mmr name = "SMG magazine (9mm rubber)" - path = /obj/item/ammo_magazine/mc9mml/rubber + path = /obj/item/ammo_magazine/m9mml/rubber /datum/category_item/autolathe/arms/classic_smg_9mmp name = "SMG magazine (9mm practice)" - path = /obj/item/ammo_magazine/mc9mml/practice + path = /obj/item/ammo_magazine/m9mml/practice /datum/category_item/autolathe/arms/classic_smg_9mmf name = "SMG magazine (9mm flash)" - path = /obj/item/ammo_magazine/mc9mml/flash + path = /obj/item/ammo_magazine/m9mml/flash diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index df414058e5a..a4b28147e38 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -59,7 +59,7 @@ // VOREStation Edit Start - Make mapping with cameras easier if(!c_tag) var/area/A = get_area(src) - c_tag = "[A ? A : "Unknown"] #[rand(111,999)]" + c_tag = "[A ? A.name : "Unknown"] #[rand(111,999)]" ..() // VOREStation Edit End diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 1c3d957b989..1a1bd9a463e 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -181,7 +181,7 @@ use_power(7500) //This might need tweaking. return - else if((occupant.health >= heal_level) && (!eject_wait)) + else if((occupant.health >= heal_level || occupant.health == occupant.maxHealth) && (!eject_wait)) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) audible_message("\The [src] signals that the cloning process is complete.") connected_message("Cloning Process Complete.") diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 009c12403dc..34a9ebd58c9 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -189,7 +189,7 @@ /obj/structure/AIcore/deactivated/Destroy() if(src in empty_playable_ai_cores) empty_playable_ai_cores -= src - ..() + return ..() /obj/structure/AIcore/deactivated/proc/load_ai(var/mob/living/silicon/ai/transfer, var/obj/item/device/aicard/card, var/mob/user) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index a11e94c451a..ab87985c931 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -316,7 +316,7 @@ if(occupant) occupant.forceMove(loc) occupant.resting = 1 - ..() + return ..() /obj/machinery/cryopod/initialize() ..() @@ -432,7 +432,7 @@ else if(control_computer && control_computer.allow_items) control_computer.frozen_items += W - W.loc = null + W.loc = control_computer //VOREStation Edit else W.forceMove(src.loc) @@ -447,12 +447,12 @@ //VOREStation Edit - Resleeving. if(to_despawn.mind) - if(to_despawn.mind.name in transcore.backed_up) - var/datum/transhuman/mind_record/MR = transcore.backed_up[to_despawn.mind.name] - transcore.stop_backup(MR) - if(to_despawn.mind.name in transcore.body_scans) //This uses mind names to avoid people cryo'ing a printed body to delete body scans. - var/datum/transhuman/body_record/BR = transcore.body_scans[to_despawn.mind.name] - transcore.remove_body(BR) + if(to_despawn.mind.name in SStranscore.backed_up) + var/datum/transhuman/mind_record/MR = SStranscore.backed_up[to_despawn.mind.name] + SStranscore.stop_backup(MR) + if(to_despawn.mind.name in SStranscore.body_scans) //This uses mind names to avoid people cryo'ing a printed body to delete body scans. + var/datum/transhuman/body_record/BR = SStranscore.body_scans[to_despawn.mind.name] + SStranscore.remove_body(BR) //VOREStation Edit End - Resleeving. //Handle job slot/tater cleanup. diff --git a/code/game/machinery/doorbell_vr.dm b/code/game/machinery/doorbell_vr.dm new file mode 100644 index 00000000000..b23e4909284 --- /dev/null +++ b/code/game/machinery/doorbell_vr.dm @@ -0,0 +1,158 @@ +////////////////////DOORBELL CHIME/////////////////////////////////////// +/obj/machinery/doorbell_chime + name = "doorbell chime" + desc = "Small wall-mounted chime triggered by a doorbell" + icon = 'icons/obj/machines/doorbell_vr.dmi' + icon_state = "dbchime-standby" + use_power = 1 + idle_power_usage = 10 + active_power_usage = 200 + anchored = 1 + var/id_tag = null + var/chime_sound = 'sound/machines/doorbell.ogg' + +/obj/machinery/doorbell_chime/initialize() + . = ..() + update_icon() + +/obj/machinery/doorbell_chime/proc/chime() + set waitfor = FALSE + if(inoperable()) + return + use_power(active_power_usage) + playsound(src.loc, chime_sound, 75) + icon_state = "dbchime-active" + set_light(2, 0.5, "#33FF33") + visible_message("\The [src]'s light flashes.") + sleep(30) + set_light(0) + update_icon() + +/obj/machinery/doorbell_chime/power_change() + ..() + update_icon() + +/obj/machinery/doorbell_chime/update_icon() + overlays.Cut() + if(panel_open) + overlays += "dbchime-open" + if(inoperable()) + icon_state = "dbchime-off" + if(!id_tag) + icon_state = "dbchime-red" + else + icon_state = "dbchime-standby" + +/obj/machinery/doorbell_chime/attackby(obj/item/W as obj, mob/user as mob) + src.add_fingerprint(user) + if(default_deconstruction_screwdriver(user, W)) + return + else if(default_deconstruction_crowbar(user, W)) + return + else if(default_part_replacement(user, W)) + return + else if(panel_open && istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + if(M.connectable && istype(M.connectable, /obj/machinery/button/doorbell)) + var/obj/machinery/button/doorbell/B = M.connectable + id_tag = B.id + user << "You upload the data from \the [W]'s buffer." + return + ..() + +////////////////////DOORBELL CHIME CONSTRUCTION/////////////////////////////////////// +// We want these to be constructable so more chimes can be added in departments. +/datum/frame/frame_types/doorbell_chime + name = "Doorbell Chime" + frame_class = "alarm" // It isn't an alarm, but thats the construction flow we want. + frame_size = 3 + frame_style = "wall" + circuit = /obj/item/weapon/circuitboard/doorbell_chime + icon_override = 'icons/obj/machines/doorbell_vr.dmi' + x_offset = 32 + y_offset = 32 + +// Annoyingly we need to provide a circuit board even if never seen by players. +// Makes some sense, its how the frame code knows what to actually build. Alternative +// is to make building it a single-step process which is too quick I say. +// This links up the frame_type to the acutal machine to build. Never seen by players. +/obj/item/weapon/circuitboard/doorbell_chime + build_path = /obj/machinery/doorbell_chime + board_type = new /datum/frame/frame_types/doorbell_chime + req_components = list() + +////////////////////DOORBELL SWITCH/////////////////////////////////////// + +/obj/machinery/button/doorbell + name = "doorbell switch" + desc = "A doorbell, press to chime." + icon = 'icons/obj/machines/doorbell_vr.dmi' + icon_state = "doorbell-standby" + use_power = 0 + +/obj/machinery/button/doorbell/New(var/loc, var/dir, var/building = 0) + ..() + if(building) + pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32) + pixel_y = (dir & 3)? (dir ==1 ? -27 : 27) : 0 + if (!id) + assign_uid() + id = num2text(uid) + +/obj/machinery/button/doorbell/initialize() + . = ..() + update_icon() + +/obj/machinery/button/doorbell/power_change() + ..() + update_icon() + +/obj/machinery/button/doorbell/update_icon() + if(stat & (NOPOWER|BROKEN)) + icon_state = "doorbell-off" + else + icon_state = "doorbell-standby" + +/obj/machinery/button/doorbell/attack_hand(mob/user as mob) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if(..()) + return + use_power(5) + flick("doorbell-active", src) + + for(var/obj/machinery/doorbell_chime/M in machines) + if(M.id_tag == id) + M.chime() + +/obj/machinery/button/doorbell/attackby(obj/item/W as obj, mob/user as mob) + src.add_fingerprint(user) + if(default_deconstruction_screwdriver(user, W)) + return + else if(panel_open && istype(W, /obj/item/weapon/pen)) + var/t = sanitizeSafe(input(user, "Enter the name for \the [src].", src.name, initial(src.name)), MAX_NAME_LEN) + if(t && in_range(src, user)) + name = t + else if(panel_open && istype(W, /obj/item/device/multitool)) + var/obj/item/device/multitool/M = W + M.connectable = src + to_chat(user, "You save the data in \the [M]'s buffer.") + else if(istype(W, /obj/item/weapon/wrench)) + to_chat(user, "You start to unwrench \the [src].") + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + if(do_after(user, 15) && !QDELETED(src)) + to_chat(user, "You unwrench \the [src].") + new /obj/item/frame/doorbell(src.loc) + qdel(src) + return + +////////////////////DOORBELL SWITCH CONSTRUCTION/////////////////////////////////////// +// Right now they are very simple to construct, just throw them up on the wall + +/obj/item/frame/doorbell + name = "doorbell switch frame" + desc = "Used for building doorbell switches." + icon = 'icons/obj/machines/doorbell_vr.dmi' + icon_state = "doorbell-off" + refund_amt = 4 + refund_type = /obj/item/stack/material/wood + build_machine_type = /obj/machinery/button/doorbell diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index f3a0fd68f08..05600494cd2 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -103,7 +103,7 @@ /obj/machinery/door/airlock/maintenance name = "Maintenance Access" icon = 'icons/obj/doors/Doormaint.dmi' - req_one_access = list(access_maint_tunnels) + //req_one_access = list(access_maint_tunnels) //VOREStation Edit - Maintenance is open access assembly_type = /obj/structure/door_assembly/door_assembly_mai /obj/machinery/door/airlock/maintenance/cargo @@ -321,6 +321,7 @@ icon = 'icons/obj/doors/Dooruranium.dmi' mineral = "uranium" var/last_event = 0 + var/rad_power = 7.5 /obj/machinery/door/airlock/process() // Deliberate no call to parent. @@ -338,15 +339,10 @@ /obj/machinery/door/airlock/uranium/process() if(world.time > last_event+20) if(prob(50)) - radiate() + radiation_repository.radiate(src, rad_power) last_event = world.time ..() -/obj/machinery/door/airlock/uranium/proc/radiate() - for(var/mob/living/L in range (3,src)) - L.apply_effect(15,IRRADIATE,0) - return - /obj/machinery/door/airlock/phoron name = "Phoron Airlock" desc = "No way this can end badly." @@ -818,6 +814,9 @@ About the new airlock wires panel: update_icon() return 1 +/obj/machinery/door/airlock/proc/can_remove_electronics() + return src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) + /obj/machinery/door/airlock/attackby(C as obj, mob/user as mob) //world << text("airlock attackby src [] obj [] mob []", src, C, user) if(!istype(usr, /mob/living/silicon)) @@ -863,7 +862,7 @@ About the new airlock wires panel: var/obj/item/weapon/pai_cable/cable = C cable.plugin(src, user) else if(!repairing && istype(C, /obj/item/weapon/crowbar)) - if(src.p_open && (operating < 0 || (!operating && welded && !src.arePowerSystemsOn() && density && (!src.locked || (stat & BROKEN)))) ) + if(can_remove_electronics()) playsound(src.loc, 'sound/items/Crowbar.ogg', 75, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") if(do_after(user,40)) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 805bb7dba9b..ba8aa85b2c7 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -145,7 +145,7 @@ obj/machinery/door/airlock/New() obj/machinery/door/airlock/Destroy() if(frequency && radio_controller) radio_controller.remove_object(src,frequency) - ..() + return ..() obj/machinery/airlock_sensor icon = 'icons/obj/airlock_machines.dmi' @@ -220,7 +220,7 @@ obj/machinery/airlock_sensor/New() obj/machinery/airlock_sensor/Destroy() if(radio_controller) radio_controller.remove_object(src,frequency) - ..() + return ..() obj/machinery/airlock_sensor/airlock_interior command = "cycle_interior" @@ -292,7 +292,7 @@ obj/machinery/access_button/New() obj/machinery/access_button/Destroy() if(radio_controller) radio_controller.remove_object(src, frequency) - ..() + return ..() obj/machinery/access_button/airlock_interior frequency = 1379 diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 3d899377cca..41680d3de76 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -13,7 +13,7 @@ icon = 'icons/obj/doors/rapid_pdoor.dmi' icon_state = null min_force = 20 //minimum amount of force needed to damage the door with a melee weapon - + var/material/implicit_material // Icon states for different shutter types. Simply change this instead of rewriting the update_icon proc. var/icon_state_open = null var/icon_state_opening = null @@ -29,6 +29,13 @@ //turning this off prevents awkward zone geometry in places like medbay lobby, for example. block_air_zones = 0 +/obj/machinery/door/blast/initialize() + ..() + implicit_material = get_material_by_name("plasteel") + +/obj/machinery/door/blast/get_material() + return implicit_material + // Proc: Bumped() // Parameters: 1 (AM - Atom that tried to walk through this object) // Description: If we are open returns zero, otherwise returns result of parent function. @@ -46,6 +53,7 @@ icon_state = icon_state_closed else icon_state = icon_state_open + radiation_repository.resistance_cache.Remove(get_turf(src)) return // Proc: force_open() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 20356c1a5f2..e1e7200d51e 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -73,8 +73,7 @@ /obj/machinery/door/Destroy() density = 0 update_nearby_tiles() - ..() - return + . = ..() /obj/machinery/door/process() if(close_door_at && world.time >= close_door_at) @@ -364,6 +363,7 @@ icon_state = "door1" else icon_state = "door0" + radiation_repository.resistance_cache.Remove(get_turf(src)) return diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 1162264dd7b..6ccbb46ac18 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -60,18 +60,18 @@ var/area/A = get_area(src) ASSERT(istype(A)) - A.all_doors.Add(src) + LAZYADD(A.all_doors, src) areas_added = list(A) for(var/direction in cardinal) A = get_area(get_step(src,direction)) if(istype(A) && !(A in areas_added)) - A.all_doors.Add(src) + LAZYADD(A.all_doors, src) areas_added += A /obj/machinery/door/firedoor/Destroy() for(var/area/A in areas_added) - A.all_doors.Remove(src) + LAZYREMOVE(A.all_doors, src) . = ..() /obj/machinery/door/firedoor/get_material() diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index a7c75e62530..8fb012f8709 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -12,11 +12,9 @@ create_fillers() /obj/machinery/door/airlock/multi_tile/Destroy() - if(filler1) - qdel(filler1) - if(filler2) - qdel(filler2) - ..() + qdel_null(filler1) + qdel_null(filler2) + return ..() /obj/machinery/door/airlock/multi_tile/Move() . = ..() @@ -82,4 +80,4 @@ /obj/machinery/door/airlock/multi_tile/metal/mait icon = 'icons/obj/doors/Door2x1_Maint.dmi' - req_one_access = list(access_maint_tunnels) + //req_one_access = list(access_maint_tunnels) //VOREStaiton Edit - Maintenance is open access diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 13352a16450..32ad7a2aaed 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -60,7 +60,7 @@ /obj/machinery/door/window/Destroy() density = 0 update_nearby_tiles() - ..() + return ..() /obj/machinery/door/window/Bumped(atom/movable/AM as mob|obj) if (!( ismob(AM) )) diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index e609efdf264..04c4b5452c2 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -150,7 +150,7 @@ var/list/floor_light_cache = list() var/area/A = get_area(src) if(A) on = 0 - ..() + . = ..() /obj/machinery/floor_light/cultify() default_light_colour = "#FF0000" diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index ccdd4db1552..c88fb4f31b3 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -214,7 +214,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ /obj/machinery/hologram/holopad/Destroy() for (var/mob/living/silicon/ai/master in masters) clear_holo(master) - ..() + return ..() /* Holographic project of everything else. diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 4abdb685d05..06228dd86f8 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -485,7 +485,7 @@ Buildable meters var/turf/T = P.loc P.level = !T.is_plating() ? 2 : 1 P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() @@ -504,7 +504,7 @@ Buildable meters var/turf/T = P.loc P.level = !T.is_plating() ? 2 : 1 P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() @@ -523,7 +523,7 @@ Buildable meters var/turf/T = P.loc P.level = !T.is_plating() ? 2 : 1 P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() @@ -542,7 +542,7 @@ Buildable meters var/turf/T = P.loc P.level = !T.is_plating() ? 2 : 1 P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() @@ -559,7 +559,7 @@ Buildable meters P.initialize_directions = pipe_dir //this var it's used to know if the pipe is bent or not P.initialize_directions_he = pipe_dir P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() @@ -594,7 +594,7 @@ Buildable meters var/turf/T = M.loc M.level = !T.is_plating() ? 2 : 1 M.initialize() - if (deleted(M)) + if (QDELETED(M)) usr << pipefailtext return 1 M.build_network() @@ -663,7 +663,7 @@ Buildable meters var/turf/T = M.loc M.level = !T.is_plating() ? 2 : 1 M.initialize() - if (deleted(M)) + if (QDELETED(M)) usr << pipefailtext return 1 M.build_network() @@ -740,7 +740,7 @@ Buildable meters P.initialize_directions = src.get_pdir() P.initialize_directions_he = src.get_hdir() P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext //"There's nothing to connect this pipe to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" return 1 P.build_network() @@ -922,7 +922,7 @@ Buildable meters var/turf/T = P.loc P.level = !T.is_plating() ? 2 : 1 P.initialize() - if (deleted(P)) + if (QDELETED(P)) usr << pipefailtext return 1 P.build_network() diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index 40726825a19..c960879e540 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -23,9 +23,8 @@ update_icon() /obj/machinery/pipelayer/Destroy() - qdel(W) - W = null - ..() + qdel_null(W) + . = ..() /obj/machinery/pipelayer/RefreshParts() var/mb_rating = 0 diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 39d23d03fd0..44a112cab5f 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -8,7 +8,7 @@ obj/machinery/recharger idle_power_usage = 4 active_power_usage = 40000 //40 kW var/obj/item/charging = null - var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric) + var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell, /obj/item/device/flashlight, /obj/item/device/electronic_assembly, /obj/item/weapon/weldingtool/electric, /obj/item/ammo_casing/nsfw_batt) //VOREStation Add - NSFW Batteries var/icon_state_charged = "recharger2" var/icon_state_charging = "recharger1" var/icon_state_idle = "recharger0" //also when unpowered @@ -187,6 +187,19 @@ obj/machinery/recharger update_use_power(1) return + //VOREStation Add - NSFW Batteries + if(istype(charging, /obj/item/ammo_casing/nsfw_batt)) + var/obj/item/ammo_casing/nsfw_batt/batt = charging + if(batt.shots_left >= initial(batt.shots_left)) + icon_state = icon_state_charged + update_use_power(1) + else + icon_state = icon_state_charging + batt.shots_left++ + update_use_power(2) + return + //VOREStation Add End + /obj/machinery/recharger/emp_act(severity) if(stat & (NOPOWER|BROKEN) || !anchored) ..(severity) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 306fbcad9ca..dd07ac5b29d 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -97,7 +97,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() req_console_supplies -= department if(departmentType & RC_INFO) req_console_information -= department - ..() + return ..() /obj/machinery/requests_console/attack_hand(user as mob) if(..(user)) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 5739a6f33e3..b18284fab8b 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1028,7 +1028,7 @@ icon_state = "engivend" icon_deny = "engivend-deny" req_access = list(access_engine_equip) - products = list(/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/cell/high = 10, + products = list(/obj/item/device/geiger = 4,/obj/item/clothing/glasses/meson = 2,/obj/item/device/multitool = 4,/obj/item/weapon/cell/high = 10, /obj/item/weapon/airlock_electronics = 10,/obj/item/weapon/module/power_control = 10, /obj/item/weapon/circuitboard/airalarm = 10,/obj/item/weapon/circuitboard/firealarm = 10,/obj/item/weapon/circuitboard/status_display = 2, /obj/item/weapon/circuitboard/ai_status_display = 2,/obj/item/weapon/circuitboard/newscaster = 2,/obj/item/weapon/circuitboard/holopad = 2, diff --git a/code/game/machinery/vending_vr.dm b/code/game/machinery/vending_vr.dm index e7541bc5b14..dd51fc712dd 100644 --- a/code/game/machinery/vending_vr.dm +++ b/code/game/machinery/vending_vr.dm @@ -6,7 +6,7 @@ /obj/machinery/vending/security/New() products += list(/obj/item/weapon/gun/energy/taser = 8,/obj/item/weapon/gun/energy/stunrevolver = 4, /obj/item/weapon/reagent_containers/spray/pepper = 6,/obj/item/taperoll/police = 6, - /obj/item/weapon/gun/projectile/sec/flash = 4, /obj/item/ammo_magazine/c45m/flash = 8, + /obj/item/weapon/gun/projectile/sec/flash = 4, /obj/item/ammo_magazine/m45/flash = 8, /obj/item/clothing/glasses/omnihud/sec = 6) ..() diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index cf962603589..f2456828612 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -115,7 +115,7 @@ user << "You can't fit \the [W] inside." return - else if(istype(W, /obj/item/clothing)) + else if(istype(W, /obj/item/clothing) || istype(W, /obj/item/weapon/bedsheet)) if(washing.len < 5) if(state in list(1, 3)) user.drop_item() diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 9b2e0aa26dc..4d7ee902d8c 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -973,11 +973,7 @@ process(var/obj/item/mecha_parts/mecha_equipment/generator/nuclear/EG) if(..()) - for(var/mob/living/carbon/M in view(EG.chassis)) - if(istype(M,/mob/living/carbon/human)) - M.apply_effect((EG.rad_per_cycle*3),IRRADIATE,0) - else - M.apply_effect(EG.rad_per_cycle, IRRADIATE) + radiation_repository.radiate(EG, (EG.rad_per_cycle * 3)) return 1 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 09ff0075dbf..5d7d16a1261 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -140,18 +140,14 @@ cell = null internal_tank = null - qdel(pr_int_temp_processor) - qdel(pr_inertial_movement) - qdel(pr_give_air) - qdel(pr_internal_damage) - qdel(spark_system) - pr_int_temp_processor = null - pr_give_air = null - pr_internal_damage = null - spark_system = null + qdel_null(pr_int_temp_processor) + qdel_null(pr_inertial_movement) + qdel_null(pr_give_air) + qdel_null(pr_internal_damage) + qdel_null(spark_system) mechas_list -= src //global mech list - ..() + . = ..() //////////////////////// ////// Helpers ///////// diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 8dfe6270308..c963a902bb4 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -21,11 +21,6 @@ if(can_buckle && istype(M)) user_buckle_mob(M, user) -//Cleanup -/obj/Del() - unbuckle_mob() - return ..() - /obj/Destroy() unbuckle_mob() return ..() diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 45cfcc83488..be7e759a636 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -12,6 +12,10 @@ create_reagents(500) return +/obj/effect/effect/smoke/chem/Destroy() + walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /datum/effect/effect/system/smoke_spread/chem smoke_type = /obj/effect/effect/smoke/chem var/obj/chemholder @@ -166,7 +170,7 @@ sleep(150+rand(0,20)) // turning it off before it is deleted results in cleaner smoke.set_opacity(0) // lighting and view range updates fadeOut(smoke) - qdel(src) + qdel(smoke) /datum/effect/effect/system/smoke_spread/chem/spores/spawnSmoke(var/turf/T, var/icon/I, var/dist = 1) var/obj/effect/effect/smoke/chem/spores = new /obj/effect/effect/smoke/chem(location) diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 5f29bd6448e..2c28dd7ecb9 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -139,7 +139,7 @@ /obj/structure/foamedmetal/Destroy() density = 0 update_nearby_tiles(1) - ..() + return ..() /obj/structure/foamedmetal/proc/updateicon() if(metal == 1) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 2343871b95a..a3b3ab81cbe 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -13,11 +13,6 @@ would spawn and follow the beaker, even if it is carried or thrown. unacidable = 1//So effect are not targeted by alien acid. pass_flags = PASSTABLE | PASSGRILLE -/obj/effect/Destroy() - if(reagents) - reagents.delete() - return ..() - /datum/effect/effect/system var/number = 3 var/cardinals = 0 @@ -184,8 +179,10 @@ steam.start() -- spawns the effect /obj/effect/effect/smoke/New() ..() - spawn (time_to_live) - qdel(src) + if(time_to_live) + spawn (time_to_live) + if(!QDELETED(src)) + qdel(src) /obj/effect/effect/smoke/Crossed(mob/living/carbon/M as mob ) ..() diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 4396465bc98..c38b07f4020 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -94,7 +94,7 @@ var/obj/item/organ/external/O = loc O.implants -= src - ..() + return ..() /obj/effect/spider/eggcluster/process() amount_grown += rand(0,2) @@ -138,7 +138,8 @@ /obj/effect/spider/spiderling/Destroy() processing_objects -= src - ..() + walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() /obj/effect/spider/spiderling/Bump(atom/user) if(istype(user, /obj/structure/table)) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 4d77da4ae93..16e27006b49 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -149,12 +149,9 @@ ..() /obj/structure/closet/body_bag/cryobag/Destroy() - if(syringe) - qdel(syringe) - syringe = null - qdel(tank) - tank = null - ..() + qdel_null(syringe) + qdel_null(tank) + return ..() /obj/structure/closet/body_bag/cryobag/open() . = ..() diff --git a/code/game/objects/items/contraband_vr.dm b/code/game/objects/items/contraband_vr.dm index b6dc7576e5b..da8f6cfeeaf 100644 --- a/code/game/objects/items/contraband_vr.dm +++ b/code/game/objects/items/contraband_vr.dm @@ -6,7 +6,7 @@ item_state = "table_parts" w_class = ITEMSIZE_HUGE - attack_self(mob/user as mob) +/obj/item/stolenpackage/attack_self(mob/user as mob) // Another way of doing this. Commented out because the other method is better for this application. /*var/spawn_chance = rand(1,100) switch(spawn_chance) @@ -79,8 +79,8 @@ /obj/random/contraband, /obj/random/weapon/guarenteed) new loot(usr.loc) - usr << "You unwrap the package." - del(src) + to_chat(user, "You unwrap the package.") + qdel(src) /obj/item/weapon/storage/fancy/cigar/havana // Putting this here 'cuz fuck it. -Spades name = "\improper Havana cigar case" diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 27f1d8d4c11..0f92b5ca091 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1469,11 +1469,16 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/Destroy() PDAs -= src - /* VOREStation Removal - if (src.id && prob(90)) //IDs are kept in 90% of the cases - src.id.loc = get_turf(src.loc) - */ - ..() + // VOREStation Edit - Always destroy IDs + // if (src.id && prob(90)) //IDs are kept in 90% of the cases + // src.id.forceMove(get_turf(src.loc)) + // else + // qdel_null(src.id) + qdel_null(src.id) + // VOREStation Edit End + qdel_null(src.cartridge) + qdel_null(src.pai) + return ..() /obj/item/device/pda/clown/Crossed(AM as mob|obj) //Clown PDA is slippery. if (istype(AM, /mob/living)) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 2c4368736e8..c53ba712db4 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -78,6 +78,10 @@ var/list/civilian_cartridges = list( var/message2 var/list/stored_data = list() +/obj/item/weapon/cartridge/Destroy() + qdel_null(radio) + return ..() + /obj/item/weapon/cartridge/engineering name = "\improper Power-ON cartridge" icon_state = "cart-e" @@ -164,10 +168,6 @@ var/list/civilian_cartridges = list( radio = new /obj/item/radio/integrated/signal(src) ..() -/obj/item/weapon/cartridge/signal/Destroy() - qdel(radio) - ..() - /obj/item/weapon/cartridge/quartermaster name = "\improper Space Parts & Space Vendors cartridge" desc = "Perfect for the Quartermaster on the go!" diff --git a/code/game/objects/items/devices/PDA/radio.dm b/code/game/objects/items/devices/PDA/radio.dm index 5e7d63e1e9b..019425db0e8 100644 --- a/code/game/objects/items/devices/PDA/radio.dm +++ b/code/game/objects/items/devices/PDA/radio.dm @@ -103,7 +103,7 @@ /obj/item/radio/integrated/beepsky/Destroy() if(radio_controller) radio_controller.remove_object(src, control_freq) - ..() + return ..() /* * Radio Cartridge, essentially a signaler. @@ -152,4 +152,4 @@ /obj/item/radio/integrated/signal/Destroy() if(radio_controller) radio_controller.remove_object(src, frequency) - ..() + return ..() diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 0bfe99bbb7a..a1f6ee610c9 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -256,12 +256,12 @@ var/global/list/obj/item/device/communicator/all_communicators = list() if(exonet) exonet.remove_address() exonet = null - ..() + return ..() // Proc: ui_interact() // Parameters: 4 (standard NanoUI arguments) // Description: Uses a bunch of for loops to turn lists into lists of lists, so they can be displayed in nanoUI, then displays various buttons to the user. -/obj/item/device/communicator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) +/obj/item/device/communicator/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/key_state = null) // this is the data which will be sent to the ui var/data[0] //General nanoUI information var/communicators[0] //List of communicators @@ -356,7 +356,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() if(!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm - ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 475, 700) + ui = new(user, src, ui_key, "communicator.tmpl", "Communicator", 475, 700, state = key_state) // when the ui is first opened this is the data it will use ui.set_initial_data(data) // open the new ui window @@ -803,7 +803,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() if(exonet) exonet.remove_address() exonet = null - ..() + return ..() // Proc: update_icon() // Parameters: None diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 632f9afdfd9..758678bed97 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -81,7 +81,15 @@ playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) var/flashfail = 0 - if(iscarbon(M)) + //VOREStation Add - NIF + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.nif && H.nif.flag_check(NIF_V_FLASHPROT,NIF_FLAGS_VISION)) + flashfail = 1 + H.nif.notify("High intensity light detected, and blocked!",TRUE) + //VOREStation Add End + + if(iscarbon(M) && !flashfail) //VOREStation Add - NIF var/mob/living/carbon/C = M if(C.stat != DEAD) var/safety = C.eyecheck() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index c3cbf5f7ef3..996f8488491 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -37,7 +37,7 @@ /obj/item/device/flashlight/Destroy() if(power_use) processing_objects -= src - ..() + return ..() /obj/item/device/flashlight/verb/toggle() set name = "Toggle Flashlight Brightness" diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm new file mode 100644 index 00000000000..62cb9d9862c --- /dev/null +++ b/code/game/objects/items/devices/geiger.dm @@ -0,0 +1,53 @@ +#define RAD_LEVEL_LOW 5 //10 // Around the level at which radiation starts to become harmful +#define RAD_LEVEL_MODERATE 15 //15 +#define RAD_LEVEL_HIGH 50 //50 +#define RAD_LEVEL_VERY_HIGH 100 //100 + +//Geiger counter +//Rewritten version of TG's geiger counter +//I opted to show exact radiation levels + +/obj/item/device/geiger + name = "geiger counter" + desc = "A handheld device used for detecting and measuring radiation in an area." + icon_state = "geiger_off" + item_state = "multitool" + w_class = ITEMSIZE_SMALL + var/scanning = 0 + var/radiation_count = 0 + +/obj/item/device/geiger/New() + processing_objects |= src + +/obj/item/device/geiger/process() + if(!scanning) + return + radiation_count = radiation_repository.get_rads_at_turf(get_turf(src)) + update_icon() + +/obj/item/device/geiger/examine(mob/user) + ..(user) + to_chat(user, "[scanning ? "ambient" : "stored"] radiation level: [radiation_count ? radiation_count : "0"]Bq.") + +/obj/item/device/geiger/attack_self(var/mob/user) + scanning = !scanning + update_icon() + to_chat(user, "\icon[src] You switch [scanning ? "on" : "off"] [src].") + +/obj/item/device/geiger/update_icon() + if(!scanning) + icon_state = "geiger_off" + return 1 + + switch(radiation_count) + if(null) icon_state = "geiger_on_1" + if(-INFINITY to RAD_LEVEL_LOW) icon_state = "geiger_on_1" + if(RAD_LEVEL_LOW + 1 to RAD_LEVEL_MODERATE) icon_state = "geiger_on_2" + if(RAD_LEVEL_MODERATE + 1 to RAD_LEVEL_HIGH) icon_state = "geiger_on_3" + if(RAD_LEVEL_HIGH + 1 to RAD_LEVEL_VERY_HIGH) icon_state = "geiger_on_4" + if(RAD_LEVEL_VERY_HIGH + 1 to INFINITY) icon_state = "geiger_on_5" + +#undef RAD_LEVEL_LOW +#undef RAD_LEVEL_MODERATE +#undef RAD_LEVEL_HIGH +#undef RAD_LEVEL_VERY_HIGH \ No newline at end of file diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index e0e05ff4676..8e1803ad401 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -27,7 +27,8 @@ //Will stop people throwing friend pAIs into the singularity so they can respawn if(!isnull(pai)) pai.death(0) - ..() + qdel_null(radio) + return ..() /obj/item/device/paicard/attack_self(mob/user) if (!in_range(src, user)) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 44353d45d24..73fd75740db 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -97,7 +97,7 @@ /obj/item/device/radio/intercom/Destroy() processing_objects -= src - ..() + return ..() /obj/item/device/radio/intercom/attack_ai(mob/user as mob) src.add_fingerprint(user) diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index fcdd22b4419..154861f7940 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -33,10 +33,8 @@ var/global/list/active_radio_jammers = list() /obj/item/device/radio_jammer/Destroy() if(on) turn_off() - if(power_source) - qdel(power_source) - power_source = null - ..() + qdel_null(power_source) + return ..() /obj/item/device/radio_jammer/proc/turn_off(mob/user) if(user) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 5d883784aa0..cfd0693b15d 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -99,6 +99,8 @@ REAGENT SCANNER if(M.status_flags & FAKEDEATH) OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") + if(M.radiation) + user.show_message("Radiation detected.") if(istype(M, /mob/living/carbon)) var/mob/living/carbon/C = M if(C.reagents.total_volume) diff --git a/code/game/objects/items/devices/scanners_vr.dm b/code/game/objects/items/devices/scanners_vr.dm new file mode 100644 index 00000000000..362f1194759 --- /dev/null +++ b/code/game/objects/items/devices/scanners_vr.dm @@ -0,0 +1,214 @@ +var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob + +//SleeveMate! +/obj/item/device/sleevemate + name = "\improper SleeveMate 3200" + desc = "A hand-held sleeve management tool for performing one-time backups and managing mindstates." + icon = 'icons/obj/device_alt.dmi' + icon_state = "sleevemate" + item_state = "healthanalyzer" + flags = CONDUCT + slot_flags = SLOT_BELT + throwforce = 3 + w_class = ITEMSIZE_SMALL + throw_speed = 5 + throw_range = 10 + matter = list(DEFAULT_WALL_MATERIAL = 200) + origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + + var/datum/mind/stored_mind + +/obj/item/device/sleevemate/attack(mob/living/M, mob/living/user) + if(ishuman(M)) + scan_mob(M, user) + else + to_chat(user,"Not a compatible subject to work with!") + +/obj/item/device/sleevemate/attack_self(mob/living/user) + if(!stored_mind) + to_chat(user,"No stored mind in \the [src].") + return + + var/choice = alert(user,"What would you like to do?","Stored: [stored_mind.name]","Delete","Backup","Cancel") + if(!stored_mind || user.get_active_hand() != src) + return + switch(choice) + if("Delete") + to_chat(user,"Internal copy of [stored_mind.name] deleted.") + stored_mind = null + update_icon() + if("Backup") + to_chat(user,"Internal copy of [stored_mind.name] backed up to database.") + SStranscore.m_backup(stored_mind,null,one_time = TRUE) + if("Cancel") + return + +/obj/item/device/sleevemate/proc/scan_mob(mob/living/carbon/human/H, mob/living/user) + var/output = "" + + output += "

[src.name] Scan Results
" + + //Mind name + output += "Sleeved Mind: " + if(H.mind) + output += "[H.mind.name]
" + else + output += "Unknown/None
" + + //Mind status + output += "Mind Status: " + if(H.client) + output += "Healthy
" + else + output += "Space Sleep Disorder
" + + //Body status + output += "Sleeve Status: " + switch(H.stat) + if(CONSCIOUS) + output += "Alive
" + if(UNCONSCIOUS) + output += "Unconscious
" + if(DEAD) + output += "Deceased
" + else + output += "Unknown
" + + //Mind/body comparison + output += "Sleeve Pair: " + if(H.mind && ckey(H.mind.key) != H.ckey) + output += "May not be correct body
" + else if(H.mind && ckey(H.mind.key) == H.ckey) + output += "Appears to be correct mind in body
" + else + output += "Unable to perform comparison
" + + //Actions + output += "
-- Possible Actions --
" + output += "Mind-Scan (One Time): \[Perform\]
" + output += "Body-Scan (One Time): \[Perform\]
" + + //Saving a mind + output += "Store Full Mind: " + if(stored_mind) + output += "Already Stored ([stored_mind.name])
" + else if(H.mind) + output += "\[Perform\]
" + else + output += "Unable
" + + //Soulcatcher transfer + if(stored_mind && H.nif) + var/datum/nifsoft/soulcatcher/SC = H.nif.imp_check(NIF_SOULCATCHER) + if(SC) + output += "Store in Soulcatcher: \[Perform\]
" + + to_chat(user,output) + +/obj/item/device/sleevemate/Topic(href, href_list) + usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + + //Sanity checking/href-hacking checking + if(usr.get_active_hand() != src) + to_chat(usr,"You're not holding \the [src].") + return + + var/target_ref = href_list["target"] + var/mob/living/target = locate(target_ref) in mob_list + if(!target) + to_chat(usr,"Unable to operate on that target.") + return + + if(!usr.Adjacent(target)) + to_chat(usr,"You are too far from that target.") + return + + //The actual options + if(href_list["mindscan"]) + if(!target.mind) + to_chat(usr,"Target seems totally braindead.") + return + + var/nif + if(ishuman(target)) + var/mob/living/carbon/human/H = target + nif = H.nif + + usr.visible_message("[usr] begins scanning [target]'s mind.","You begin scanning [target]'s mind.") + if(do_after(usr,8 SECONDS,target)) + SStranscore.m_backup(target.mind,nif,one_time = TRUE) + to_chat(usr,"Mind backed up!") + else + to_chat(usr,"You must remain close to your target!") + + return + + if(href_list["bodyscan"]) + if(!ishuman(target)) + to_chat(usr,"Target is not of an acceeptable body type.") + return + + var/mob/living/carbon/human/H = target + + usr.visible_message("[usr] begins scanning [target]'s body.","You begin scanning [target]'s body.") + if(do_after(usr,8 SECONDS,target)) + var/datum/transhuman/body_record/BR = new() + BR.init_from_mob(H, TRUE, TRUE) + to_chat(usr,"Body scanned!") + else + to_chat(usr,"You must remain close to your target!") + + return + + if(href_list["mindsteal"]) + if(!target.mind) + to_chat(usr,"Target seems totally braindead.") + return + + var/choice = alert(usr,"This will remove the target's mind from their body. The only way to put it back is via a resleeving pod. Continue?","Confirmation","Continue","Cancel") + if(choice == "Continue" && usr.get_active_hand() == src && usr.Adjacent(target)) + + usr.visible_message("[usr] begins downloading [target]'s mind!","You begin downloading [target]'s mind!") + if(do_after(usr,35 SECONDS,target)) //This is powerful, yo. + if(!stored_mind && target.mind) + stored_mind = target.mind + target.ghostize() + stored_mind.current = null + update_icon() + to_chat(usr,"Mind downloaded!") + + return + + if(href_list["mindput"]) + if(!stored_mind) + to_chat(usr,"\The [src] no longer has a stored mind.") + return + + var/mob/living/carbon/human/H = target + + if(!istype(target)) + return //href hacking only + + if(!H.nif) + return //Lost it? or href hacking + + var/datum/nifsoft/soulcatcher/SC = H.nif.imp_check(NIF_SOULCATCHER) + if(!SC) + return //Uninstalled it? + + //Lazzzyyy. + if(!sleevemate_mob) + sleevemate_mob = new() + + stored_mind.active = TRUE //Setting this causes transfer_to, to key them into the mob + stored_mind.transfer_to(sleevemate_mob) + SC.catch_mob(sleevemate_mob) + stored_mind = null + to_chat(usr,"Mind transferred into Soulcatcher!") + update_icon() + +/obj/item/device/sleevemate/update_icon() + if(stored_mind) + icon_state = "[initial(icon_state)]_on" + else + icon_state = initial(icon_state) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 88b53bd342d..35697914ee7 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -169,7 +169,7 @@ valve_open = 0 - if(deleted(tank_one) || deleted(tank_two)) + if(QDELETED(tank_one) || QDELETED(tank_two)) return var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 84bee725588..649b5677cad 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -27,15 +27,10 @@ /obj/item/weapon/flamethrower/Destroy() - if(weldtool) - qdel(weldtool) - if(igniter) - qdel(igniter) - if(ptank) - qdel(ptank) - ..() - return - + qdel_null(weldtool) + qdel_null(igniter) + qdel_null(ptank) + . = ..() /obj/item/weapon/flamethrower/process() if(!lit) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 0ec3dc13df5..9d6b5d6bd30 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -19,6 +19,11 @@ New() create_reagents(1000) + Destroy() + qdel_null(detonator) + qdel_null_list(beakers) + return ..() + attack_self(mob/user as mob) if(!stage || stage==1) if(detonator) diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index d02ccf21854..940029e735d 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -91,6 +91,10 @@ M << "Your ears start to ring!" M.update_icons() +/obj/item/weapon/grenade/flashbang/Destroy() + walk(src, 0) // Because we might have called walk_away, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /obj/item/weapon/grenade/flashbang/clusterbang//Created by Polymorph, fixed by Sieve desc = "Use of this weapon may constiute a war crime in your area, consult your local Colony Director." name = "clusterbang" diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 6554e80f8bb..806047ae375 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -52,7 +52,7 @@ /obj/item/weapon/implant/Destroy() if(part) part.implants.Remove(src) - ..() + return ..() /obj/item/weapon/implant/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/weapon/implanter)) @@ -452,11 +452,11 @@ the implant may become unstable and either pre-maturely inject the subject or si var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) ) //give the syndies a bit of stealth - a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "General") + a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm") // a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security") // a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical") else - a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "General") + a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm") // a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security") // a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical") qdel(a) @@ -464,13 +464,13 @@ the implant may become unstable and either pre-maturely inject the subject or si if ("emp") var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) var/name = prob(50) ? t.name : pick(teleportlocs) - a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "General") + a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm") // a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security") // a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical") qdel(a) else var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) - a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "General") + a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm") // a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security") // a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical") qdel(a) diff --git a/code/game/objects/items/weapons/implants/implantreagent_vr.dm b/code/game/objects/items/weapons/implants/implantreagent_vr.dm index 615b74ff498..6c7eb572e21 100644 --- a/code/game/objects/items/weapons/implants/implantreagent_vr.dm +++ b/code/game/objects/items/weapons/implants/implantreagent_vr.dm @@ -14,6 +14,8 @@ var/list/self_emote_descriptor = list("transfer") //In format of You [self_emote_descriptor] some [generated_reagent] into [container] var/list/random_emote = list() //An emote the person with the implant may be forced to perform after a prob check, such as [X] meows. var/assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant + var/verb_name = "Transfer From Reagent Implant" + var/verb_desc = "Remove reagents from am internal reagent into a container" /obj/item/weapon/implant/reagent_generator/New() ..() @@ -31,7 +33,7 @@ /obj/item/weapon/implant/reagent_generator/implanted(mob/living/carbon/source) processing_objects += src to_chat(source, "You implant [source] with \the [src].") - source.verbs |= assigned_proc + assigned_proc = new assigned_proc(source, verb_name, verb_desc) return 1 /obj/item/weapon/implant/reagent_generator/process() diff --git a/code/game/objects/items/weapons/material/material_armor.dm b/code/game/objects/items/weapons/material/material_armor.dm index 1041fb5d1fd..990ae376591 100644 --- a/code/game/objects/items/weapons/material/material_armor.dm +++ b/code/game/objects/items/weapons/material/material_armor.dm @@ -42,7 +42,7 @@ Protectiveness | Armor % /obj/item/clothing/Destroy() processing_objects -= src - ..() + return ..() /obj/item/clothing/get_material() return material diff --git a/code/game/objects/items/weapons/material/material_weapons.dm b/code/game/objects/items/weapons/material/material_weapons.dm index 31231964cbe..c778ec07a99 100644 --- a/code/game/objects/items/weapons/material/material_weapons.dm +++ b/code/game/objects/items/weapons/material/material_weapons.dm @@ -71,7 +71,7 @@ /obj/item/weapon/material/Destroy() processing_objects -= src - ..() + . = ..() /obj/item/weapon/material/apply_hit_effect() ..() diff --git a/code/game/objects/items/weapons/mop_deploy.dm b/code/game/objects/items/weapons/mop_deploy.dm index 8baab875285..30a6991a531 100644 --- a/code/game/objects/items/weapons/mop_deploy.dm +++ b/code/game/objects/items/weapons/mop_deploy.dm @@ -26,7 +26,7 @@ T.dirt = 0 for(var/obj/effect/O in src) if(istype(O,/obj/effect/rune) || istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay)) - del(O) + qdel(O) /* //Reagent code changed at some point and the below doesn't work. To be fixed later. source.reagents.reaction(src, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly. source.reagents.remove_any(1) //reaction() doesn't use up the reagents @@ -47,16 +47,16 @@ return ..() -/obj/item/weapon/mop_deploy/Del() +/obj/item/weapon/mop_deploy/Destroy() processing_objects -= src - ..() + . = ..() /obj/item/weapon/mop_deploy/attack_self(mob/user as mob) user.drop_from_inventory(src) - spawn(1) if(src) del(src) + spawn(1) if(!QDELETED(src)) qdel(src) /obj/item/weapon/mop_deploy/dropped() - spawn(1) if(src) del(src) + spawn(1) if(!QDELETED(src)) qdel(src) /obj/item/weapon/mop_deploy/process() if(!creator || loc != creator || !creator.item_is_in_hands(src)) @@ -71,4 +71,4 @@ host.pinned -= src host.embedded -= src host.drop_from_inventory(src) - spawn(1) if(src) del(src) \ No newline at end of file + spawn(1) if(!QDELETED(src)) qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 06fd49d0e38..dfa4f61ba13 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -124,7 +124,7 @@ /obj/item/weapon/handcuffs, /obj/item/device/flash, /obj/item/clothing/glasses, - /obj/item/ammo_casing/shotgun, + /obj/item/ammo_casing/a12g, /obj/item/ammo_magazine, /obj/item/weapon/cell/device, /obj/item/weapon/reagent_containers/food/snacks/donut/, diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 26873e66081..ae74bf8ea5e 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -75,13 +75,14 @@ ..() new /obj/item/clothing/mask/breath(src) new /obj/item/weapon/tank/emergency/phoron_double(src) -//End Edit + new /obj/item/clothing/glasses/goggles(src) /obj/item/weapon/storage/box/engineer/New() ..() new /obj/item/clothing/mask/breath(src) new /obj/item/weapon/tank/emergency/oxygen/engi(src) - + new /obj/item/clothing/glasses/goggles(src) +//VOREStation Edit End /obj/item/weapon/storage/box/gloves name = "box of latex gloves" desc = "Contains white gloves." @@ -151,12 +152,12 @@ /obj/item/weapon/storage/box/blanks/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/blank(src) + new /obj/item/ammo_casing/a12g/blank(src) /obj/item/weapon/storage/box/blanks/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/blank(src) + new /obj/item/ammo_casing/a12g/blank(src) /obj/item/weapon/storage/box/beanbags name = "box of beanbag shells" @@ -167,12 +168,12 @@ /obj/item/weapon/storage/box/beanbags/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/a12g/beanbag(src) /obj/item/weapon/storage/box/beanbags/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/beanbag(src) + new /obj/item/ammo_casing/a12g/beanbag(src) /obj/item/weapon/storage/box/shotgunammo name = "box of shotgun slugs" @@ -183,12 +184,12 @@ /obj/item/weapon/storage/box/shotgunammo/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun(src) + new /obj/item/ammo_casing/a12g(src) /obj/item/weapon/storage/box/shotgunammo/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun(src) + new /obj/item/ammo_casing/a12g(src) /obj/item/weapon/storage/box/shotgunshells name = "box of shotgun shells" @@ -199,12 +200,12 @@ /obj/item/weapon/storage/box/shotgunshells/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/pellet(src) + new /obj/item/ammo_casing/a12g/pellet(src) /obj/item/weapon/storage/box/shotgunshells/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/pellet(src) + new /obj/item/ammo_casing/a12g/pellet(src) /obj/item/weapon/storage/box/flashshells name = "box of illumination shells" @@ -215,12 +216,12 @@ /obj/item/weapon/storage/box/flashshells/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/flash(src) + new /obj/item/ammo_casing/a12g/flash(src) /obj/item/weapon/storage/box/flashshells/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/flash(src) + new /obj/item/ammo_casing/a12g/flash(src) /obj/item/weapon/storage/box/stunshells name = "box of stun shells" @@ -231,12 +232,12 @@ /obj/item/weapon/storage/box/stunshells/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/stunshell(src) + new /obj/item/ammo_casing/a12g/stunshell(src) /obj/item/weapon/storage/box/stunshells/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/stunshell(src) + new /obj/item/ammo_casing/a12g/stunshell(src) /obj/item/weapon/storage/box/practiceshells name = "box of practice shells" @@ -247,12 +248,12 @@ /obj/item/weapon/storage/box/practiceshells/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/practice(src) + new /obj/item/ammo_casing/a12g/practice(src) /obj/item/weapon/storage/box/practiceshells/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/practice(src) + new /obj/item/ammo_casing/a12g/practice(src) /obj/item/weapon/storage/box/empshells name = "box of emp shells" @@ -263,12 +264,12 @@ /obj/item/weapon/storage/box/empshells/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/emp(src) + new /obj/item/ammo_casing/a12g/emp(src) /obj/item/weapon/storage/box/empshells/large/New() ..() for(var/i = 1 to 8) - new /obj/item/ammo_casing/shotgun/emp(src) + new /obj/item/ammo_casing/a12g/emp(src) /obj/item/weapon/storage/box/sniperammo name = "box of 14.5mm shells" diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm index 5457c860e57..c915053c9fa 100644 --- a/code/game/objects/items/weapons/storage/internal.dm +++ b/code/game/objects/items/weapons/storage/internal.dm @@ -12,7 +12,7 @@ /obj/item/weapon/storage/internal/Destroy() master_item = null - ..() + . = ..() /obj/item/weapon/storage/internal/attack_hand() return //make sure this is never picked up diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 3846a44d2b3..db55e95b44d 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -38,15 +38,15 @@ /obj/item/weapon/storage/Destroy() close_all() - qdel(boxes) - qdel(src.storage_start) - qdel(src.storage_continue) - qdel(src.storage_end) - qdel(src.stored_start) - qdel(src.stored_continue) - qdel(src.stored_end) - qdel(closer) - ..() + qdel_null(boxes) + qdel_null(src.storage_start) + qdel_null(src.storage_continue) + qdel_null(src.storage_end) + qdel_null(src.stored_start) + qdel_null(src.stored_continue) + qdel_null(src.stored_end) + qdel_null(closer) + . = ..() /obj/item/weapon/storage/MouseDrop(obj/over_object as obj) if(!canremove) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 573325e0795..d5ac595c1eb 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -27,7 +27,7 @@ if("guns") new /obj/item/weapon/gun/projectile/revolver(src) - new /obj/item/ammo_magazine/a357(src) + new /obj/item/ammo_magazine/s357(src) new /obj/item/weapon/card/emag(src) new /obj/item/weapon/plastique(src) new /obj/item/weapon/plastique(src) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index 41c78ecd3b5..b021424043c 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -24,8 +24,8 @@ ion_trail.set_up(src) /obj/item/weapon/tank/jetpack/Destroy() - qdel(ion_trail) - ..() + qdel_null(ion_trail) + return ..() /obj/item/weapon/tank/jetpack/examine(mob/user) . = ..() diff --git a/code/game/objects/items/weapons/tanks/tank_types_vr.dm b/code/game/objects/items/weapons/tanks/tank_types_vr.dm index 3f9b611a9ff..4d63805768c 100644 --- a/code/game/objects/items/weapons/tanks/tank_types_vr.dm +++ b/code/game/objects/items/weapons/tanks/tank_types_vr.dm @@ -2,10 +2,88 @@ name = "double emergency phoron tank" desc = "An emergency air tank hastily painted red." icon = 'icons/obj/tank_vr.dmi' - icon_state = "emergency_double_nitrogen" - gauge_icon = "indicator_emergency_double" + icon_state = "emergency_double_vox" + gauge_icon = "indicator_double" + gauge_cap = 3 volume = 10 /obj/item/weapon/tank/emergency/phoron_double/New() ..() air_contents.adjust_gas("phoron", (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + +//New icons +/obj/item/weapon/tank/oxygen + icon = 'icons/obj/tank_vr.dmi' + icon_state = "oxygen" + gauge_cap = 3 + gauge_icon = "indicator_bigtank" +// /obj/item/weapon/tank/oxygen/yellow +// /obj/item/weapon/tank/oxygen/red + +/obj/item/weapon/tank/anesthetic + icon = 'icons/obj/tank_vr.dmi' + icon_state = "anesthetic" + gauge_cap = 3 + gauge_icon = "indicator_bigtank" + +/obj/item/weapon/tank/air + icon = 'icons/obj/tank_vr.dmi' + icon_state = "oxygen" + gauge_cap = 3 + gauge_icon = "indicator_bigtank" + +/obj/item/weapon/tank/phoron + icon = 'icons/obj/tank_vr.dmi' + icon_state = "phoron" + +/obj/item/weapon/tank/vox //Can't be a child of phoron or the gas amount gets screwey. + icon = 'icons/obj/tank_vr.dmi' + icon_state = "plasma_fr" + +/obj/item/weapon/tank/emergency + icon = 'icons/obj/tank_vr.dmi' + icon_state = "emergency" + gauge_icon = "indicator_smalltank" + gauge_cap = 3 + +/obj/item/weapon/tank/emergency/oxygen + icon = 'icons/obj/tank_vr.dmi' + icon_state = "emergency" + gauge_icon = "indicator_smalltank" + gauge_cap = 3 + +/obj/item/weapon/tank/emergency/oxygen/engi + icon = 'icons/obj/tank_vr.dmi' + icon_state = "emergency_engi" + gauge_icon = "indicator_engi" + gauge_cap = 3 + +/obj/item/weapon/tank/emergency/oxygen/double + icon = 'icons/obj/tank_vr.dmi' + icon_state = "emergency_double" + gauge_icon = "indicator_double" + gauge_cap = 3 + +/obj/item/weapon/tank/emergency/nitrogen + icon = 'icons/obj/tank_vr.dmi' + icon_state = "emergency_nitrogen" + gauge_icon = "indicator_smalltank" + gauge_cap = 3 + +/obj/item/weapon/tank/emergency/nitrogen/double + icon = 'icons/obj/tank_vr.dmi' + icon_state = "emergency_double_vox" + gauge_icon = "indicator_double" + gauge_cap = 3 + +/obj/item/weapon/tank/emergency/phoron + icon = 'icons/obj/tank_vr.dmi' + icon_state = "emergency_p" + gauge_icon = "indicator_smalltank" + gauge_cap = 3 + +/obj/item/weapon/tank/nitrogen + icon = 'icons/obj/tank_vr.dmi' + icon_state = "oxygen_fr" + gauge_icon = "indicator_bigtank" + gauge_cap = 3 diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 57a5cf06a45..b8daa05d7f3 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -44,8 +44,7 @@ var/list/global/tank_gauge_cache = list() return /obj/item/weapon/tank/Destroy() - if(air_contents) - qdel(air_contents) + qdel_null(air_contents) processing_objects.Remove(src) @@ -53,7 +52,7 @@ var/list/global/tank_gauge_cache = list() var/obj/item/device/transfer_valve/TTV = loc TTV.remove_tank(src) - ..() + return ..() /obj/item/weapon/tank/examine(mob/user) . = ..(user, 0) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 8c4067187fe..80c19b74b29 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -376,6 +376,7 @@ var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES] if(!E) return + if(H.nif && H.nif.flag_check(NIF_V_UVFILTER,NIF_FLAGS_VISION)) return //VOREStation Add - NIF switch(safety) if(1) usr << "Your eyes sting a little." @@ -435,7 +436,7 @@ /obj/item/weapon/weldingtool/experimental/Destroy() processing_objects -= src - ..() + return ..() /obj/item/weapon/weldingtool/experimental/process() ..() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 8dce565f2c8..e8ce7430c9f 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -116,7 +116,7 @@ unbuckle_mob() processing_objects -= src - ..() + return ..() /obj/effect/energy_net/process() if(isnull(buckled_mob) || buckled_mob.loc != loc) diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index e0cb908d697..7b781b93f21 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -290,11 +290,11 @@ prob(2);/obj/item/weapon/storage/box/shotgunammo, prob(4);/obj/item/weapon/storage/box/shotgunshells, prob(1);/obj/item/weapon/storage/box/stunshells, - prob(2);/obj/item/ammo_magazine/c45m, - prob(4);/obj/item/ammo_magazine/c45m/rubber, - prob(4);/obj/item/ammo_magazine/c45m/flash, - prob(2);/obj/item/ammo_magazine/mc9mmt, - prob(6);/obj/item/ammo_magazine/mc9mmt/rubber) + prob(2);/obj/item/ammo_magazine/m45, + prob(4);/obj/item/ammo_magazine/m45/rubber, + prob(4);/obj/item/ammo_magazine/m45/flash, + prob(2);/obj/item/ammo_magazine/m9mmt, + prob(6);/obj/item/ammo_magazine/m9mmt/rubber) /obj/random/action_figure diff --git a/code/game/objects/random/random_vr.dm b/code/game/objects/random/random_vr.dm index 072b853445d..dd873ddd246 100644 --- a/code/game/objects/random/random_vr.dm +++ b/code/game/objects/random/random_vr.dm @@ -88,35 +88,35 @@ item_to_spawn() return pick(prob(5);/obj/item/weapon/storage/box/shotgunammo,\ prob(5);/obj/item/weapon/storage/box/shotgunshells,\ - prob(5);/obj/item/ammo_magazine/a357,\ - prob(5);/obj/item/ammo_magazine/clip/a762,\ - prob(5);/obj/item/ammo_magazine/c45m,\ - prob(5);/obj/item/ammo_magazine/c45m/rubber,\ - prob(5);/obj/item/ammo_magazine/c38,\ - prob(5);/obj/item/ammo_magazine/c38/rubber,\ + prob(5);/obj/item/ammo_magazine/m357,\ + prob(5);/obj/item/ammo_magazine/clip/c762,\ + prob(5);/obj/item/ammo_magazine/m45,\ + prob(5);/obj/item/ammo_magazine/m45/rubber,\ + prob(5);/obj/item/ammo_magazine/s38,\ + prob(5);/obj/item/ammo_magazine/s38/rubber,\ prob(5);/obj/item/weapon/storage/box/flashbangs,\ - prob(5);/obj/item/ammo_magazine/c556,\ - prob(4);/obj/item/ammo_magazine/clip/a556,\ + prob(5);/obj/item/ammo_magazine/m556,\ + prob(4);/obj/item/ammo_magazine/clip/c556,\ prob(4);/obj/item/ammo_magazine/clip/c45,\ prob(4);/obj/item/ammo_magazine/clip/c9mm,\ - prob(4);/obj/item/ammo_magazine/c45uzi,\ - prob(4);/obj/item/ammo_magazine/c556/ext,\ - prob(4);/obj/item/ammo_magazine/mc9mm,\ - prob(4);/obj/item/ammo_magazine/mc9mml,\ - prob(4);/obj/item/ammo_magazine/mc9mmt,\ - prob(4);/obj/item/ammo_magazine/mc9mmt/rubber,\ - prob(4);/obj/item/ammo_magazine/a10mm,\ - prob(4);/obj/item/ammo_magazine/p90,\ + prob(4);/obj/item/ammo_magazine/m45uzi,\ + prob(4);/obj/item/ammo_magazine/m556/ext,\ + prob(4);/obj/item/ammo_magazine/m9mm,\ + prob(4);/obj/item/ammo_magazine/m9mml,\ + prob(4);/obj/item/ammo_magazine/m9mmt,\ + prob(4);/obj/item/ammo_magazine/m9mmt/rubber,\ + prob(4);/obj/item/ammo_magazine/m10mm,\ + prob(4);/obj/item/ammo_magazine/m9mmp90,\ /* prob(4);/obj/item/ammo_magazine/m14,\ prob(4);/obj/item/ammo_magazine/m14/large,\ */ - prob(4);/obj/item/ammo_magazine/c556/ext,\ - prob(4);/obj/item/ammo_magazine/s762,\ - prob(4);/obj/item/ammo_magazine/c762,\ - prob(3);/obj/item/ammo_magazine/clip/a10mm,\ - prob(3);/obj/item/ammo_magazine/clip/a50,\ - prob(3);/obj/item/ammo_magazine/c556,\ - prob(2);/obj/item/ammo_magazine/a50,\ - prob(2);/obj/item/ammo_magazine/a556,\ + prob(4);/obj/item/ammo_magazine/m556/ext,\ + prob(4);/obj/item/ammo_magazine/m762,\ + prob(4);/obj/item/ammo_magazine/m762,\ + prob(3);/obj/item/ammo_magazine/clip/c10mm,\ + prob(3);/obj/item/ammo_magazine/clip/c50,\ + prob(3);/obj/item/ammo_magazine/m556,\ + prob(2);/obj/item/ammo_magazine/m50,\ + prob(2);/obj/item/ammo_magazine/m556,\ prob(1);/obj/item/weapon/storage/box/frags,\ /* prob(1);/obj/item/ammo_magazine/battlerifle,\ */ prob(1);/obj/item/ammo_casing/rocket,\ @@ -126,9 +126,9 @@ prob(1);/obj/item/weapon/storage/box/practiceshells,\ prob(1);/obj/item/weapon/storage/box/stunshells,\ prob(1);/obj/item/weapon/storage/box/blanks,\ - prob(1);/obj/item/ammo_magazine/stg,\ - prob(1);/obj/item/ammo_magazine/tommydrum,\ - prob(1);/obj/item/ammo_magazine/tommymag + prob(1);/obj/item/ammo_magazine/mtg,\ + prob(1);/obj/item/ammo_magazine/m45tommydrum,\ + prob(1);/obj/item/ammo_magazine/m45tommy ) /obj/random/cargopod @@ -157,16 +157,12 @@ prob(2);/obj/item/weapon/reagent_containers/syringe/drugs, prob(1);/obj/item/weapon/reagent_containers/syringe/steroid) -/obj/random_multi/single_item/teleport - name = "Multi Point - Random Teleport Item" - id = "Single Teleporter" - item_path = null - - New() - item_path = pick(list(/obj/item/device/perfect_tele,/obj/item/weapon/bluespace_harpoon)) - ..() - -/obj/random_multi/single_item/netgun - name = "Multi Point - Random Hunter Netgun" - id = "Single Netgun" - item_path = /obj/item/weapon/gun/energy/netgun +//A random thing so that the spawn_nothing_percentage can be used w/o duplicating code. +/obj/random/trash_pile + name = "Random Trash Pile" + desc = "Hot Garbage." + icon = 'icons/obj/trash_piles.dmi' + icon_state = "randompile" + spawn_nothing_percentage = 0 +/obj/random/trash_pile/item_to_spawn() + return /obj/structure/trash_pile \ No newline at end of file diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 928246b2b5c..b41743799bf 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -10,7 +10,7 @@ /obj/structure/Destroy() if(parts) new parts(loc) - ..() + . = ..() /obj/structure/attack_hand(mob/user) if(breakable) @@ -49,9 +49,6 @@ if(climbable) verbs += /obj/structure/proc/climb_on -/obj/structure/Destroy() - ..() - /obj/structure/proc/climb_on() set name = "Climb structure" diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 47507e48b3b..f21c64bed43 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -8,26 +8,18 @@ density = 0 anchored = 1.0 -/obj/structure/catwalk/New() - ..() - spawn(4) - if(src) - for(var/obj/structure/catwalk/C in get_turf(src)) - if(C != src) - qdel(C) - update_icon() - redraw_nearby_catwalks() +/obj/structure/catwalk/initialize() + for(var/obj/structure/catwalk/C in get_turf(src)) + if(C != src) + warning("Duplicate [type] in [loc] ([x], [y], [z])") + qdel(C) + update_icon() /obj/structure/catwalk/Destroy() - ..() - redraw_nearby_catwalks() - -/obj/structure/catwalk/proc/redraw_nearby_catwalks() - for(var/direction in alldirs) - if(locate(/obj/structure/catwalk, get_step(src, direction))) - var/obj/structure/catwalk/L = locate(/obj/structure/catwalk, get_step(src, direction)) - L.update_icon() //so siding get updated properly - + var/turf/location = loc + . = ..() + for(var/obj/structure/catwalk/L in orange(location, 1)) + L.update_icon() /obj/structure/catwalk/update_icon() var/connectdir = 0 diff --git a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm index aeed53a9961..64d818c7901 100644 --- a/code/game/objects/structures/crates_lockers/closets/egg_vr.dm +++ b/code/game/objects/structures/crates_lockers/closets/egg_vr.dm @@ -16,7 +16,7 @@ /obj/structure/closet/secure_closet/egg/attackby(obj/item/weapon/W, mob/user as mob) //This also prevents crew from welding the eggs and making them unable to be opened. if(istype(W, /obj/item/weapon/weldingtool)) src.dump_contents() - del(src) + qdel(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index b535454c7c3..8a9875506e8 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -142,15 +142,16 @@ new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/device/flash(src) new /obj/item/weapon/melee/baton/loaded(src) - new /obj/item/weapon/gun/projectile/lamia(src) - new /obj/item/ammo_magazine/a44/rubber(src) - new /obj/item/ammo_magazine/a44(src) - new /obj/item/ammo_magazine/a44(src) + /*new /obj/item/weapon/gun/projectile/lamia(src) + new /obj/item/ammo_magazine/m44/rubber(src) + new /obj/item/ammo_magazine/m44(src) + new /obj/item/ammo_magazine/m44(src)*/ // NO YOU DO NOT GET A .44 MAGNUM! -Ace new /obj/item/weapon/gun/energy/gun(src) new /obj/item/weapon/cell/device/weapon(src) new /obj/item/weapon/melee/telebaton(src) new /obj/item/device/flashlight/maglight(src) return +//VOREStation Edit End /obj/structure/closet/secure_closet/warden name = "warden's locker" @@ -234,7 +235,7 @@ new /obj/item/clothing/accessory/storage/black_vest(src) new /obj/item/clothing/head/soft/sec/corp(src) new /obj/item/clothing/under/rank/security/corp(src) - //new /obj/item/ammo_magazine/c45m/rubber(src) //VOREStation Edit + //new /obj/item/ammo_magazine/m45/rubber(src) //VOREStation Edit new /obj/item/weapon/gun/energy/taser(src) new /obj/item/weapon/cell/device/weapon(src) new /obj/item/clothing/suit/storage/hooded/wintercoat/security(src) @@ -294,8 +295,8 @@ new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/device/radio/headset/headset_sec/alt(src) new /obj/item/clothing/suit/storage/vest/detective(src) - new /obj/item/ammo_magazine/a44sl/rubber(src) //VOREStation Edit - new /obj/item/ammo_magazine/a44sl/rubber(src) //VOREStation Edit + new /obj/item/ammo_magazine/m44sl/rubber(src) + new /obj/item/ammo_magazine/m44sl/rubber(src) new /obj/item/taperoll/police(src) new /obj/item/weapon/gun/projectile/revolver/consul(src) //VOREStation Edit new /obj/item/clothing/accessory/holster/armpit(src) diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm index 98f6138f68d..906e46dbe1e 100644 --- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm +++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm @@ -42,11 +42,11 @@ /obj/structure/closet/syndicate/nuclear/New() ..() - new /obj/item/ammo_magazine/a10mm(src) - new /obj/item/ammo_magazine/a10mm(src) - new /obj/item/ammo_magazine/a10mm(src) - new /obj/item/ammo_magazine/a10mm(src) - new /obj/item/ammo_magazine/a10mm(src) + new /obj/item/ammo_magazine/m10mm(src) + new /obj/item/ammo_magazine/m10mm(src) + new /obj/item/ammo_magazine/m10mm(src) + new /obj/item/ammo_magazine/m10mm(src) + new /obj/item/ammo_magazine/m10mm(src) new /obj/item/weapon/storage/box/handcuffs(src) new /obj/item/weapon/storage/box/flashbangs(src) new /obj/item/weapon/gun/energy/gun(src) diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm index 07dfb6b2fe1..922d8fd9ecb 100644 --- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm @@ -156,6 +156,8 @@ new /obj/item/clothing/head/radiation(src) new /obj/item/clothing/suit/radiation(src) new /obj/item/clothing/head/radiation(src) + new /obj/item/device/geiger(src) + new /obj/item/device/geiger(src) /* * Bombsuit closet diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 7fd68c305ac..065b637e100 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -38,7 +38,7 @@ /obj/structure/inflatable/Destroy() update_nearby_tiles() - ..() + return ..() /obj/structure/inflatable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return 0 diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 877c91c72ab..6597f62107b 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -39,7 +39,7 @@ spawn(1) if(istype(O)) // If we built a new floor with the lattice, the open turf won't exist anymore. O.update() // This lattice may be supporting things on top of it. If it's being deleted, they need to fall down. - ..() + . = ..() /obj/structure/lattice/ex_act(severity) switch(severity) diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 5e0c0d5abb5..54218cc8476 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -20,7 +20,7 @@ user << "[src] \icon[src] contains [reagents.total_volume] unit\s of water!" /obj/structure/mopbucket/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/weapon/mop)) + if(istype(I, /obj/item/weapon/mop) || istype(I, /obj/item/weapon/soap) || istype(I, /obj/item/weapon/reagent_containers/glass/rag)) //VOREStation Edit - "Allows soap and rags to be used on mopbuckets" if(reagents.total_volume < 1) user << "\The [src] is out of water!" else diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 9b6e2ae9227..9f7cd6e54db 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -29,9 +29,10 @@ update_icon(0) /obj/structure/railing/Destroy() - for(var/obj/structure/railing/R in oview(src, 1)) + var/turf/location = loc + . = ..() + for(var/obj/structure/railing/R in orange(location, 1)) R.update_icon() - ..() /obj/structure/railing/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(!mover) diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index 58742c3b609..4e302e0e317 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -168,8 +168,7 @@ /obj/structure/simple_door/process() if(!material.radioactivity) return - for(var/mob/living/L in range(1,src)) - L.apply_effect(round(material.radioactivity/3),IRRADIATE,0) + radiation_repository.radiate(src, round(material.radioactivity/3)) /obj/structure/simple_door/iron/New(var/newloc,var/material_name) ..(newloc, "iron") 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 0375a66272e..3e3d4c17e4a 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -205,6 +205,7 @@ icon = 'icons/obj/rollerbed.dmi' icon_state = "down" anchored = 0 + surgery_odds = 75 /obj/structure/bed/roller/update_icon() return // Doesn't care about material or anything else. diff --git a/code/game/objects/structures/trash_pile.dm b/code/game/objects/structures/trash_pile.dm new file mode 100644 index 00000000000..f1684c4cf5f --- /dev/null +++ b/code/game/objects/structures/trash_pile.dm @@ -0,0 +1,252 @@ +/obj/structure/trash_pile + name = "trash pile" + desc = "A heap of garbage, but maybe there's something interesting inside?" + icon = 'icons/obj/trash_piles.dmi' + icon_state = "randompile" + density = 1 + anchored = 1.0 + + var/list/searchedby = list()// Characters that have searched this trashpile, with values of searched time. + var/mob/living/hider // A simple animal that might be hiding in the pile + + var/chance_alpha = 79 // Alpha list is junk items and normal random stuff. + var/chance_beta = 20 // Beta list is actually maybe some useful illegal items. If it's not alpha or gamma, it's beta. + var/chance_gamma = 1 // Gamma list is unique items only, and will only spawn one of each. This is a sub-chance of beta chance. + + //These are types that can only spawn once, and then will be removed from this list. + //Alpha and beta lists are in their respective procs. + var/global/list/unique_gamma = list( + /obj/item/device/perfect_tele, + /obj/item/weapon/bluespace_harpoon, + /obj/item/weapon/gun/energy/netgun, + /obj/item/weapon/card/id/syndicate, + /obj/item/weapon/moneybag/vault, + /obj/item/weapon/permit, + /obj/item/weapon/gun/projectile/dartgun + ) + + var/global/list/allocated_gamma = list() + +/obj/structure/trash_pile/initialize() + ..() + icon_state = pick( + "pile1", + "pile2", + "pilechair", + "piletable", + "pilevending", + "brtrashpile", + "microwavepile", + "rackpile", + "boxfort", + "trashbag", + "brokecomp") + +/obj/structure/trash_pile/attackby(obj/item/W as obj, mob/user as mob) + var/w_type = W.type + if(w_type in allocated_gamma) + to_chat(user,"You feel \the [W] slip from your hand, and disappear into the trash pile.") + user.unEquip(W) + W.forceMove(src) + allocated_gamma -= w_type + unique_gamma += w_type + qdel(W) + + else + return ..() + +/obj/structure/trash_pile/attack_generic(mob/user) + //Simple Animal + if(isanimal(user)) + var/mob/living/L = user + //They're in it, and want to get out. + if(L.loc == src) + var/choice = alert("Do you want to exit \the [src]?","Un-Hide?","Exit","Stay") + if(choice == "Exit") + if(L == hider) + hider = null + L.forceMove(get_turf(src)) + else if(!hider) + var/choice = alert("Do you want to hide in \the [src]?","Un-Hide?","Hide","Stay") + if(choice == "Hide" && !hider) //Check again because PROMPT + L.forceMove(src) + hider = L + else + return ..() + +/obj/structure/trash_pile/attack_hand(mob/user) + //Human mob + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.visible_message("[user] searches through \the [src].","You search through \the [src].") + if(hider) + to_chat(hider,"[user] is searching the trash pile you're in!") + + //Do the searching + if(do_after(user,rand(4 SECONDS,6 SECONDS),src)) + + //If there was a hider, chance to reveal them + if(hider && prob(50)) + to_chat(hider,"You've been discovered!") + hider.forceMove(get_turf(src)) + hider = null + to_chat(user,"Some sort of creature leaps out of \the [src]!") + + //You already searched this one bruh + else if(user.ckey in searchedby) + to_chat(H,"There's nothing else for you in \the [src]!") + + //You found an item! + else + var/luck = rand(1,100) + var/obj/item/I + if(luck <= chance_alpha) + I = produce_alpha_item() + else if(luck <= chance_alpha+chance_beta) + I = produce_beta_item() + else if(luck <= chance_alpha+chance_beta+chance_gamma) + I = produce_gamma_item() + + //We either have an item to hand over or we don't, at this point! + if(I) + searchedby += user.ckey + I.forceMove(get_turf(src)) + to_chat(H,"You found \a [I]!") + + else + return ..() + +//Random lists +/obj/structure/trash_pile/proc/produce_alpha_item() + var/path = pick(prob(4);/obj/item/broken_device, + prob(2);/obj/item/weapon/contraband/poster, + prob(2);/obj/item/device/flashlight/flare, + prob(2);/obj/item/device/flashlight/glowstick, + prob(2);/obj/item/device/flashlight/glowstick/blue, + prob(1);/obj/item/device/flashlight/glowstick/orange, + prob(1);/obj/item/device/flashlight/glowstick/red, + prob(1);/obj/item/device/flashlight/glowstick/yellow, + prob(1);/obj/item/device/flashlight/pen, + prob(4);/obj/item/weapon/cell, + prob(4);/obj/item/weapon/cell/device, + prob(3);/obj/item/weapon/cell/high, + prob(2);/obj/item/weapon/cell/super, + prob(5);/obj/random/cigarettes, + prob(3);/obj/item/clothing/mask/gas, + prob(2);/obj/item/clothing/mask/gas/half, + prob(4);/obj/item/clothing/mask/breath, + prob(2);/obj/item/weapon/reagent_containers/glass/rag, + prob(4);/obj/item/weapon/reagent_containers/food/snacks/liquidfood, + prob(2);/obj/item/weapon/storage/secure/briefcase, + prob(4);/obj/item/weapon/storage/briefcase, + prob(5);/obj/item/weapon/storage/backpack, + prob(5);/obj/item/weapon/storage/backpack/satchel/norm, + prob(4);/obj/item/weapon/storage/backpack/satchel, + prob(3);/obj/item/weapon/storage/backpack/dufflebag, + prob(1);/obj/item/weapon/storage/backpack/dufflebag/syndie, + prob(5);/obj/item/weapon/storage/box, + prob(3);/obj/item/weapon/storage/box/donkpockets, + prob(2);/obj/item/weapon/storage/box/sinpockets, + prob(1);/obj/item/weapon/storage/box/cups, + prob(3);/obj/item/weapon/storage/box/mousetraps, + prob(3);/obj/item/weapon/storage/box/engineer, + prob(3);/obj/item/weapon/storage/wallet, + prob(1);/obj/item/device/paicard, + prob(2);/obj/item/clothing/shoes/galoshes, + prob(1);/obj/item/clothing/shoes/syndigaloshes, + prob(4);/obj/item/clothing/shoes/black, + prob(4);/obj/item/clothing/shoes/laceup, + prob(4);/obj/item/clothing/shoes/black, + prob(4);/obj/item/clothing/shoes/leather, + prob(1);/obj/item/clothing/gloves/yellow, + prob(3);/obj/item/clothing/gloves/botanic_leather, + prob(2);/obj/item/clothing/gloves/sterile/latex, + prob(5);/obj/item/clothing/gloves/white, + prob(5);/obj/item/clothing/gloves/rainbow, + prob(2);/obj/item/clothing/gloves/fyellow, + prob(1);/obj/item/clothing/glasses/sunglasses, + prob(3);/obj/item/clothing/glasses/meson, + prob(2);/obj/item/clothing/glasses/meson/prescription, + prob(1);/obj/item/clothing/glasses/welding, + prob(1);/obj/item/clothing/head/bio_hood/general, + prob(4);/obj/item/clothing/head/hardhat, + prob(3);/obj/item/clothing/head/hardhat/red, + prob(1);/obj/item/clothing/head/ushanka, + prob(2);/obj/item/clothing/head/welding, + prob(4);/obj/item/clothing/suit/storage/hazardvest, + prob(1);/obj/item/clothing/suit/space/emergency, + prob(3);/obj/item/clothing/suit/storage/toggle/bomber, + prob(1);/obj/item/clothing/suit/bio_suit/general, + prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/black, + prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/blue, + prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/red, + prob(3);/obj/item/clothing/suit/storage/toggle/hoodie/yellow, + prob(3);/obj/item/clothing/suit/storage/toggle/brown_jacket, + prob(3);/obj/item/clothing/suit/storage/toggle/leather_jacket, + prob(1);/obj/item/clothing/suit/storage/vest/press, + prob(3);/obj/item/clothing/suit/storage/apron, + prob(4);/obj/item/clothing/under/color/grey, + prob(2);/obj/item/clothing/under/syndicate/tacticool, + prob(2);/obj/item/clothing/under/pants/camo, + prob(1);/obj/item/clothing/under/harness, + prob(1);/obj/item/clothing/under/tactical, + prob(3);/obj/item/clothing/accessory/storage/webbing, + prob(4);/obj/item/weapon/spacecash/c1, + prob(3);/obj/item/weapon/spacecash/c10, + prob(3);/obj/item/weapon/spacecash/c20, + prob(1);/obj/item/weapon/spacecash/c50, + prob(1);/obj/item/weapon/spacecash/c100, + prob(3);/obj/item/weapon/camera_assembly, + prob(4);/obj/item/weapon/caution, + prob(3);/obj/item/weapon/caution/cone, + prob(2);/obj/item/weapon/card/emag_broken, + prob(1);/obj/item/weapon/card/emag, + prob(2);/obj/item/device/camera, + prob(3);/obj/item/device/pda, + prob(3);/obj/item/device/radio/headset) + + var/obj/item/I = new path() + return I + +/obj/structure/trash_pile/proc/produce_beta_item() + var/path = pick(prob(6);/obj/item/weapon/storage/pill_bottle/tramadol, + prob(4);/obj/item/weapon/storage/pill_bottle/happy, + prob(4);/obj/item/weapon/storage/pill_bottle/zoom, + prob(4);/obj/item/weapon/material/butterfly, + prob(2);/obj/item/weapon/material/butterfly/switchblade, + prob(2);/obj/item/weapon/material/knuckledusters, + prob(1);/obj/item/weapon/material/hatchet/tacknife, + prob(1);/obj/item/clothing/suit/storage/vest/heavy/merc, + prob(1);/obj/item/weapon/beartrap, + prob(1);/obj/item/weapon/handcuffs/fuzzy, + prob(1);/obj/item/weapon/legcuffs, + prob(2);/obj/item/weapon/reagent_containers/syringe/drugs, + prob(1);/obj/item/weapon/reagent_containers/syringe/steroid, + prob(4);/obj/item/device/radio_jammer, + prob(2);/obj/item/weapon/storage/box/syndie_kit/spy, + prob(2);/obj/item/weapon/grenade/anti_photon, + prob(1);/obj/item/weapon/cell/hyper/empty, + prob(1);/obj/item/weapon/disk/nifsoft/compliance, + prob(1);/obj/item/device/nif/bad, + prob(1);/obj/item/device/sleevemate) + + var/obj/item/I = new path() + return I + +/obj/structure/trash_pile/proc/produce_gamma_item() + var/path = pick_n_take(unique_gamma) + if(!path) //Tapped out, reallocate? + for(var/P in allocated_gamma) + var/obj/item/I = allocated_gamma[P] + if(QDELETED(I) || istype(I.loc,/obj/machinery/computer/cryopod)) + allocated_gamma -= P + path = P + break + + if(path) + var/obj/item/I = new path() + allocated_gamma[path] = I + return I + else + return produce_beta_item() + diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 126e96bec6e..06abdbaa624 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -355,12 +355,9 @@ density = 0 update_nearby_tiles() var/turf/location = loc - loc = null + . = ..() for(var/obj/structure/window/W in orange(location, 1)) W.update_icon() - loc = location - ..() - /obj/structure/window/Move() var/ini_dir = dir @@ -472,6 +469,11 @@ if (constructed) state = 0 +/obj/structure/window/reinforced/full + dir = 5 + icon_state = "fwindow" + maxhealth = 60 + /obj/structure/window/reinforced/tinted name = "tinted window" desc = "It looks rather strong and opaque. Might take a few good hits to shatter it." diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index 168f11e96b3..3aaa2409b91 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -16,7 +16,7 @@ var/list/floor_decals = list() // VOREStation Edit - Hack to workaround byond crash bug /obj/effect/floor_decal/initialize() - if(!floor_decals_initialized || !loc || deleted(src)) + if(!floor_decals_initialized || !loc || QDELETED(src)) return add_to_turf_decals() var/turf/T = get_turf(src) diff --git a/code/game/turfs/simulated/floor_icon.dm b/code/game/turfs/simulated/floor_icon.dm index 007108c72ea..dadb173d991 100644 --- a/code/game/turfs/simulated/floor_icon.dm +++ b/code/game/turfs/simulated/floor_icon.dm @@ -71,9 +71,9 @@ var/list/flooring_cache = list() icon_state = "dmg[rand(1,4)]" else if(flooring) if(!isnull(broken) && (flooring.flags & TURF_CAN_BREAK)) - overlays |= get_flooring_overlay("[flooring.icon_base]-broken-[broken]","[flooring.icon_base]_broken[broken]") + overlays |= get_flooring_overlay("[flooring.icon_base]-broken-[broken]","broken[broken]") // VOREStation Edit - Eris overlays if(!isnull(burnt) && (flooring.flags & TURF_CAN_BURN)) - overlays |= get_flooring_overlay("[flooring.icon_base]-burned-[burnt]","[flooring.icon_base]_burned[burnt]") + overlays |= get_flooring_overlay("[flooring.icon_base]-burned-[burnt]","burned[burnt]") // VOREStation Edit - Eris overlays if(weather_overlay) overlays += weather_overlay diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 098782ebdf0..25b49154080 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -7,6 +7,8 @@ if(can_open == WALL_OPENING) return + radiation_repository.resistance_cache.Remove(src) + if(density) can_open = WALL_OPENING //flick("[material.icon_base]fwall_opening", src) @@ -188,6 +190,7 @@ else user << "You need more welding fuel to complete this task." return + user.update_examine_panel(src) return // Basic dismantling. @@ -241,6 +244,7 @@ if (istype(W, /obj/item/weapon/wirecutters)) playsound(src, 'sound/items/Wirecutter.ogg', 100, 1) construction_stage = 5 + user.update_examine_panel(src) user << "You cut through the outer grille." update_icon() return @@ -251,11 +255,13 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 5) return construction_stage = 4 + user.update_examine_panel(src) update_icon() user << "You unscrew the support lines." return else if (istype(W, /obj/item/weapon/wirecutters)) construction_stage = 6 + user.update_examine_panel(src) user << "You mend the outer grille." update_icon() return @@ -278,6 +284,7 @@ if(!do_after(user, 60) || !istype(src, /turf/simulated/wall) || construction_stage != 4) return construction_stage = 3 + user.update_examine_panel(src) update_icon() user << "You press firmly on the cover, dislodging it." return @@ -287,6 +294,7 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 4) return construction_stage = 5 + user.update_examine_panel(src) update_icon() user << "You screw down the support lines." return @@ -297,6 +305,7 @@ if(!do_after(user,100) || !istype(src, /turf/simulated/wall) || construction_stage != 3) return construction_stage = 2 + user.update_examine_panel(src) update_icon() user << "You pry off the cover." return @@ -307,6 +316,7 @@ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 2) return construction_stage = 1 + user.update_examine_panel(src) update_icon() user << "You remove the bolts anchoring the support rods." return @@ -327,6 +337,7 @@ if(!do_after(user,70) || !istype(src, /turf/simulated/wall) || construction_stage != 1) return construction_stage = 0 + user.update_examine_panel(src) update_icon() user << "The slice through the support rods." return diff --git a/code/game/turfs/simulated/wall_icon.dm b/code/game/turfs/simulated/wall_icon.dm index dc7874b2aaf..eab99bfba72 100644 --- a/code/game/turfs/simulated/wall_icon.dm +++ b/code/game/turfs/simulated/wall_icon.dm @@ -26,6 +26,7 @@ else if(material.opacity < 0.5 && opacity) set_light(0) + radiation_repository.resistance_cache.Remove(src) update_connections(1) update_icon() diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm index 6b793d60612..9d939caab69 100644 --- a/code/game/turfs/simulated/wall_types.dm +++ b/code/game/turfs/simulated/wall_types.dm @@ -193,7 +193,15 @@ /turf/simulated/shuttle/wall/voidcraft/update_icon() if(stripe_color) - overlays.Cut() + overlays = list() //VOREStation Edit - Another place with overlay nonsense. var/image/I = image(icon = src.icon, icon_state = "o_[icon_state]") I.color = stripe_color + //VOREStation Add - Shenanigans around this because of the bullshit byond bug + var/pre_overlays = overlays.len overlays.Add(I) + var/post_overlays = overlays.len + if(post_overlays != (pre_overlays + 1)) + world.log << "Corrupted overlays on [x],[y],[z] voidcraft wall" + new type(src) + return + //VOREStation Add End diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index f8544e714d4..376fb8e452a 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -48,6 +48,9 @@ if(!radiate()) return PROCESS_KILL +/turf/simulated/wall/proc/get_material() + return material + /turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj) if(istype(Proj,/obj/item/projectile/beam)) burn(2500) @@ -265,8 +268,7 @@ if(!total_radiation) return - for(var/mob/living/L in range(3,src)) - L.apply_effect(total_radiation, IRRADIATE,0) + radiation_repository.radiate(src, total_radiation) return total_radiation /turf/simulated/wall/proc/burn(temperature) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3f2e0064f22..d34b210b997 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -47,6 +47,7 @@ /turf/Destroy() turfs -= src ..() + return QDEL_HINT_IWILLGC /turf/ex_act(severity) return 0 diff --git a/code/game/turfs/unsimulated/floor.dm b/code/game/turfs/unsimulated/floor.dm index b2e78363346..bd4fdca8148 100644 --- a/code/game/turfs/unsimulated/floor.dm +++ b/code/game/turfs/unsimulated/floor.dm @@ -7,3 +7,6 @@ name = "mask" icon = 'icons/turf/walls.dmi' icon_state = "rockvault" + +/turf/unsimulated/floor/shuttle_ceiling + icon_state = "reinforced" \ No newline at end of file diff --git a/code/global_vr.dm b/code/global_vr.dm index ed73d3cd634..de9aef8509f 100644 --- a/code/global_vr.dm +++ b/code/global_vr.dm @@ -1,4 +1,5 @@ /hook/startup/proc/modules_vr() robot_module_types += "Medihound" robot_module_types += "K9" + robot_module_types += "Janihound" return 1 diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 7d333e2b660..98cb1613b7c 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -788,6 +788,7 @@ var/datum/announcement/minor/admin_min_announcer = new return if(ticker.current_state == GAME_STATE_PREGAME) ticker.current_state = GAME_STATE_SETTING_UP + Master.SetRunLevel(RUNLEVEL_SETUP) log_admin("[usr.key] has started the game.") message_admins("[usr.key] has started the game.") feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index e4ee4806e2b..5fe32308d3a 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -125,6 +125,7 @@ var/list/admin_verbs_fun = list( /client/proc/toggle_random_events, /client/proc/editappear, /client/proc/roll_dices, + /datum/admins/proc/quick_nif, //VOREStation Add, /datum/admins/proc/call_supply_drop, /datum/admins/proc/call_drop_pod ) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 73e570228d2..eebf9de4241 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -480,7 +480,7 @@ M.equip_to_slot_or_del(new /obj/item/clothing/head/det(M), slot_head) M.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/revolver(M), slot_r_hand) - M.equip_to_slot_or_del(new /obj/item/ammo_magazine/a357(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/ammo_magazine/s357(M), slot_l_store) if ("tournament chef") //Steven Seagal FTW M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(M), slot_w_uniform) @@ -592,7 +592,7 @@ sec_briefcase.contents += new /obj/item/weapon/spacecash/c1000 sec_briefcase.contents += new /obj/item/weapon/gun/energy/crossbow sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba - sec_briefcase.contents += new /obj/item/ammo_magazine/a357 + sec_briefcase.contents += new /obj/item/ammo_magazine/s357 sec_briefcase.contents += new /obj/item/weapon/plastique M.equip_to_slot_or_del(sec_briefcase, slot_l_hand) diff --git a/code/modules/admin/verbs/debug_vr.dm b/code/modules/admin/verbs/debug_vr.dm new file mode 100644 index 00000000000..586bde6e645 --- /dev/null +++ b/code/modules/admin/verbs/debug_vr.dm @@ -0,0 +1,32 @@ +/datum/admins/proc/quick_nif() + set category = "Fun" + set name = "Quick NIF" + set desc = "Spawns a NIF into someone in quick-implant mode." + + if(!check_rights(R_FUN)) + return + + var/mob/living/carbon/human/H = input("Pick a mob with a player","Quick NIF") as null|anything in player_list + + if(!H) + return + + if(!istype(H)) + to_chat(usr,"That mob type ([H.type]) doesn't support NIFs, sorry.") + return + + if(!H.get_organ(BP_HEAD)) + to_chat(usr,"Target is unsuitable.") + return + + if(H.nif) + to_chat(usr,"Target already has a NIF.") + return + + if(H.species.flags & NO_SCAN) + new /obj/item/device/nif/bioadap(H) + else + new /obj/item/device/nif(H) + + log_and_message_admins("[key_name(src)] Quick NIF'd [H.real_name].") + feedback_add_details("admin_verb","QNIF") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 51f1fbceb31..ecd26e9b56d 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -4,7 +4,7 @@ var/list/forbidden_varedit_object_types = list( /datum/feedback_variable //Prevents people messing with feedback gathering, ) -var/list/VVlocked = list("vars", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "bound_x", "bound_y", "step_x", "step_y", "force_ending") +var/list/VVlocked = list("vars", "client", "virus", "viruses", "cuffed", "last_eaten", "unlock_content", "bound_x", "bound_y", "step_x", "step_y", "force_ending", "queued_priority") var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays") var/list/VVckey_edit = list("key", "ckey") diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index 67eefc018de..95945f82e00 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -1,8 +1,4 @@ -// Keep these two together, they *must* be defined on both -// If /client ever becomes /datum/client or similar, they can be merged -/client/proc/get_view_variables_header() - return "[src]" /datum/proc/get_view_variables_header() return "[src]" @@ -31,9 +27,6 @@
"} -// Same for these as for get_view_variables_header() above -/client/proc/get_view_variables_options() - return "" /datum/proc/get_view_variables_options() return "" diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 169ab9b6a02..1273b004a43 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -187,4 +187,4 @@ if(radio_controller) radio_controller.remove_object(src,frequency) frequency = 0 - ..() + . = ..() diff --git a/code/modules/awaymissions/loot_vr.dm b/code/modules/awaymissions/loot_vr.dm index 5d22422513f..b6be0c0b5d6 100644 --- a/code/modules/awaymissions/loot_vr.dm +++ b/code/modules/awaymissions/loot_vr.dm @@ -185,35 +185,35 @@ var/new_ammo = pick( // Copied from Random.dm prob(5);/obj/item/weapon/storage/box/shotgunammo,\ prob(5);/obj/item/weapon/storage/box/shotgunshells,\ - prob(5);/obj/item/ammo_magazine/a357,\ - prob(5);/obj/item/ammo_magazine/clip/a762,\ - prob(5);/obj/item/ammo_magazine/c45m,\ - prob(5);/obj/item/ammo_magazine/c45m/rubber,\ - prob(5);/obj/item/ammo_magazine/c38,\ - prob(5);/obj/item/ammo_magazine/c38/rubber,\ + prob(5);/obj/item/ammo_magazine/m357,\ + prob(5);/obj/item/ammo_magazine/clip/c762,\ + prob(5);/obj/item/ammo_magazine/m45,\ + prob(5);/obj/item/ammo_magazine/m45/rubber,\ + prob(5);/obj/item/ammo_magazine/s38,\ + prob(5);/obj/item/ammo_magazine/s38/rubber,\ prob(5);/obj/item/weapon/storage/box/flashbangs,\ - prob(5);/obj/item/ammo_magazine/c556,\ - prob(4);/obj/item/ammo_magazine/clip/a556,\ + prob(5);/obj/item/ammo_magazine/m556,\ + prob(4);/obj/item/ammo_magazine/clip/c556,\ prob(4);/obj/item/ammo_magazine/clip/c45,\ prob(4);/obj/item/ammo_magazine/clip/c9mm,\ - prob(4);/obj/item/ammo_magazine/c45uzi,\ - prob(4);/obj/item/ammo_magazine/c556/ext,\ - prob(4);/obj/item/ammo_magazine/mc9mm,\ - prob(4);/obj/item/ammo_magazine/mc9mml,\ - prob(4);/obj/item/ammo_magazine/mc9mmt,\ - prob(4);/obj/item/ammo_magazine/mc9mmt/rubber,\ - prob(4);/obj/item/ammo_magazine/a10mm,\ - prob(4);/obj/item/ammo_magazine/p90,\ + prob(4);/obj/item/ammo_magazine/m45uzi,\ + prob(4);/obj/item/ammo_magazine/m556/ext,\ + prob(4);/obj/item/ammo_magazine/m9mm,\ + prob(4);/obj/item/ammo_magazine/m9mml,\ + prob(4);/obj/item/ammo_magazine/m9mmt,\ + prob(4);/obj/item/ammo_magazine/m9mmt/rubber,\ + prob(4);/obj/item/ammo_magazine/m10mm,\ + prob(4);/obj/item/ammo_magazine/m9mmp90,\ /* prob(4);/obj/item/ammo_magazine/m14,\ prob(4);/obj/item/ammo_magazine/m14/large,\ */ - prob(4);/obj/item/ammo_magazine/c556/ext,\ - prob(4);/obj/item/ammo_magazine/s762,\ - prob(4);/obj/item/ammo_magazine/c556/ext,\ - prob(3);/obj/item/ammo_magazine/clip/a10mm,\ - prob(3);/obj/item/ammo_magazine/clip/a50,\ - prob(3);/obj/item/ammo_magazine/c556,\ - prob(2);/obj/item/ammo_magazine/a50,\ - prob(2);/obj/item/ammo_magazine/a556,\ + prob(4);/obj/item/ammo_magazine/m556/ext,\ + prob(4);/obj/item/ammo_magazine/m762,\ + prob(4);/obj/item/ammo_magazine/m556/ext,\ + prob(3);/obj/item/ammo_magazine/clip/c10mm,\ + prob(3);/obj/item/ammo_magazine/clip/c50,\ + prob(3);/obj/item/ammo_magazine/m556,\ + prob(2);/obj/item/ammo_magazine/m50,\ + prob(2);/obj/item/ammo_magazine/m556,\ prob(1);/obj/item/weapon/storage/box/frags,\ /* prob(1);/obj/item/ammo_magazine/battlerifle,\ */ prob(1);/obj/item/ammo_casing/rocket,\ @@ -223,9 +223,9 @@ prob(1);/obj/item/weapon/storage/box/practiceshells,\ prob(1);/obj/item/weapon/storage/box/stunshells,\ prob(1);/obj/item/weapon/storage/box/blanks,\ - prob(1);/obj/item/ammo_magazine/stg,\ - prob(1);/obj/item/ammo_magazine/tommydrum,\ - prob(1);/obj/item/ammo_magazine/tommymag) + prob(1);/obj/item/ammo_magazine/mtg,\ + prob(1);/obj/item/ammo_magazine/m45tommydrum,\ + prob(1);/obj/item/ammo_magazine/m45tommy) new new_ammo(C) if("spacesuit") var/obj/structure/closet/syndicate/C = new(src.loc) diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index b5596521328..5e5a1761285 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -1,4 +1,8 @@ /client + ////////////////////// + //BLACK MAGIC THINGS// + ////////////////////// + parent_type = /datum //////////////// //ADMIN THINGS// //////////////// diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 73354cc22af..f19d5a6f526 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -181,6 +181,9 @@ clients -= src return ..() +/client/Destroy() + ..() + return QDEL_HINT_HARDDEL_NOW // here because it's similar to below @@ -284,6 +287,18 @@ if(inactivity > duration) return inactivity return 0 +// 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 + sleep(5) + stoplag() + /client/proc/last_activity_seconds() return inactivity / 10 diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 81bbf075dee..583c13c6c22 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -317,7 +317,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(prev_species != pref.species) if(!(pref.biological_gender in mob_species.genders)) pref.set_biological_gender(mob_species.genders[1]) - + pref.custom_species = null //VOREStation Edit - This is cleared on species changes //grab one of the valid hair styles for the newly chosen species var/list/valid_hairstyles = list() for(var/hairstyle in hair_styles_list) @@ -384,7 +384,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O 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)) + if(!(pref.species in S.species_allowed) && (!pref.custom_base || !(pref.custom_base in S.species_allowed))) //VOREStation Edit - Custom species base species allowance continue valid_hairstyles[hairstyle] = hair_styles_list[hairstyle] @@ -440,7 +440,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O continue if(pref.biological_gender == FEMALE && S.gender == MALE) continue - if(!(pref.species in S.species_allowed)) + if(!(pref.species in S.species_allowed) && (!pref.custom_base || !(pref.custom_base in S.species_allowed))) //VOREStation Edit - Custom species base species allowance continue valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle] diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes.dm b/code/modules/client/preference_setup/loadout/loadout_shoes.dm index 4de90fed9f8..3b3e528403c 100644 --- a/code/modules/client/preference_setup/loadout/loadout_shoes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_shoes.dm @@ -77,6 +77,38 @@ display_name = "flats, black" path = /obj/item/clothing/shoes/flats +/datum/gear/shoes/hitops/ + display_name = "high-top, white" + path = /obj/item/clothing/shoes/hitops/ + +/datum/gear/shoes/hitops/red + display_name = "high-top, red" + path = /obj/item/clothing/shoes/hitops/red + +/datum/gear/shoes/hitops/black + display_name = "high-top, black" + path = /obj/item/clothing/shoes/hitops/black + +/datum/gear/shoes/hitops/orange + display_name = "high-top, orange" + path = /obj/item/clothing/shoes/hitops/orange + +/datum/gear/shoes/hitops/blue + display_name = "high-top, blue" + path = /obj/item/clothing/shoes/hitops/blue + +/datum/gear/shoes/hitops/green + display_name = "high-top, green" + path = /obj/item/clothing/shoes/hitops/green + +/datum/gear/shoes/hitops/purple + display_name = "high-top, purple" + path = /obj/item/clothing/shoes/hitops/purple + +/datum/gear/shoes/hitops/yellow + display_name = "high-top, yellow" + path = /obj/item/clothing/shoes/hitops/yellow + /datum/gear/shoes/flats/blue display_name = "flats, blue" path = /obj/item/clothing/shoes/flats/blue diff --git a/code/modules/client/preference_setup/vore/01_ears.dm b/code/modules/client/preference_setup/vore/01_ears.dm index 9757e288462..04bec4c2eed 100644 --- a/code/modules/client/preference_setup/vore/01_ears.dm +++ b/code/modules/client/preference_setup/vore/01_ears.dm @@ -6,7 +6,6 @@ // Define a place to save appearance in character setup /datum/preferences - var/custom_species // Custom species name var/ear_style // Type of selected ear style var/tail_style // Type of selected tail style var/r_tail = 30 // Tail/Taur color @@ -20,7 +19,6 @@ sort_order = 1 /datum/category_item/player_setup_item/vore/ears/load_character(var/savefile/S) - S["custom_species"] >> pref.custom_species S["ear_style"] >> pref.ear_style S["tail_style"] >> pref.tail_style S["r_tail"] >> pref.r_tail @@ -28,7 +26,6 @@ S["b_tail"] >> pref.b_tail /datum/category_item/player_setup_item/vore/ears/save_character(var/savefile/S) - S["custom_species"] << pref.custom_species S["ear_style"] << pref.ear_style S["tail_style"] << pref.tail_style S["r_tail"] << pref.r_tail @@ -45,7 +42,6 @@ pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style)) /datum/category_item/player_setup_item/vore/ears/copy_to_mob(var/mob/living/carbon/human/character) - character.custom_species = pref.custom_species character.ear_style = ear_styles_list[pref.ear_style] character.tail_style = tail_styles_list[pref.tail_style] character.r_tail = pref.r_tail @@ -86,20 +82,10 @@ if (T.do_colouration) . += "Change Color
__

" - . += "Custom Species " - . += "[pref.custom_species ? pref.custom_species : "None"]
" - /datum/category_item/player_setup_item/vore/ears/OnTopic(var/href,var/list/href_list, var/mob/user) if(!CanUseTopic(user)) return TOPIC_NOACTION - else if(href_list["custom_species"]) - var/raw_choice = sanitize(input(user, "Input your character's species:", - "Character Preference", pref.custom_species) as null|text, MAX_NAME_LEN) - if (CanUseTopic(user)) - pref.custom_species = raw_choice - return TOPIC_REFRESH - else if(href_list["ear_style"]) // Construct the list of names allowed for this user. var/list/pretty_ear_styles = list("Normal" = null) diff --git a/code/modules/client/preference_setup/vore/04_resleeving.dm b/code/modules/client/preference_setup/vore/04_resleeving.dm index 93f105195cd..22fba4e6a7a 100644 --- a/code/modules/client/preference_setup/vore/04_resleeving.dm +++ b/code/modules/client/preference_setup/vore/04_resleeving.dm @@ -24,10 +24,10 @@ /datum/category_item/player_setup_item/vore/resleeve/copy_to_mob(var/mob/living/carbon/human/character) if(character && !istype(character,/mob/living/carbon/human/dummy)) spawn(50) - if(deleted(character) || deleted(pref)) + if(QDELETED(character) || QDELETED(pref)) return // They might have been deleted during the wait if(pref.resleeve_scan) - var/datum/transhuman/body_record/BR = new() //Clearly related to size. + var/datum/transhuman/body_record/BR = new() BR.init_from_mob(character, pref.resleeve_scan, pref.resleeve_lock) if(pref.resleeve_lock) character.resleeve_lock = character.ckey diff --git a/code/modules/client/preference_setup/vore/05_persistence.dm b/code/modules/client/preference_setup/vore/05_persistence.dm index 60d3df2acf3..2d8846a3dd2 100644 --- a/code/modules/client/preference_setup/vore/05_persistence.dm +++ b/code/modules/client/preference_setup/vore/05_persistence.dm @@ -2,8 +2,9 @@ #define PERSIST_WEIGHT 0x02 // Persist mob weight #define PERSIST_ORGANS 0x04 // Persist the status (normal/amputated/robotic/etc) and model (for robotic) status of organs #define PERSIST_MARKINGS 0x08 // Persist markings -#define PERSIST_COUNT 4 // Number of valid bits in this bitflag. Keep this updated! -#define PERSIST_DEFAULT PERSIST_SPAWN|PERSIST_ORGANS|PERSIST_MARKINGS // Default setting for new folks +#define PERSIST_SIZE 0x10 // Persist size +#define PERSIST_COUNT 5 // Number of valid bits in this bitflag. Keep this updated! +#define PERSIST_DEFAULT PERSIST_SPAWN|PERSIST_ORGANS|PERSIST_MARKINGS|PERSIST_SIZE // Default setting for new folks // Define a place to save in character setup /datum/preferences @@ -45,6 +46,10 @@ . += make_yesno(PERSIST_MARKINGS) . += "" + . += "Save Scale: " + . += make_yesno(PERSIST_SIZE) + . += "" + . += "" return jointext(., "") diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm new file mode 100644 index 00000000000..a16e9057b32 --- /dev/null +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -0,0 +1,273 @@ +#define POSITIVE_MODE 1 +#define NEUTRAL_MODE 2 +#define NEGATIVE_MODE 3 + +/datum/preferences + var/custom_species // Custom species name, can't be changed due to it having been used in savefiles already. + var/custom_base // What to base the custom species on + var/blood_color = "#A10808" + + var/list/pos_traits = list() // What traits they've selected for their custom species + var/list/neu_traits = list() + var/list/neg_traits = list() + + var/traits_cheating = 0 //Varedit by admins allows saving new maximums on people who apply/etc + var/starting_trait_points = STARTING_SPECIES_POINTS + var/max_traits = MAX_SPECIES_TRAITS + +// Definition of the stuff for Ears +/datum/category_item/player_setup_item/vore/traits + name = "Traits" + sort_order = 7 + +/datum/category_item/player_setup_item/vore/traits/load_character(var/savefile/S) + S["custom_species"] >> pref.custom_species + S["custom_base"] >> pref.custom_base + S["pos_traits"] >> pref.pos_traits + S["neu_traits"] >> pref.neu_traits + S["neg_traits"] >> pref.neg_traits + S["blood_color"] >> pref.blood_color + + S["traits_cheating"]>> pref.traits_cheating + S["max_traits"] >> pref.max_traits + S["trait_points"] >> pref.starting_trait_points + +/datum/category_item/player_setup_item/vore/traits/save_character(var/savefile/S) + S["custom_species"] << pref.custom_species + S["custom_base"] << pref.custom_base + S["pos_traits"] << pref.pos_traits + S["neu_traits"] << pref.neu_traits + S["neg_traits"] << pref.neg_traits + S["blood_color"] << pref.blood_color + + S["traits_cheating"]<< pref.traits_cheating + S["max_traits"] << pref.max_traits + S["trait_points"] << pref.starting_trait_points + +/datum/category_item/player_setup_item/vore/traits/sanitize_character() + if(!pref.pos_traits) pref.pos_traits = list() + if(!pref.neu_traits) pref.neu_traits = list() + if(!pref.neg_traits) pref.neg_traits = list() + + pref.blood_color = sanitize_hexcolor(pref.blood_color, default="#A10808") + + if(!pref.traits_cheating) + pref.starting_trait_points = STARTING_SPECIES_POINTS + pref.max_traits = MAX_SPECIES_TRAITS + + if(pref.species != "Custom Species") + pref.pos_traits.Cut() + pref.neu_traits.Cut() + pref.neg_traits.Cut() + else + // Clean up positive traits + for(var/path in pref.pos_traits) + if(!(path in positive_traits)) + pref.pos_traits -= path + //Neutral traits + for(var/path in pref.neu_traits) + if(!(path in neutral_traits)) + pref.neu_traits -= path + //Negative traits + for(var/path in pref.neg_traits) + if(!(path in negative_traits)) + pref.neg_traits -= path + + if(!pref.custom_base || !(pref.custom_base in playable_species - whitelisted_species)) + pref.custom_base = "Human" + +/datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character) + character.custom_species = pref.custom_species + if(pref.species == "Custom Species") + var/datum/species/custom/CS = character.species + var/S = pref.custom_base ? pref.custom_base : "Human" + var/datum/species/custom/new_CS = CS.produceCopy(S, pref.pos_traits + pref.neu_traits + pref.neg_traits, character) + + //Any additional non-trait settings can be applied here + new_CS.blood_color = pref.blood_color + +/datum/category_item/player_setup_item/vore/traits/content(var/mob/user) + if(pref.species == "Custom Species" || pref.custom_species) + . += "Custom Species " + . += "[pref.custom_species ? pref.custom_species : "-Input Name-"]
" + + if(pref.species == "Custom Species") + . += "Icon Base: " + . += "[pref.custom_base ? pref.custom_base : "Human"]
" + + . += "Blood Color: " + . += "Set Color" + . += "R
" + + var/points_left = pref.starting_trait_points + var/traits_left = pref.max_traits + for(var/T in pref.pos_traits + pref.neu_traits + pref.neg_traits) + points_left -= traits_costs[T] + traits_left-- + + . += "Points Left: [points_left]
" + . += "Traits Left: [traits_left]
" + if(points_left < 0 || traits_left < 0 || !pref.custom_species) + . += "^ Fix things! ^
" + + . += "Positive Trait +
" + . += "" + + . += "Neutral Trait +
" + . += "" + + . += "Negative Trait +
" + . += "" + +/datum/category_item/player_setup_item/vore/traits/OnTopic(var/href,var/list/href_list, var/mob/user) + if(!CanUseTopic(user)) + return TOPIC_NOACTION + + else if(href_list["custom_species"]) + if(pref.species != "Custom Species") + alert("You cannot set a custom species name unless you set your character to use the 'Custom Species' \ + species on the 'General' tab. If you have this set to something, it's because you had it set before the \ + Trait system was implemented. If you wish to change it, set your species to 'Custom Species' and configure \ + the species completely.") + return TOPIC_REFRESH + var/raw_choice = sanitize(input(user, "Input your custom species name:", + "Character Preference", pref.custom_species) as null|text, MAX_NAME_LEN) + if (CanUseTopic(user)) + pref.custom_species = raw_choice + return TOPIC_REFRESH + + else if(href_list["custom_base"]) + var/text_choice = input("Pick an icon set for your species:","Icon Base") in playable_species - whitelisted_species - "Custom Species" - "Promethean" + if(text_choice in playable_species) + pref.custom_base = text_choice + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["blood_color"]) + var/color_choice = input("Pick a blood color (does not apply to synths)","Blood Color",pref.blood_color) as color + if(color_choice) + pref.blood_color = sanitize_hexcolor(color_choice, default="#A10808") + return TOPIC_REFRESH + + else if(href_list["blood_reset"]) + var/choice = alert("Reset blood color to human default (#A10808)?","Reset Blood Color","Reset","Cancel") + if(choice == "Reset") + pref.blood_color = "#A10808" + return TOPIC_REFRESH + + else if(href_list["clicked_pos_trait"]) + var/datum/trait/trait = text2path(href_list["clicked_pos_trait"]) + var/choice = alert("Remove [initial(trait.name)] and regain [initial(trait.cost)] points?","Remove Trait","Remove","Cancel") + if(choice == "Remove") + pref.pos_traits -= trait + return TOPIC_REFRESH + + else if(href_list["clicked_neu_trait"]) + var/datum/trait/trait = text2path(href_list["clicked_neu_trait"]) + var/choice = alert("Remove [initial(trait.name)]?","Remove Trait","Remove","Cancel") + if(choice == "Remove") + pref.neu_traits -= trait + return TOPIC_REFRESH + + else if(href_list["clicked_neg_trait"]) + var/datum/trait/trait = text2path(href_list["clicked_neg_trait"]) + var/choice = alert("Remove [initial(trait.name)] and lose [initial(trait.cost)] points?","Remove Trait","Remove","Cancel") + if(choice == "Remove") + pref.neg_traits -= trait + return TOPIC_REFRESH + + else if(href_list["add_trait"]) + var/mode = text2num(href_list["add_trait"]) + var/list/picklist + var/list/mylist + switch(mode) + if(POSITIVE_MODE) + picklist = positive_traits.Copy() - pref.pos_traits + mylist = pref.pos_traits + if(NEUTRAL_MODE) + picklist = neutral_traits.Copy() - pref.neu_traits + mylist = pref.neu_traits + if(NEGATIVE_MODE) + picklist = negative_traits.Copy() - pref.neg_traits + mylist = pref.neg_traits + else + + if(isnull(picklist)) + return TOPIC_REFRESH + + if(isnull(mylist)) + return TOPIC_REFRESH + + var/list/nicelist = list() + for(var/P in picklist) + var/datum/trait/T = picklist[P] + nicelist[T.name] = P + + var/points_left = pref.starting_trait_points + for(var/T in pref.pos_traits + pref.neu_traits + pref.neg_traits) + points_left -= traits_costs[T] + + var/traits_left = pref.max_traits - (pref.pos_traits.len + pref.neg_traits.len + pref.neu_traits.len) + + var/trait_choice + var/done = FALSE + while(!done) + var/message = "\[Remaining: [points_left] points, [traits_left] traits\] Select a trait to read the description and see the cost." + trait_choice = input(message,"Trait List") as null|anything in nicelist + if(!trait_choice) + done = TRUE + if(trait_choice in nicelist) + var/datum/trait/path = nicelist[trait_choice] + var/choice = alert("\[Cost:[initial(path.cost)]\] [initial(path.desc)]",initial(path.name),"Take Trait","Cancel","Go Back") + if(choice == "Cancel") + trait_choice = null + if(choice != "Go Back") + done = TRUE + + if(!trait_choice) + return TOPIC_REFRESH + else if(trait_choice in nicelist) + var/datum/trait/path = nicelist[trait_choice] + var/datum/trait/instance = all_traits[path] + + var/conflict = FALSE + + if(trait_choice in pref.pos_traits + pref.neu_traits + pref.neg_traits) + conflict = instance.name + + varconflict: + for(var/P in pref.pos_traits + pref.neu_traits + pref.neg_traits) + var/datum/trait/instance_test = all_traits[P] + if(path in instance_test.excludes) + conflict = instance_test.name + break varconflict + + for(var/V in instance.var_changes) + if(V in instance_test.var_changes) + conflict = instance_test.name + break varconflict + + if(conflict) + alert("You cannot take this trait and [conflict] at the same time. \ + Please remove that trait, or pick another trait to add.","Error") + return TOPIC_REFRESH + + mylist += path + return TOPIC_REFRESH + + return ..() + +#undef POSITIVE_MODE +#undef NEUTRAL_MODE +#undef NEGATIVE_MODE diff --git a/code/modules/client/preference_setup/vore/08_nif.dm b/code/modules/client/preference_setup/vore/08_nif.dm new file mode 100644 index 00000000000..62ebbdbeac0 --- /dev/null +++ b/code/modules/client/preference_setup/vore/08_nif.dm @@ -0,0 +1,52 @@ +//Pretty small file, mostly just for storage. +/datum/preferences + var/obj/item/device/nif/nif_path + var/nif_durability + var/list/nif_savedata + +// Definition of the stuff for NIFs +/datum/category_item/player_setup_item/vore/nif + name = "NIF Data" + sort_order = 8 + +/datum/category_item/player_setup_item/vore/nif/load_character(var/savefile/S) + S["nif_path"] >> pref.nif_path + S["nif_durability"] >> pref.nif_durability + S["nif_savedata"] >> pref.nif_savedata + +/datum/category_item/player_setup_item/vore/nif/save_character(var/savefile/S) + S["nif_path"] << pref.nif_path + S["nif_durability"] << pref.nif_durability + S["nif_savedata"] << pref.nif_savedata + +/datum/category_item/player_setup_item/vore/nif/sanitize_character() + if(pref.nif_path && !ispath(pref.nif_path)) //We have at least a text string that should be a path. + pref.nif_path = text2path(pref.nif_path) //Try to convert it to a hard path. + if(!pref.nif_path) //If we couldn't, kill it. + pref.nif_path = null //Kill! + WARNING("Loaded a NIF but it was an invalid path, [pref.real_name]") + + if(ispath(pref.nif_path) && isnull(pref.nif_durability)) //How'd you lose this? + pref.nif_durability = initial(pref.nif_path.durability) //Well, have a new one, my bad. + WARNING("Loaded a NIF but with no durability, [pref.real_name]") + + if(!islist(pref.nif_savedata)) + pref.nif_savedata = list() + +/datum/category_item/player_setup_item/vore/nif/copy_to_mob(var/mob/living/carbon/human/character) + //If you had a NIF... + if((character.type == /mob/living/carbon/human) && ispath(pref.nif_path) && pref.nif_durability) + new pref.nif_path(character,pref.nif_durability,pref.nif_savedata) + + //And now here's the trick. We wipe these so that if they die, they lose the NIF. + //Backup implants will start saving this again periodically, and so will cryo'ing out. + pref.nif_path = null + pref.nif_durability = null + pref.nif_savedata = null + var/savefile/S = new /savefile(pref.path) + if(!S) WARNING ("Couldn't load NIF save savefile? [pref.real_name]") + S.cd = "/character[pref.default_slot]" + save_character(S) + +/datum/category_item/player_setup_item/vore/nif/content(var/mob/user) + . += "NIF: [ispath(pref.nif_path) ? "Present" : "None"]" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2c35c44fffc..ef5f7af0f94 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -243,6 +243,7 @@ datum/preferences load_preferences() load_character() attempt_vr(client.prefs_vr,"load_vore","") //VOREStation Edit + sanitize_preferences() else if(href_list["load"]) if(!IsGuestKey(usr.key)) open_load_dialog(usr) @@ -250,6 +251,7 @@ datum/preferences else if(href_list["changeslot"]) load_character(text2num(href_list["changeslot"])) attempt_vr(client.prefs_vr,"load_vore","") //VOREStation Edit + sanitize_preferences() close_load_dialog(usr) else if(href_list["resetslot"]) if("No" == alert("This will reset the current slot. Continue?", "Reset current slot?", "No", "Yes")) @@ -274,7 +276,10 @@ datum/preferences // Ask the preferences datums to apply their own settings to the new mob player_setup.copy_to_mob(character) - + + // VOREStation Edit - Sync up all their organs and species one final time + character.force_update_organs() + if(icon_updates) character.force_update_limbs() character.update_mutations(0) diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm index b0b3d217edd..58de134f7f8 100644 --- a/code/modules/clothing/clothing_accessories.dm +++ b/code/modules/clothing/clothing_accessories.dm @@ -40,7 +40,7 @@ return ..() /obj/item/clothing/MouseDrop(var/obj/over_object) - if (ishuman(usr) || issmall(usr)) + if (over_object && (ishuman(usr) || issmall(usr))) //makes sure that the clothing is equipped so that we can't drag it into our hand from miles away. if (!(src.loc == usr)) return diff --git a/code/modules/clothing/glasses/hud_vr.dm b/code/modules/clothing/glasses/hud_vr.dm index 8d5b923d535..8c20a75b209 100644 --- a/code/modules/clothing/glasses/hud_vr.dm +++ b/code/modules/clothing/glasses/hud_vr.dm @@ -17,13 +17,9 @@ arscreen = new arscreen_path(src) /obj/item/clothing/glasses/omnihud/Destroy() - if(hud) - qdel(hud) - hud = null - if(arscreen) - qdel(arscreen) - arscreen = null - ..() + qdel_null(hud) + qdel_null(arscreen) + . = ..() /obj/item/clothing/glasses/omnihud/dropped() if(arscreen) diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 91703336e1f..6b4b270f97c 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -123,39 +123,39 @@ if (istype(H, /obj/item/weapon/handcuffs)) attach_cuffs(H, user) -/obj/item/clothing/shoes/hightops - name = "white high tops" +/obj/item/clothing/shoes/hitops + name = "white high-tops" desc = "A pair of shoes that extends past the ankle. Based on a centuries-old, timeless design." icon_state = "whitehi" -/obj/item/clothing/shoes/hightops/red - name = "red high tops" +/obj/item/clothing/shoes/hitops/red + name = "red high-tops" icon_state = "redhi" -/obj/item/clothing/shoes/hightops/brown - name = "brown high tops" +/obj/item/clothing/shoes/hitops/brown + name = "brown high-tops" icon_state = "brownhi" -/obj/item/clothing/shoes/hightops/black - name = "black high tops" +/obj/item/clothing/shoes/hitops/black + name = "black high-tops" icon_state = "blackhi" -/obj/item/clothing/shoes/hightops/orange - name = "orange high tops" +/obj/item/clothing/shoes/hitops/orange + name = "orange high-tops" icon_state = "orangehi" -/obj/item/clothing/shoes/hightops/blue - name = "blue high tops" +/obj/item/clothing/shoes/hitops/blue + name = "blue high-tops" icon_state = "bluehi" -/obj/item/clothing/shoes/hightops/green - name = "green high tops" +/obj/item/clothing/shoes/hitops/green + name = "green high-tops" icon_state = "greenhi" -/obj/item/clothing/shoes/hightops/purple - name = "purple high tops" +/obj/item/clothing/shoes/hitops/purple + name = "purple high-tops" icon_state = "purplehi" -/obj/item/clothing/shoes/hightops/yellow - name = "yellow high tops" +/obj/item/clothing/shoes/hitops/yellow + name = "yellow high-tops" icon_state = "yellowhi" \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index cec738479ee..583f491d5e6 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -477,7 +477,7 @@ for(var/obj/item/weapon/mop_deploy/blade in M.contents) M.drop_from_inventory(blade) - del(blade) + qdel(blade) //Space Cleaner Launcher @@ -520,7 +520,7 @@ user << "You slot \the [input_device] into the suit module." user.drop_from_inventory(input_device) - del(input_device) + qdel(input_device) accepted_item.charges++ return 1 diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 403e29f662e..b586f04d27d 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -199,7 +199,7 @@ if(!piece) continue piece.icon_state = "[initial(icon_state)]" if(airtight) - piece.item_flags &= ~(STOPPRESSUREDAMAGE|AIRTIGHT|PHORONGUARD) //VOREStation edit + piece.item_flags &= ~(STOPPRESSUREDAMAGE|AIRTIGHT) update_icon(1) /obj/item/weapon/rig/proc/toggle_seals(var/mob/living/carbon/human/M,var/instant) diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm index 4724ebce5e0..ec362248013 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces_vr.dm @@ -322,4 +322,13 @@ update_icon() return 1 else - return 1 \ No newline at end of file + return 1 + +/obj/item/clothing/head/helmet/space/rig + phoronproof = 1 +/obj/item/clothing/gloves/gauntlets/rig + phoronproof = 1 +/obj/item/clothing/shoes/magboots/rig + phoronproof = 1 +/obj/item/clothing/suit/space/rig + phoronproof = 1 diff --git a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm index d3a1a0ad91f..f8ef7976d71 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm @@ -20,26 +20,26 @@ ) //Area allowing backpacks to be placed on rigsuits. -/obj/item/weapon/rig/industrial - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack) -/obj/item/weapon/rig/eva - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/toolbox,/obj/item/weapon/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/weapon/rcd,/obj/item/weapon/storage/backpack) -/obj/item/weapon/rig/hazmat - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils,/obj/item/weapon/storage/backpack) +/obj/item/weapon/rig/vox + allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/backpack) +/obj/item/weapon/rig/combat + allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack) +/obj/item/weapon/rig/ert + allowed = list(/obj/item/device/flashlight, /obj/item/weapon/tank, /obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/weapon/crowbar, \ + /obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \ + /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/weapon/storage/briefcase/inflatable, /obj/item/weapon/melee/baton, /obj/item/weapon/gun, \ + /obj/item/weapon/storage/firstaid, /obj/item/weapon/reagent_containers/hypospray, /obj/item/roller, /obj/item/weapon/storage/backpack) +/obj/item/weapon/rig/light/ninja + allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/cell, /obj/item/weapon/storage/backpack) +/obj/item/weapon/rig/merc + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs, /obj/item/weapon/storage/backpack) /obj/item/weapon/rig/ce allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack) /obj/item/weapon/rig/medical 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/roller,/obj/item/weapon/storage/backpack) +/obj/item/weapon/rig/hazmat + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils,/obj/item/weapon/storage/backpack) /obj/item/weapon/rig/hazard allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack) - -//Area allowing backpacks to be placed on hardsuits. - -/obj/item/clothing/suit/space/void/engineering - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe,/obj/item/weapon/rcd,/obj/item/weapon/storage/backpack) -/obj/item/clothing/suit/space/void/medical - 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/weapon/storage/backpack) -/obj/item/clothing/suit/space/void/security - allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/storage/backpack) -/obj/item/clothing/suit/space/void - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/backpack) \ No newline at end of file +/obj/item/weapon/rig/industrial + allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack) diff --git a/code/modules/clothing/suits/armor_vr.dm b/code/modules/clothing/suits/armor_vr.dm index 509b58e5465..9d44f78a49d 100644 --- a/code/modules/clothing/suits/armor_vr.dm +++ b/code/modules/clothing/suits/armor_vr.dm @@ -35,10 +35,10 @@ /obj/item/clothing/suit/storage/vest/hoscoat - armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) + armor = list(melee = 50, bullet = 40, laser = 40, energy = 25, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/suit/storage/vest/hos - armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) + armor = list(melee = 50, bullet = 40, laser = 40, energy = 25, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/suit/storage/vest/hoscoat/jensen name = "armored trenchcoat" diff --git a/code/modules/clothing/suits/solgov.dm b/code/modules/clothing/suits/solgov.dm index 154772fe68b..0fbb99a3f19 100644 --- a/code/modules/clothing/suits/solgov.dm +++ b/code/modules/clothing/suits/solgov.dm @@ -10,6 +10,7 @@ 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 + flags_inv = HIDEHOLSTER //VOREStation Add - These obviously do. 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) /obj/item/clothing/suit/storage/service/expeditionary diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index be7da66f844..ca630dae776 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -8,9 +8,8 @@ pockets.max_storage_space = ITEMSIZE_COST_SMALL * 2 /obj/item/clothing/suit/storage/Destroy() - qdel(pockets) - pockets = null - ..() + qdel_null(pockets) + return ..() /obj/item/clothing/suit/storage/attack_hand(mob/user as mob) if (pockets.handle_attack_hand(user)) diff --git a/code/modules/clothing/under/miscellaneous_vr.dm b/code/modules/clothing/under/miscellaneous_vr.dm index 3578d18b99e..dcf3cb2c53a 100644 --- a/code/modules/clothing/under/miscellaneous_vr.dm +++ b/code/modules/clothing/under/miscellaneous_vr.dm @@ -1,3 +1,21 @@ +/obj/item/clothing/var/hides_bulges = FALSE // OwO wats this? + +/mob/living/carbon/human/proc/show_pudge() + //A uniform could hide it. + if(istype(w_uniform,/obj/item/clothing)) + var/obj/item/clothing/under = w_uniform + if(under.hides_bulges) + return FALSE + + //We return as soon as we find one, no need for 'else' really. + if(istype(wear_suit,/obj/item/clothing)) + var/obj/item/clothing/suit = wear_suit + if(suit.hides_bulges) + return FALSE + + + return TRUE + /obj/item/clothing/under/permit name = "public nudity permit" desc = "This permit entitles the bearer to conduct their duties without a uniform. Normally issued to furred crewmembers or those with nothing to hide." @@ -9,3 +27,93 @@ item_state = "golem" //This is dumb and hacky but was here when I got here. worn_state = "golem" //It's basically just a coincidentally black iconstate in the file. + +/obj/item/clothing/under/bluespace + name = "bluespace jumpsuit" + icon_state = "lingchameleon" + item_icons = list( + slot_l_hand_str = 'icons/mob/items/lefthand_uniforms.dmi', + slot_r_hand_str = 'icons/mob/items/righthand_uniforms.dmi', + ) + item_state = "lingchameleon" + worn_state = "lingchameleon" + desc = "Do you feel like warping spacetime today? Because it seems like that's on the agenda, now. \ + Allows one to resize themselves at will, and conceals their true weight." + hides_bulges = TRUE + var/original_size + +/obj/item/clothing/under/bluespace/verb/resize() + set name = "Adjust Size" + set category = "Object" + set src in usr + bluespace_size(usr) + ..() + +/obj/item/clothing/under/bluespace/proc/bluespace_size(mob/usr as mob) + if (!ishuman(usr)) + return + + var/mob/living/carbon/human/H = usr + + if (H.stat || H.restrained()) + return + + if (src != H.w_uniform) + to_chat(H,"You must be WEARING the uniform to change your size.") + return + + var/choice = alert(H,"Change which way?","Mass Alteration","Size Up","Cancel","Size Down") + if(choice == "Cancel") + return FALSE + + //Check AGAIN because we accepted user input which is blocking. + if (src != H.w_uniform) + to_chat(H,"You must be WEARING the uniform to change your size.") + return + + if (isnull(H.size_multiplier)) + to_chat(H,"The uniform panics and corrects your apparently microscopic size.") + H.resize(RESIZE_NORMAL) + H.update_icons() + return + + var/new_size + if (choice == "Size Up") + switch(H.size_multiplier) + if(RESIZE_BIG to RESIZE_HUGE) + new_size = RESIZE_HUGE + if(RESIZE_NORMAL to RESIZE_BIG) + new_size = RESIZE_BIG + if(RESIZE_SMALL to RESIZE_NORMAL) + new_size = RESIZE_NORMAL + if((0 - INFINITY) to RESIZE_TINY) + new_size = RESIZE_SMALL + + else if (choice == "Size Down") + switch(H.size_multiplier) + if(RESIZE_HUGE to INFINITY) + new_size = RESIZE_BIG + if(RESIZE_BIG to RESIZE_HUGE) + new_size = RESIZE_NORMAL + if(RESIZE_NORMAL to RESIZE_BIG) + new_size = RESIZE_SMALL + if((0 - INFINITY) to RESIZE_NORMAL) + new_size = RESIZE_TINY + + if(new_size) + if(new_size != H.size_multiplier) + if(!original_size) + original_size = H.size_multiplier + H.resize(new_size) + H.visible_message("The space around [H] distorts as they change size!","The space around you distorts as you change size!") + else + to_chat(H,"That's as far as you can resize in that direction!") + return + +/obj/item/clothing/under/bluespace/mob_can_unequip(mob/M, slot, disable_warning = 0) + . = ..() + if(. && ishuman(M) && original_size) + var/mob/living/carbon/human/H = M + H.resize(original_size) + original_size = null + H.visible_message("The space around [H] distorts as they return to their original size!","The space around you distorts as you return to your original size!") diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index 806d7ad34ac..a85546bd14f 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -12,6 +12,8 @@ /obj/item/weapon/evidencebag/MouseDrop(var/obj/item/I as obj) if (!ishuman(usr)) return + if(!istype(I) || I.anchored) + return ..() var/mob/living/carbon/human/user = usr @@ -36,9 +38,6 @@ else return - if(!istype(I) || I.anchored) - return - if(istype(I, /obj/item/weapon/evidencebag)) user << "You find putting an evidence bag in another evidence bag to be slightly absurd." return diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 57af12525dd..32eb1ad4f47 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -35,7 +35,7 @@ /obj/item/weapon/reagent_containers/glass/rag/Destroy() processing_objects -= src //so we don't continue turning to ash while gc'd - ..() + return ..() /obj/item/weapon/reagent_containers/glass/rag/attack_self(mob/user as mob) if(on_fire) @@ -102,6 +102,10 @@ if(do_after(user,30)) user.visible_message("\The [user] finishes wiping off the [A]!") A.clean_blood() + if(istype(A, /turf) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay) || istype(A, /obj/effect/rune)) //VOREStation Edit - "Allows rags to clean dirt from turfs" + var/turf/T = get_turf(A) + if(T) + T.clean(src, user) //VOREStation Edit End /obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag) if(isliving(target)) @@ -132,7 +136,7 @@ if(!proximity) return - if(istype(A, /obj/structure/reagent_dispensers)) + if(istype(A, /obj/structure/reagent_dispensers) || istype(A, /obj/item/weapon/reagent_containers/glass/bucket) || istype(A, /obj/structure/mopbucket)) //VOREStation Edit - "Allows rags to be used on buckets and mopbuckets" if(!reagents.get_free_space()) user << "\The [src] is already soaked." return diff --git a/code/modules/events/radiation_storm.dm b/code/modules/events/radiation_storm.dm index c2534964237..cad80ffb834 100644 --- a/code/modules/events/radiation_storm.dm +++ b/code/modules/events/radiation_storm.dm @@ -2,7 +2,7 @@ var/const/enterBelt = 30 var/const/radIntervall = 5 // Enough time between enter/leave belt for 10 hits, as per original implementation var/const/leaveBelt = 80 - var/const/revokeAccess = 135 + var/const/revokeAccess = 165 startWhen = 2 announceWhen = 1 endWhen = revokeAccess @@ -27,23 +27,21 @@ radiate() else if(activeFor == leaveBelt) - command_announcement.Announce("The station has passed the radiation belt. Please report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") - + command_announcement.Announce("The station has passed the radiation belt. Please allow for up to one minute while radiation levels dissipate, and report to medbay if you experience any unusual symptoms. Maintenance will lose all access again shortly.", "Anomaly Alert") /datum/event/radiation_storm/proc/radiate() + var/radiation_level = rand(15, 35) + for(var/z in using_map.station_levels) + radiation_repository.z_radiate(locate(1, 1, z), radiation_level, 1) + for(var/mob/living/carbon/C in living_mob_list) var/area/A = get_area(C) if(!A) continue - if(!(A.z in using_map.station_levels)) - continue if(A.flags & RAD_SHIELDED) continue - if(istype(C,/mob/living/carbon/human)) var/mob/living/carbon/human/H = C - H.apply_effect((rand(15,35)),IRRADIATE,0) if(prob(5)) - H.apply_effect((rand(40,70)),IRRADIATE,0) if (prob(75)) randmutb(H) // Applies bad mutation domutcheck(H,null,MUTCHK_FORCED) diff --git a/code/modules/events/solar_storm.dm b/code/modules/events/solar_storm.dm index 971e0418bc9..afaa01ed95a 100644 --- a/code/modules/events/solar_storm.dm +++ b/code/modules/events/solar_storm.dm @@ -27,6 +27,7 @@ radiate() /datum/event/solar_storm/proc/radiate() + // Note: Too complicated to be worth trying to use the radiation system for this. Its only in space anyway, so we make an exception in this case. for(var/mob/living/L in living_mob_list) var/turf/T = get_turf(L) if(!T) @@ -36,8 +37,7 @@ continue //Todo: Apply some burn damage from the heat of the sun. Until then, enjoy some moderate radiation. - L.apply_effect((rand(15,30)),IRRADIATE,blocked = L.getarmor(null, "rad")) - + L.rad_act(rand(15, 30)) /datum/event/solar_storm/end() command_announcement.Announce("The solar storm has passed the station. It is now safe to resume EVA activities. Please report to medbay if you experience any unusual symptoms. ", "Anomaly Alert") diff --git a/code/modules/examine/descriptions/engineering.dm b/code/modules/examine/descriptions/engineering.dm index c3f9b9b21fa..37e69f16f90 100644 --- a/code/modules/examine/descriptions/engineering.dm +++ b/code/modules/examine/descriptions/engineering.dm @@ -25,11 +25,54 @@ Wires can be pulsed remotely with a signaler attached to it. A powersink will also drain any APCs connected to the same wire the powersink is on." /obj/item/inflatable - description_info = "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb." + description_info = "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb. \ + You can also inflate this on an adjacent tile by clicking the tile." /obj/structure/inflatable - description_info = "To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever." + description_info = "To remove these safely, use the 'deflate' verb, or alt-click on it. Hitting these with any objects will probably puncture and break it forever." /obj/structure/inflatable/door description_info = "Click the door to open or close it. It only stops air while closed.
\ To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever." + +/obj/machinery/door/get_description_interaction() + var/list/results = list() + if(!repairing && (health < maxhealth) && !(stat & BROKEN)) + results += "[desc_panel_image("metal sheet")]to start repairing damage (May require different material type)." + if(repairing && density) + results += "[desc_panel_image("welder")]to finish repairs." + results += "[desc_panel_image("crowbar")]to undo adding sheets for repairs." + + return results + +/obj/machinery/door/airlock/get_description_interaction() + var/list/results = list() + + if(can_remove_electronics()) + results += "[desc_panel_image("crowbar")]to remove the airlock electronics." + else + results += "[desc_panel_image("crowbar")]to open or close if unpowered/broken, and unbolted." + + if(welded) + results += "[desc_panel_image("welder")]to unweld, allowing it to open again." + else + results += "[desc_panel_image("welder")]to weld, preventing it from opening." + + if(p_open) + results += "[desc_panel_image("screwdriver")]to close the wire panel." + results += "[desc_panel_image("wirecutters")]to cut an internal wire while hacking." + results += "[desc_panel_image("multitool")]to pulse an internal wire while hacking." + else + results += "[desc_panel_image("screwdriver")]to open the wire panel, enabling the ability to hack." + + results += ..() + + return results + +/obj/machinery/portable_atmospherics/canister/get_description_interaction() + var/list/results = list() + + results += "[desc_panel_image("wrench")]to connect or disconnect from a connector port below." + results += "[desc_panel_image("air tank")]to fill the air tank from this canister." + + return results \ No newline at end of file diff --git a/code/modules/examine/descriptions/turfs.dm b/code/modules/examine/descriptions/turfs.dm index cccc43e0731..4319c23ffe6 100644 --- a/code/modules/examine/descriptions/turfs.dm +++ b/code/modules/examine/descriptions/turfs.dm @@ -1,3 +1,33 @@ /turf/simulated/wall - description_info = "You can deconstruct this by welding it, and then wrenching the girder.
\ - You can build a wall by using metal sheets and making a girder, then adding more metal or plasteel." \ No newline at end of file + description_info = "You can build a wall by using metal sheets and making a girder, then adding more metal or plasteel." + +/turf/simulated/wall/get_description_interaction() + var/list/results = list() + if(damage) + results += "[desc_panel_image("welder")]to repair." + + if(isnull(construction_stage) || !reinf_material) + results += "[desc_panel_image("welder")]to deconstruct if undamaged." + else + switch(construction_stage) + if(6) + results += "[desc_panel_image("wirecutters")]to begin deconstruction." + if(5) + results += list( + "[desc_panel_image("screwdriver")]to continue deconstruction.", + "[desc_panel_image("wirecutters")]to reverse deconstruction." + ) + if(4) + results += list( + "[desc_panel_image("welder")]to continue deconstruction.", + "[desc_panel_image("screwdriver")]to reverse deconstruction." + ) + if(3) + results += "[desc_panel_image("crowbar")]to continue deconstruction." + if(2) + results += "[desc_panel_image("wrench")]to continue deconstruction." + if(1) + results += "[desc_panel_image("welder")]to continue deconstruction." + if(0) + results += "[desc_panel_image("crowbar")]to finish deconstruction." + return results \ No newline at end of file diff --git a/code/modules/examine/examine.dm b/code/modules/examine/examine.dm index f09fce6cf32..6e2df0b1fa9 100644 --- a/code/modules/examine/examine.dm +++ b/code/modules/examine/examine.dm @@ -5,6 +5,7 @@ This means that this file can be unchecked, along with the other examine files, and can be removed entirely with no effort. */ +#define EXAMINE_PANEL_PADDING " " /atom/ var/description_info = null //Helpful blue text. @@ -27,6 +28,14 @@ return description_antag return +// This one is slightly different, in that it must return a list. +/atom/proc/get_description_interaction() + return list() + +// Quickly adds the boilerplate code to add an image and padding for the image. +/proc/desc_panel_image(var/icon_state) + return "\icon[description_icons[icon_state]][EXAMINE_PANEL_PADDING]" + /mob/living/get_description_fluff() if(flavor_text) //Get flavor text for the green text. return flavor_text @@ -44,18 +53,23 @@ description_holders["info"] = A.get_description_info() description_holders["fluff"] = A.get_description_fluff() description_holders["antag"] = (update_antag_info)? A.get_description_antag() : "" + description_holders["interactions"] = A.get_description_interaction() description_holders["name"] = "[A.name]" description_holders["icon"] = "\icon[A]" description_holders["desc"] = A.desc -/client/Stat() +/mob/Stat() . = ..() - if(usr && statpanel("Examine")) + if(client && statpanel("Examine")) + var/description_holders = client.description_holders stat(null,"[description_holders["icon"]] [description_holders["name"]]") //The name, written in big letters. stat(null,"[description_holders["desc"]]") //the default examine text. if(description_holders["info"]) stat(null,"[description_holders["info"]]") //Blue, informative text. + if(description_holders["interactions"]) + for(var/line in description_holders["interactions"]) + stat(null, "[line]") if(description_holders["fluff"]) stat(null,"[description_holders["fluff"]]") //Yellow, fluff-related text. if(description_holders["antag"]) @@ -66,6 +80,9 @@ if(..()) return 1 - var/is_antag = ((mind && mind.special_role) || isobserver(src)) //ghosts don't have minds + update_examine_panel(A) + +/mob/proc/update_examine_panel(var/atom/A) if(client) + var/is_antag = ((mind && mind.special_role) || isobserver(src)) //ghosts don't have minds client.update_description_holders(A, is_antag) diff --git a/code/modules/examine/stat_icons.dm b/code/modules/examine/stat_icons.dm index 77d97fe0a17..ba09157d1c4 100644 --- a/code/modules/examine/stat_icons.dm +++ b/code/modules/examine/stat_icons.dm @@ -6,5 +6,19 @@ var/global/list/description_icons = list( "energy_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="energy_protection"), "bomb_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="bomb_protection"), "radiation_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="radiation_protection"), - "biohazard_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="biohazard_protection") - ) \ No newline at end of file + "biohazard_armor" = image(icon='icons/mob/screen1_stats.dmi',icon_state="biohazard_protection"), + + "welder" = image(icon='icons/obj/items.dmi',icon_state="welder"), + "wirecutters" = image(icon='icons/obj/items.dmi',icon_state="cutters"), + "screwdriver" = image(icon='icons/obj/items.dmi',icon_state="screwdriver"), + "wrench" = image(icon='icons/obj/items.dmi',icon_state="wrench"), + "crowbar" = image(icon='icons/obj/items.dmi',icon_state="crowbar"), + "multitool" = image(icon='icons/obj/device.dmi',icon_state="multitool"), + + "metal sheet" = image(icon='icons/obj/items.dmi',icon_state="sheet-metal"), + "plasteel sheet" = image(icon='icons/obj/items.dmi',icon_state="sheet-plasteel"), + + "air tank" = image(icon='icons/obj/tank.dmi',icon_state="oxygen"), + + "connector" = image(icon='icons/obj/pipes.dmi',icon_state="connector") + ) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index a8987538ab1..c887ff5b9b2 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -332,7 +332,7 @@ proc/check_panel(mob/M) qdel(O) return -var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_magazine/a357,\ +var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/item/ammo_magazine/s357,\ /obj/item/weapon/gun/energy/crossbow, /obj/item/weapon/melee/energy/sword,\ /obj/item/weapon/storage/box/syndicate, /obj/item/weapon/storage/box/emps,\ /obj/item/weapon/cartridge/syndicate, /obj/item/clothing/under/chameleon,\ diff --git a/code/modules/food/recipes_microwave_vr.dm b/code/modules/food/recipes_microwave_vr.dm index 641f02d31f5..8375e4e964a 100644 --- a/code/modules/food/recipes_microwave_vr.dm +++ b/code/modules/food/recipes_microwave_vr.dm @@ -93,3 +93,24 @@ /obj/item/weapon/reagent_containers/food/snacks/meat ) result = /obj/item/weapon/reagent_containers/food/snacks/generalschicken + +/datum/recipe/chocroizegg + items = list( + /obj/item/weapon/reagent_containers/food/snacks/chocolatebar, + /obj/item/weapon/reagent_containers/food/snacks/egg/roiz + ) + result = /obj/item/weapon/reagent_containers/food/snacks/chocolateegg/roiz + +/datum/recipe/friedroizegg + reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg/roiz + ) + result = /obj/item/weapon/reagent_containers/food/snacks/friedegg/roiz + +/datum/recipe/boiledroizegg + reagents = list("water" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg/roiz + ) + result = /obj/item/weapon/reagent_containers/food/snacks/boiledegg/roiz \ No newline at end of file diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 1971f04bcc3..17b81c937b3 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -127,9 +127,6 @@ ) item_state = "boxing" -/obj/structure/window/reinforced/holowindow/Destroy() - ..() - /obj/structure/window/reinforced/holowindow/attackby(obj/item/W as obj, mob/user as mob) if(!istype(W)) return//I really wish I did not need this if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) @@ -183,12 +180,6 @@ qdel(src) return -/obj/structure/window/reinforced/holowindow/disappearing/Destroy() - ..() - -/obj/machinery/door/window/holowindoor/Destroy() - ..() - /obj/machinery/door/window/holowindoor/attackby(obj/item/weapon/I as obj, mob/user as mob) if (src.operating == 1) @@ -224,17 +215,11 @@ visible_message("[src] fades away as it shatters!") qdel(src) -/obj/structure/bed/chair/holochair/Destroy() - ..() - /obj/structure/bed/chair/holochair/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) user << ("It's a holochair, you can't dismantle it!") return //VOREStation Add -/obj/structure/bed/holobed/Destroy() - ..() - /obj/structure/bed/holobed/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) user << ("It's a holochair, you can't dismantle it!") @@ -427,6 +412,10 @@ for(var/mob/M in currentarea) M << "FIGHT!" +// A window that disappears when the ready button is pressed +/obj/structure/window/reinforced/holowindow/disappearing + name = "Event Window" + //Holocarp /mob/living/simple_animal/hostile/carp/holodeck diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 1cff4314af7..b66abd61daa 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -77,7 +77,8 @@ plant_controller.remove_plant(src) for(var/obj/effect/plant/neighbor in range(1,src)) plant_controller.add_plant(neighbor) - ..() + return ..() + /obj/effect/plant/single spread_chance = 0 diff --git a/code/modules/hydroponics/spreading/spreading_growth.dm b/code/modules/hydroponics/spreading/spreading_growth.dm index fca9f3abafe..0dbe4c9eead 100644 --- a/code/modules/hydroponics/spreading/spreading_growth.dm +++ b/code/modules/hydroponics/spreading/spreading_growth.dm @@ -116,7 +116,7 @@ var/obj/effect/plant/child = new(get_turf(src),seed,parent) spawn(1) // This should do a little bit of animation. - if(deleted(child)) + if(QDELETED(child)) return //move out to the destination diff --git a/code/modules/integrated_electronics/subtypes/input_output.dm b/code/modules/integrated_electronics/subtypes/input_output.dm index 456fae889f2..1a4fdb7c454 100644 --- a/code/modules/integrated_electronics/subtypes/input_output.dm +++ b/code/modules/integrated_electronics/subtypes/input_output.dm @@ -304,7 +304,8 @@ if(exonet) exonet.remove_address() qdel(exonet) - ..() + exonet = null + return ..() /obj/item/integrated_circuit/input/EPv2/do_work() var/target_address = get_pin_data(IC_INPUT, 1) @@ -370,7 +371,7 @@ /obj/item/integrated_circuit/input/microphone/Destroy() listening_objects -= src - ..() + return ..() /obj/item/integrated_circuit/input/microphone/hear_talk(mob/living/M, msg, var/verb="says", datum/language/speaking=null) var/translated = FALSE @@ -483,9 +484,6 @@ var/light_rgb = "#FFFFFF" power_draw_idle = 0 // Adjusted based on brightness. -/obj/item/integrated_circuit/output/light/Destroy() - ..() - /obj/item/integrated_circuit/output/light/do_work() light_toggled = !light_toggled update_lighting() @@ -644,8 +642,8 @@ on_data_written() /obj/item/integrated_circuit/output/video_camera/Destroy() - qdel(camera) - ..() + qdel_null(camera) + return ..() /obj/item/integrated_circuit/output/video_camera/proc/set_camera_status(var/status) if(camera) diff --git a/code/modules/lighting/lighting_corner.dm b/code/modules/lighting/lighting_corner.dm index 63ce1232535..088c53e5216 100644 --- a/code/modules/lighting/lighting_corner.dm +++ b/code/modules/lighting/lighting_corner.dm @@ -131,3 +131,9 @@ /datum/lighting_corner/dummy/New() return + +/datum/lighting_corner/Destroy(var/force) + if (!force) + return QDEL_HINT_LETMELIVE + crash_with("Who decided to force qdel() a lighting corner? Why did you do this?") + return ..() diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 60c684fd862..e02f9762810 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -39,7 +39,7 @@ log_debug("A lighting overlay realised its loc was NOT a turf (actual loc: [loc][loc ? ", " + loc.type : "null"]) in update_overlay() and got qdel'ed!") else log_debug("A lighting overlay realised it was in nullspace in update_overlay() and got pooled!") - qdel(src) + qdel(src, force=TRUE) return // To the future coder who sees this and thinks @@ -121,14 +121,17 @@ /atom/movable/lighting_overlay/throw_at() return 0 -/atom/movable/lighting_overlay/Destroy() - total_lighting_overlays-- - global.lighting_update_overlays -= src - global.lighting_update_overlays_old -= src +/atom/movable/lighting_overlay/Destroy(var/force) + if (force) + total_lighting_overlays-- + global.lighting_update_overlays -= src + LAZYREMOVE(SSlighting.currentrun, src) - var/turf/T = loc - if(istype(T)) - T.lighting_overlay = null - T.luminosity = 1 + var/turf/T = loc + if(istype(T)) + T.lighting_overlay = null + T.luminosity = 1 - return ..() + return ..() + else + return QDEL_HINT_LETMELIVE diff --git a/code/modules/lighting/lighting_setup.dm b/code/modules/lighting/lighting_setup.dm index 981de658649..5d1208f8ef8 100644 --- a/code/modules/lighting/lighting_setup.dm +++ b/code/modules/lighting/lighting_setup.dm @@ -1,16 +1,11 @@ +// Create lighting overlays on all turfs with dynamic lighting in areas with dynamic lighting. /proc/create_all_lighting_overlays() - for(var/zlevel = 1 to world.maxz) - create_lighting_overlays_zlevel(zlevel) - -/proc/create_lighting_overlays_zlevel(var/zlevel) - ASSERT(zlevel) - - for(var/turf/T in block(locate(1, 1, zlevel), locate(world.maxx, world.maxy, zlevel))) - if(!T.dynamic_lighting) - continue - - var/area/A = T.loc + for(var/area/A in world) if(!A.dynamic_lighting) continue - - new /atom/movable/lighting_overlay(T, TRUE) + for(var/turf/T in A) + if(!T.dynamic_lighting) + continue + new /atom/movable/lighting_overlay(T, TRUE) + CHECK_TICK + CHECK_TICK diff --git a/code/modules/media/mediamanager.dm b/code/modules/media/mediamanager.dm index 94bf6e79a50..83da1250a7b 100644 --- a/code/modules/media/mediamanager.dm +++ b/code/modules/media/mediamanager.dm @@ -59,7 +59,7 @@ set_new_volume(usr) /client/proc/set_new_volume(var/mob/user) - if(deleted(src.media) || !istype(src.media)) + if(!QDELETED(src.media) || !istype(src.media)) to_chat(user, "You have no media datum to change, if you're not in the lobby tell an admin.") return var/value = input("Choose your Jukebox volume.", "Jukebox volume", media.volume) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index bf59f3c3826..a6a857c43b8 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -482,7 +482,7 @@ var/list/mining_overlay_cache = list() M.flash_eyes() if(prob(50)) M.Stun(5) - M.apply_effect(25, IRRADIATE) + radiation_repository.flat_radiate(src, 25, 200) if(prob(25)) excavate_find(prob(5), finds[1]) else if(rand(1,500) == 1) diff --git a/code/modules/mob/dead/observer/free_vr.dm b/code/modules/mob/dead/observer/free_vr.dm new file mode 100644 index 00000000000..c10101f8be9 --- /dev/null +++ b/code/modules/mob/dead/observer/free_vr.dm @@ -0,0 +1,68 @@ +var/global/list/prevent_respawns = list() + +/hook/death/proc/quit_notify(mob/dead) + if(ishuman(dead)) + to_chat(dead,"You're dead! If you don't intend to continue playing this round as this character, please use the Quit This Round verb in the OOC tab to free your job slot.") + + return TRUE + +/mob/observer/dead/verb/cleanup() + set name = "Quit This Round" + set category = "OOC" + set desc = "Free your job slot, remove yourself from the manifest, and prevent respawning as this character for this round." + + var/confirm = alert("This will free up your job slot, remove you from the manifest, and prevent you from respawning with this character for the round. You can rejoin as another \ + character if you like. Do this now?","Quit This Round","Quit Round","Cancel") + if(confirm != "Quit Round") + return + + //Why are you clicking this button? + if(!mind || !mind.assigned_role) + to_chat(src,"Either you haven't played this round, or you already used this verb.") + return + + //Add them to the nope list + prevent_respawns += mind.name + + //Update any existing objectives involving this mob. + for(var/datum/objective/O in all_objectives) + if(O.target == src.mind) + if(O.owner && O.owner.current) + to_chat(O.owner.current,"You get the feeling your target is no longer within your reach...") + qdel(O) + + //Resleeving cleanup + if(src.mind.name in SStranscore.backed_up) + var/datum/transhuman/mind_record/MR = SStranscore.backed_up[src.mind.name] + SStranscore.stop_backup(MR) + if(src.mind.name in SStranscore.body_scans) //This uses mind names to avoid people cryo'ing a printed body to delete body scans. + var/datum/transhuman/body_record/BR = SStranscore.body_scans[src.mind.name] + SStranscore.remove_body(BR) + + //Job slot cleanup + var/job = src.mind.assigned_role + job_master.FreeRole(job) + + //Their objectives cleanup + if(src.mind.objectives.len) + qdel(src.mind.objectives) + src.mind.special_role = null + + //Cut the PDA manifest (ugh) + if(PDA_Manifest.len) + PDA_Manifest.Cut() + for(var/datum/data/record/R in data_core.medical) + if((R.fields["name"] == src.real_name)) + qdel(R) + for(var/datum/data/record/T in data_core.security) + if((T.fields["name"] == src.real_name)) + qdel(T) + for(var/datum/data/record/G in data_core.general) + if((G.fields["name"] == src.real_name)) + qdel(G) + + //This removes them from being 'active' list on join screen + src.mind.assigned_role = null + + //Feedback + to_chat(src,"Your job has been free'd up, and you can rejoin as another character or quit. Thanks for using this verb, it helps the server!") diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index e19a308c473..5c77ed261b2 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -132,7 +132,7 @@ var/global/list/image/ghost_sightless_images = list() //this is a list of images qdel(ghostimage) ghostimage = null updateallghostimages() - ..() + return ..() /mob/observer/dead/Topic(href, href_list) if (href_list["track"]) @@ -255,6 +255,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients usr << "Another consciousness is in your body... it is resisting you." return + //VOREStation Add + if(prevent_respawns.Find(mind.name)) + to_chat(usr,"You already quit this round as this character, sorry!") + return + //VOREStation Add End if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). var/found_rune for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index b2748e6f061..4de1dcf5950 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -34,11 +34,14 @@ var/list/m_viewers = in_range["mobs"] var/list/o_viewers = in_range["objs"] - for(var/mob/M in m_viewers) + for(var/mob in m_viewers) + var/mob/M = mob spawn(0) // It's possible that it could be deleted in the meantime, or that it runtimes. if(M) M.show_message(message, m_type) - for(var/obj/O in o_viewers) + + for(var/obj in o_viewers) + var/obj/O = obj spawn(0) if(O) O.see_emote(src, message, m_type) diff --git a/code/modules/mob/freelook/ai/eye.dm b/code/modules/mob/freelook/ai/eye.dm index 62f0d931520..a1c28a4af34 100644 --- a/code/modules/mob/freelook/ai/eye.dm +++ b/code/modules/mob/freelook/ai/eye.dm @@ -59,7 +59,7 @@ /mob/living/silicon/ai/Destroy() destroy_eyeobj() - ..() + return ..() /atom/proc/move_camera_by_click() if(istype(usr, /mob/living/silicon/ai)) diff --git a/code/modules/mob/freelook/ai/update_triggers.dm b/code/modules/mob/freelook/ai/update_triggers.dm index f4fea0aa58f..5c21c6784da 100644 --- a/code/modules/mob/freelook/ai/update_triggers.dm +++ b/code/modules/mob/freelook/ai/update_triggers.dm @@ -59,7 +59,7 @@ /obj/machinery/camera/Destroy() clear_all_networks() cameranet.cameras -= src - ..() + return ..() // Mobs /mob/living/silicon/ai/rejuvenate() diff --git a/code/modules/mob/freelook/eye.dm b/code/modules/mob/freelook/eye.dm index 0c38ad8033c..ff8681d128a 100644 --- a/code/modules/mob/freelook/eye.dm +++ b/code/modules/mob/freelook/eye.dm @@ -38,7 +38,11 @@ mob/observer/eye/Destroy() qdel(ghostimage) ghostimage = null updateallghostimages() - ..() + if(owner) + if(owner.eyeobj == src) + owner.eyeobj = null + owner = null + . = ..() /mob/observer/eye/Move(n, direct) if(owner == src) diff --git a/code/modules/mob/freelook/mask/update_triggers.dm b/code/modules/mob/freelook/mask/update_triggers.dm index 11423671640..1dd520e7f1d 100644 --- a/code/modules/mob/freelook/mask/update_triggers.dm +++ b/code/modules/mob/freelook/mask/update_triggers.dm @@ -25,7 +25,7 @@ /mob/living/Destroy() cultnet.updateVisibility(src, 0) - ..() + return ..() /mob/living/rejuvenate() var/was_dead = stat == DEAD diff --git a/code/modules/mob/freelook/update_triggers.dm b/code/modules/mob/freelook/update_triggers.dm index 8408083ba8b..482025426eb 100644 --- a/code/modules/mob/freelook/update_triggers.dm +++ b/code/modules/mob/freelook/update_triggers.dm @@ -15,7 +15,7 @@ /turf/simulated/Destroy() updateVisibility(src) - ..() + return ..() /turf/simulated/New() ..() @@ -26,7 +26,7 @@ /obj/structure/Destroy() updateVisibility(src) - ..() + return ..() /obj/structure/New() ..() diff --git a/code/modules/mob/freelook/visualnet.dm b/code/modules/mob/freelook/visualnet.dm index 24ad252eda1..0d53d1e48a5 100644 --- a/code/modules/mob/freelook/visualnet.dm +++ b/code/modules/mob/freelook/visualnet.dm @@ -14,7 +14,7 @@ /datum/visualnet/Destroy() visual_nets -= src - ..() + return ..() // Checks if a chunk has been Generated in x, y, z. /datum/visualnet/proc/chunkGenerated(x, y, z) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index b6b99781f4c..24a61e66952 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -27,7 +27,7 @@ var/list/holder_mob_icon_cache = list() /obj/item/weapon/holder/Destroy() processing_objects.Remove(src) - ..() + return ..() /obj/item/weapon/holder/process() update_state() diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index e74d6dab905..687fb7626d3 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -110,10 +110,8 @@ if(isrobot(loc)) var/mob/living/silicon/robot/borg = loc borg.mmi = null - if(brainmob) - qdel(brainmob) - brainmob = null - ..() + qdel_null(brainmob) + return ..() /obj/item/device/mmi/radio_enabled name = "radio-enabled man-machine interface" diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index 0f4db8c1eb7..2905b4fe4db 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -20,7 +20,7 @@ if(stat!=DEAD) //If not dead. death(1) //Brains can die again. AND THEY SHOULD AHA HA HA HA HA HA ghostize() //Ghostize checks for key so nothing else is necessary. - ..() + return ..() say_understands(var/other)//Goddamn is this hackish, but this say code is so odd if (istype(other, /mob/living/silicon/ai)) diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm index 354a26221c4..8dffa60d1eb 100644 --- a/code/modules/mob/living/carbon/breathe.dm +++ b/code/modules/mob/living/carbon/breathe.dm @@ -22,6 +22,13 @@ else //Okay, we can breathe, now check if we can get air breath = get_breath_from_internal() //First, check for air from internals + //VOREStation Add - Respirocytes as a NIF implant + if(!breath && ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.nif && H.nif.flag_check(NIF_H_SPAREBREATH,NIF_FLAGS_HEALTH)) + var/datum/nifsoft/spare_breath/SB = H.nif.imp_check(NIF_SPAREBREATH) + breath = SB.resp_breath() + //VOREStation Add End if(!breath) breath = get_breath_from_environment() //No breath from internals so let's try to get air from our location if(!breath) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 47da8c88f8a..47e12f3f6da 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -254,6 +254,7 @@ src.sleeping = max(0,src.sleeping-5) if(src.sleeping == 0) src.resting = 0 + if(H) H.in_stasis = 0 //VOREStation Add - Just In Case M.visible_message("[M] shakes [src] trying to wake [t_him] up!", \ "You shake [src] trying to wake [t_him] up!") else diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm index 274ddd2904d..b001a4ca7ba 100644 --- a/code/modules/mob/living/carbon/human/emote_vr.dm +++ b/code/modules/mob/living/carbon/human/emote_vr.dm @@ -13,6 +13,38 @@ if ("awoo") message = "awoos loudly. AwoooOOOOoooo!" m_type = 2 + if ("nsay") + if(!nif) + to_chat(src,"You can't use *nsay without a NIF.") + return 1 + var/datum/nifsoft/soulcatcher/SC = nif.imp_check(NIF_SOULCATCHER) + if(!SC) + to_chat(src,"You need the Soulcatcher software to use *nme.") + return 1 + if(!SC.brainmobs.len) + to_chat(src,"You need a loaded mind to use *nme.") + return 1 + var/nifmessage = sanitize(input("Type a message to say.","Speak into NIF") as text|null) + if(nifmessage) + SC.say_into(nifmessage,src) + return 1 + + if ("nme") + if(!nif) + to_chat(src,"You can't use *nme without a NIF.") + return 1 + var/datum/nifsoft/soulcatcher/SC = nif.imp_check(NIF_SOULCATCHER) + if(!SC) + to_chat(src,"You need the Soulcatcher software to use *nme.") + return 1 + if(!SC.brainmobs.len) + to_chat(src,"You need a loaded mind to use *nme.") + return 1 + var/nifmessage = sanitize(input("Type an action to perform.","Emote into NIF") as text|null) + if(nifmessage) + SC.emote_into(nifmessage,src) + return 1 + if ("flip") var/danger = 1 //Base 1% chance to break something. var/list/involved_parts = list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 98f0e8450c1..21decac0fe2 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -1,4 +1,5 @@ /mob/living/carbon/human/examine(mob/user) + var/skipgloves = 0 var/skipsuitstorage = 0 var/skipjumpsuit = 0 @@ -17,6 +18,18 @@ var/skiparms = 0 var/skipfeet = 0 + + var/cloaked = 0 // 0 for normal, 1 for cloaked close + + if(mind && mind.changeling && mind.changeling.cloaked && !istype(user, /mob/observer)) + var/distance = get_dist(user, src) + if(distance > 2) + src.loc.examine(user) + return + else + cloaked = 1 + + var/looks_synth = looksSynthetic() //exosuits and helmets obscure our view and stuff. @@ -79,9 +92,13 @@ var/list/msg = list("*---------*\nThis is ") + var/datum/gender/T = gender_datums[get_gender()] + if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender T = gender_datums[PLURAL] + if(cloaked) + T = gender_datums[NEUTER] else if(species && species.ambiguous_genders) var/can_detect_gender = FALSE @@ -454,7 +471,8 @@ msg += "Medical records: \[View\] \[Add comment\]\n" - if(print_flavor_text()) msg += "[print_flavor_text()]\n" + if(print_flavor_text() && !cloaked) + msg += "[print_flavor_text()]\n" // VOREStation Start if(ooc_notes) @@ -462,13 +480,20 @@ // VOREStation End msg += "*---------*
" msg += applying_pressure - if (pose) + if (pose && !cloaked) if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 ) pose = addtext(pose,".") //Makes sure all emotes end with a period. msg += "[T.He] [pose]" user << jointext(msg, null) + +/mob/living/carbon/human/get_description_fluff() + if(mind && mind.changeling && mind.changeling.cloaked) + return "" + else + return ..() + //Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records. /proc/hasHUD(mob/M as mob, hudtype) if(istype(M, /mob/living/carbon/human)) diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm index 1d6d77c5abf..a53c543629f 100644 --- a/code/modules/mob/living/carbon/human/examine_vr.dm +++ b/code/modules/mob/living/carbon/human/examine_vr.dm @@ -1,4 +1,6 @@ /mob/living/carbon/human/proc/examine_weight() + if(!show_pudge()) //Some clothing or equipment can hide this. + return "" var/message = "" var/weight_examine = round(weight) var/t_He = "It" //capitalised for use at the start of each line. @@ -58,6 +60,8 @@ return message //Credit to Aronai for helping me actually get this working! /mob/living/carbon/human/proc/examine_nutrition() + if(!show_pudge()) //Some clothing or equipment can hide this. + return "" var/message = "" var/nutrition_examine = round(nutrition) var/t_He = "It" //capitalised for use at the start of each line. @@ -104,6 +108,9 @@ return message /mob/living/carbon/human/proc/examine_bellies() + if(!show_pudge()) //Some clothing or equipment can hide this. + return "" + var/message = "" for (var/I in src.vore_organs) @@ -114,15 +121,23 @@ //For OmniHUD records access for appropriate models /proc/hasHUD_vr(mob/living/carbon/human/H, hudtype) - if(!(istype(H.glasses, /obj/item/clothing/glasses/omnihud))) - return 0 //Not wearing omnis, don't care. + if(H.nif) + switch(hudtype) + if("security") + if(H.nif.flag_check(NIF_V_AR_SECURITY,NIF_FLAGS_VISION)) + return TRUE + if("medical") + if(H.nif.flag_check(NIF_V_AR_MEDICAL,NIF_FLAGS_VISION)) + return TRUE - var/obj/item/clothing/glasses/omnihud/omni = H.glasses + if(istype(H.glasses, /obj/item/clothing/glasses/omnihud)) + var/obj/item/clothing/glasses/omnihud/omni = H.glasses + switch(hudtype) + if("security") + if(omni.mode == "sec" || omni.mode == "best") + return TRUE + if("medical") + if(omni.mode == "med" || omni.mode == "best") + return TRUE - switch(hudtype) - if("security") - return omni.mode == "sec" || omni.mode == "best" - if("medical") - return omni.mode == "med" || omni.mode == "best" - else - return 0 \ No newline at end of file + return FALSE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index e6865ef51e7..97cb21608fa 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -267,7 +267,7 @@ var/obj/item/device/pda/pda = wear_id if (istype(pda)) if (pda.id) - return pda.id.rank + return pda.id.rank ? pda.id.rank : if_no_job else return pda.ownrank else @@ -311,6 +311,8 @@ //repurposed proc. Now it combines get_id_name() and get_face_name() to determine a mob's name variable. Made into a seperate proc as it'll be useful elsewhere /mob/living/carbon/human/proc/get_visible_name() + if( mind && mind.changeling && mind.changeling.cloaked) + return "Unknown" if( wear_mask && (wear_mask.flags_inv&HIDEFACE) ) //Wearing a mask which hides our face, use id-name if possible return get_id_name("Unknown") if( head && (head.flags_inv&HIDEFACE) ) @@ -1037,7 +1039,8 @@ gunshot_residue = null if(clean_feet && !shoes && istype(feet_blood_DNA, /list) && feet_blood_DNA.len) feet_blood_color = null - qdel(feet_blood_DNA) + feet_blood_DNA.Cut() + feet_blood_DNA = null update_inv_shoes(1) return 1 diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 3af1a52bf6c..b321d288fb0 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -1,5 +1,6 @@ /mob/living/carbon/human/proc/get_unarmed_attack(var/mob/living/carbon/human/target, var/hit_zone) // VOREStation Edit - Begin + if(nif && nif.flag_check(NIF_C_HARDCLAWS,NIF_FLAGS_COMBAT)){return unarmed_hardclaws} if(src.default_attack && src.default_attack.is_usable(src, target, hit_zone)) if(pulling_punches) var/datum/unarmed_attack/soft_type = src.default_attack.get_sparring_variant() diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 30ee7c64d6e..d1f468500bb 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -104,6 +104,7 @@ amount *= M.incoming_damage_percent if(!isnull(M.incoming_brute_damage_percent)) amount *= M.incoming_brute_damage_percent + if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage take_overall_damage(amount, 0) else for(var/datum/modifier/M in modifiers) @@ -120,6 +121,7 @@ amount *= M.incoming_damage_percent if(!isnull(M.incoming_fire_damage_percent)) amount *= M.incoming_fire_damage_percent + if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage take_overall_damage(0, amount) else for(var/datum/modifier/M in modifiers) @@ -139,6 +141,7 @@ amount *= M.incoming_damage_percent if(!isnull(M.incoming_brute_damage_percent)) amount *= M.incoming_brute_damage_percent + if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage O.take_damage(amount, 0, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) else for(var/datum/modifier/M in modifiers) @@ -160,6 +163,7 @@ amount *= M.incoming_damage_percent if(!isnull(M.incoming_fire_damage_percent)) amount *= M.incoming_fire_damage_percent + if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) else for(var/datum/modifier/M in modifiers) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 61b13316b84..8f7398e0a86 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -94,7 +94,7 @@ emp_act var/obj/item/organ/external/organ = organs_by_name[organ_name] if(organ) var/weight = organ_rel_size[organ_name] - armorval += getarmor_organ(organ, type) * weight + armorval += (getarmor_organ(organ, type) * weight) total += weight return (armorval/max(total, 1)) diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 4fa6ae11176..4331b05407e 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -32,7 +32,7 @@ if(force_process) bad_external_organs.Cut() for(var/obj/item/organ/external/Ex in organs) - bad_external_organs |= Ex + bad_external_organs += Ex //VOREStation Edit - Silly and slow to |= this //processing internal organs is pretty cheap, do that first. for(var/obj/item/organ/I in internal_organs) @@ -44,6 +44,7 @@ if(!force_process && !bad_external_organs.len) return + number_wounds = 0 //VOREStation Add - You have to reduce this at some point... for(var/obj/item/organ/external/E in bad_external_organs) if(!E) continue diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a0cfc6f0a8e..fd21301044e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -82,7 +82,7 @@ handle_medical_side_effects() handle_heartbeat() - + handle_nif() //VOREStation Add if(!client) species.handle_npc(src) @@ -666,7 +666,8 @@ pressure_alert = -1 else if( !(COLD_RESISTANCE in mutations)) - take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") + if(!isSynthetic() || !nif || !nif.flag_check(NIF_O_PRESSURESEAL,NIF_FLAGS_OTHER)) //VOREStation Edit - NIF pressure seals + take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") if(getOxyLoss() < 55) // 11 OxyLoss per 4 ticks when wearing internals; unconsciousness in 16 ticks, roughly half a minute adjustOxyLoss(4) // 16 OxyLoss per 4 ticks when no internals present; unconsciousness in 13 ticks, roughly twenty seconds pressure_alert = -2 @@ -703,7 +704,8 @@ // FBPs will overheat, prosthetic limbs are fine. if(robobody_count) - bodytemperature += round(robobody_count*1.75) + if(!nif || !nif.flag_check(NIF_O_HEATSINKS,NIF_FLAGS_OTHER)) //VOREStation Edit - NIF heatsinks + bodytemperature += round(robobody_count*1.75) var/body_temperature_difference = species.body_temperature - bodytemperature @@ -1267,7 +1269,7 @@ var/obj/item/clothing/glasses/G = glasses if(!G.prescription) set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) - else + else if (!nif || !nif.flag_check(NIF_V_CORRECTIVE,NIF_FLAGS_VISION)) //VOREStation Edit - NIF set_fullscreen(disabilities & NEARSIGHTED, "impaired", /obj/screen/fullscreen/impaired, 1) set_fullscreen(eye_blurry, "blurry", /obj/screen/fullscreen/blurry) @@ -1282,6 +1284,7 @@ var/obj/item/clothing/glasses/welding/O = glasses if(!O.up) found_welder = 1 + if(!found_welder && nif && nif.flag_check(NIF_V_UVFILTER,NIF_FLAGS_VISION)) found_welder = 1 //VOREStation Add - NIF if(!found_welder && istype(head, /obj/item/clothing/head/welding)) var/obj/item/clothing/head/welding/O = head if(!O.up) @@ -1336,10 +1339,10 @@ var/obj/item/clothing/glasses/omnihud/S = G O = S.hud //VOREStation Add End - if(istype(G, /obj/item/clothing/glasses/sunglasses/sechud)) + else if(istype(G, /obj/item/clothing/glasses/sunglasses/sechud)) //VOREStation Edit - Added else var/obj/item/clothing/glasses/sunglasses/sechud/S = G O = S.hud - if(istype(G, /obj/item/clothing/glasses/sunglasses/medhud)) + else if(istype(G, /obj/item/clothing/glasses/sunglasses/medhud)) //VOREStation Edit - Added else var/obj/item/clothing/glasses/sunglasses/medhud/M = G O = M.hud if(istype(O)) diff --git a/code/modules/mob/living/carbon/human/life_vr.dm b/code/modules/mob/living/carbon/human/life_vr.dm index 9e655d26728..d573e5568c4 100644 --- a/code/modules/mob/living/carbon/human/life_vr.dm +++ b/code/modules/mob/living/carbon/human/life_vr.dm @@ -31,7 +31,7 @@ if(istype(I,/obj/item/weapon/implant/backup)) if(!mind) holder.icon_state = "hud_backup_nomind" - else if(!(mind.name in transcore.body_scans)) + else if(!(mind.name in SStranscore.body_scans)) holder.icon_state = "hud_backup_nobody" else holder.icon_state = "hud_backup_norm" @@ -43,3 +43,10 @@ vantag.icon_state = vantag_pref else vantag.icon_state = "hudblank" + +//Our call for the NIF to do whatever +/mob/living/carbon/human/proc/handle_nif() + if(!nif) return + + //Process regular life stuff + nif.life() diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm new file mode 100644 index 00000000000..1906bd37228 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm @@ -0,0 +1,108 @@ +/datum/species + var/vore_numbing = 0 + +/datum/species/custom + name = "Custom Species" + name_plural = "Custom" + var/base_species = "Human" + + unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite) + + blurb = "This is a custom species where you can assign various species traits to them as you wish, to \ + create a (hopefully) balanced species. You will see the options to customize them on the VORE tab once \ + you select and set this species as your species. Please look at the VORE tab if you select this species." + + name_language = null // Use the first-name last-name generator rather than a language scrambler + min_age = 18 + max_age = 200 + health_hud_intensity = 2 + num_alternate_languages = 3 + + spawn_flags = SPECIES_CAN_JOIN + appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR + + var/list/traits = list() + +/datum/species/custom/get_bodytype() + return base_species + +/datum/species/custom/get_race_key() + var/datum/species/real = all_species[base_species] + return real.race_key + +/datum/species/custom/proc/produceCopy(var/datum/species/to_copy,var/list/traits,var/mob/living/carbon/human/H) + ASSERT(to_copy) + ASSERT(istype(H)) + + if(ispath(to_copy)) + to_copy = "[initial(to_copy.name)]" + if(istext(to_copy)) + to_copy = all_species[to_copy] + + var/datum/species/custom/new_copy = new() + + //Initials so it works with a simple path passed, or an instance + new_copy.base_species = to_copy.name + new_copy.icobase = to_copy.icobase + new_copy.deform = to_copy.deform + new_copy.tail = to_copy.tail + new_copy.tail_animation = to_copy.tail_animation + new_copy.icobase_tail = to_copy.icobase_tail + new_copy.color_mult = to_copy.color_mult + new_copy.primitive_form = to_copy.primitive_form + new_copy.appearance_flags = to_copy.appearance_flags + new_copy.flesh_color = to_copy.flesh_color + new_copy.base_color = to_copy.base_color + new_copy.blood_mask = to_copy.blood_mask + new_copy.damage_mask = to_copy.damage_mask + new_copy.damage_overlays = to_copy.damage_overlays + + new_copy.traits = traits + + //If you had traits, apply them + if(new_copy.traits) + for(var/trait in new_copy.traits) + var/datum/trait/T = all_traits[trait] + T.apply(new_copy,H) + + //Set up a mob + H.species = new_copy + H.icon_state = lowertext(new_copy.get_bodytype()) + + if(new_copy.holder_type) + H.holder_type = new_copy.holder_type + + if(H.dna) + H.dna.ready_dna(H) + + return new_copy + +// Stub species overrides for shoving trait abilities into + +//Called when face-down in the water or otherwise over their head. +// Return: TRUE for able to breathe fine in water. +/datum/species/custom/can_breathe_water() + return ..() + +//Called during handle_environment in Life() ticks. +// Return: Not used. +/datum/species/custom/handle_environment_special(var/mob/living/carbon/human/H) + return ..() + +//Called when spawning to equip them with special things. +/datum/species/custom/equip_survival_gear(var/mob/living/carbon/human/H) + /* Example, from Vox: + H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) + if(H.backbag == 1) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/vox(H), slot_r_hand) + H.internal = H.back + else + H.equip_to_slot_or_del(new /obj/item/weapon/tank/vox(H), slot_r_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/vox(H.back), slot_in_backpack) + H.internal = H.r_hand + H.internal = locate(/obj/item/weapon/tank) in H.contents + if(istype(H.internal,/obj/item/weapon/tank) && H.internals) + H.internals.icon_state = "internal1" + */ + return ..() diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index 8feb3e5b974..d65519f15f8 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -17,13 +17,13 @@ return if(C.stat == DEAD) //Uh oh, you died! - if(C.reagents.has_reagent("nutriment")) //Let's hope you have nutriment in you.... If not + if(C.hasnutriment()) //Let's hope you have nutriment in you.... If not var/time = (500+1/((nutrition_used/100+1)/1300)) C.weakened = 10000 //Since it takes 1 tick to lose one weaken. Due to prior rounding errors, you'd sometimes unweaken before regenning. This fixes that. C.reviving = 1 C.canmove = 0 //Make them unable to move. In case they somehow get up before the delay. C << "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds." - C.in_stasis = 1 + C.does_not_breathe = 1 //effectively makes them spaceworthy while regenning spawn(time SECONDS) if(C) //Runtime prevention. @@ -42,7 +42,7 @@ C.reviving = 1 C.canmove = 0 //Make them unable to move. In case they somehow get up before the delay. C << "You begin to reconstruct your form. You will not be able to move during this time. It should take aproximately [round(time)] seconds." - C.in_stasis = 1 + C.does_not_breathe = 1 //effectively makes them spaceworthy while regenning spawn(time SECONDS) if(C.stat != DEAD) //If they're still alive after regenning. @@ -50,11 +50,12 @@ C.verbs += /mob/living/carbon/human/proc/hatch return else if(C.stat == DEAD) - if(C.reagents.has_reagent("nutriment")) //Let's hope you have nutriment in you.... If not + if(C.hasnutriment()) //Let's hope you have nutriment in you.... If not C << "Consciousness begins to stir as your new body awakens, ready to hatch.." C.verbs += /mob/living/carbon/human/proc/hatch else //Dead until nutrition injected. C << "Your body was unable to regenerate, what few living cells remain require additional nutrients to complete the process." + C.reviving = 0 // so they can try again when they're given a kickstart return else return //Something went wrong @@ -63,6 +64,14 @@ +/mob/living/carbon/human/proc/hasnutriment() + if (src.bloodstr.has_reagent("nutriment", 30) || src.bloodstr.has_reagent("protein", 15)) //protein needs half as much. For reference, a steak contains 9u protein. + return 1 + else if (src.ingested.has_reagent("nutriment", 60) || src.ingested.has_reagent("protein", 30)) //try forcefeeding them, why not. Less effective. + return 1 + else return 0 + + /mob/living/carbon/human/proc/hatch() set name = "Hatch" set category = "Abilities" @@ -85,7 +94,7 @@ var/T = get_turf(src) new /obj/effect/gibspawner/human/scree(T) var/braindamage = C.brainloss/2 //If you have 100 brainloss, it gives you 50. - C.in_stasis = 0 + C.does_not_breathe = 0 //start breathing again C.revive() // I did have special snowflake code, but this is easier. C.weakened = 2 //Not going to let you get up immediately. 2 ticks before you get up. Overrides the above 10000 weaken. C.nutrition = old_nutrition @@ -119,7 +128,7 @@ C.drop_from_inventory(W) spawn(3600 SECONDS) //1 hour wait until you can revive again. C.reviving = 0 - C.in_stasis = 0 + C.does_not_breathe = 0 //start breathing again C.verbs -= /mob/living/carbon/human/proc/hatch return else diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm index 4301f45ccdf..d1ad3dce6fe 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm @@ -73,7 +73,7 @@ H.feral = min(150-H.nutrition, H.feral+1) //Feralness increases while this hungry, capped at 50-150 depending on hunger. // If they're hurt, chance of snapping. Not if they're straight-up KO'd though. - if (H.stat == CONSCIOUS && H.traumatic_shock >=36 && H.in_stasis == 0) //30 brute/burn, or 18 halloss. + if (H.stat == CONSCIOUS && H.traumatic_shock >=36) //30 brute/burn, or 18 halloss. if (2.5*H.halloss >= H.traumatic_shock) //If the majority of their shock is due to halloss, greater chance of snapping. if(prob(min(10,(0.2 * H.traumatic_shock)))) if(H.feral == 0) @@ -111,6 +111,8 @@ if(H.feral > 0) //do the following if feral, otherwise no effects. var/light_amount = H.getlightlevel() //how much light there is in the place + H.shock_stage = max(H.shock_stage-(H.feral/20), 0) //if they lose enough health to hit softcrit, handle_shock() will keep resetting this. Otherwise, pissed off critters will lose shock faster than they gain it. + for(var/mob/living/M in viewers(H)) if(M != H) // someone in view if(prob(0.5)) // 1 in 200 chance of doing something so as not to interrupt scenes @@ -160,28 +162,25 @@ var/pressure2 = environment.return_pressure() var/adjusted_pressure2 = H.calculate_affecting_pressure(pressure2) - if(adjusted_pressure2 <= 20 && H.in_stasis == 1) //If they're in a enviroment with no pressure and are in stasis (See: regenerating), don't kill them. + if(adjusted_pressure2 <= 20 && H.does_not_breathe) //If they're in a enviroment with no pressure and are not breathing (See: regenerating), don't kill them. //This is just to prevent them from taking damage if they're in stasis. else if(adjusted_pressure2 <= 20) //If they're in an enviroment with no pressure and are NOT in stasis, damage them. H.take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure") - if(H.bodytemperature <= 260 && H.in_stasis == 1) //If they're in stasis, don't give them them the negative cold effects + if(H.bodytemperature <= 260 && H.does_not_breathe) //If they're regenerating, don't give them them the negative cold effects //This is just here to prevent them from getting cold effects else if(H.bodytemperature <= 260) //If they're not in stasis and are cold. Don't really have to add in an exception to cryo cells, as the effects aren't anything /too/ horrible. - var/colddamage = 0 + var/coldshock = 0 if(H.bodytemperature <= 260 && H.bodytemperature >= 200) //Chilly. - colddamage = 4 //This will begin to knock them out until they run out of oxygen and suffocate or until someone finds them. + coldshock = 4 //This will begin to knock them out until they run out of oxygen and suffocate or until someone finds them. H.eye_blurry = 5 //Blurry vision in the cold. if(H.bodytemperature <= 199 && H.bodytemperature >= 100) //Extremely cold. Even in somewhere like the server room it takes a while for bodytemp to drop this low. - colddamage = 8 + coldshock = 8 H.eye_blurry = 5 if(H.bodytemperature <= 99) //Insanely cold. - colddamage = 20 + coldshock = 16 H.eye_blurry = 5 - if(H.paralysis) //stops weaken spam from being repeatedly taken over max halloss when already KO'd. - H.halloss = min(H.halloss+colddamage, H.species.total_health - 1) //if already stunned, only take them up to the point of restunning - else - H.halloss += colddamage //Harsh punishment for staying in space, and it'll take them a while to fully thaw out when they get retrieved. + H.shock_stage = min(H.shock_stage + coldshock, 160) //cold hurts and gives them pain messages, eventually weakening and paralysing, but doesn't damage or trigger feral. return diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm new file mode 100644 index 00000000000..ed66abb5aa1 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/negative.dm @@ -0,0 +1,75 @@ +/datum/trait/speed_slow + name = "Slowdown" + desc = "Allows you to move slower on average than baseline." + cost = -1 + var_changes = list("slowdown" = 0.5) + +/datum/trait/speed_slow_plus + name = "Slowdown (Plus)" + desc = "Allows you to move MUCH slower on average than baseline." + cost = -2 + var_changes = list("slowdown" = 1.0) + +/datum/trait/weakling + name = "Weakling" + desc = "Causes heavy equipment to slow you down more when carried." + cost = -1 + var_changes = list("item_slowdown_mod" = 1.5) + +/datum/trait/weakling_plus + name = "Weakling (Plus)" + desc = "Allows you to carry heavy equipment with much more slowdown." + cost = -2 + var_changes = list("item_slowdown_mod" = 2.0) + +/datum/trait/endurance_low + name = "Low Endurance" + desc = "Reduces your maximum total hitpoints." + cost = -2 + var_changes = list("total_health" = 75) + + apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.setMaxHealth(S.total_health) + +/datum/trait/brute_weak + name = "Brute Weakness" + desc = "Increases damage from brute damage sources." + cost = -1 + var_changes = list("brute_mod" = 1.15) + +/datum/trait/brute_weak_plus + name = "Brute Weakness (Plus)" + desc = "Increases damage significantly from brute damage sources." + cost = -2 + var_changes = list("brute_mod" = 1.30) + +/datum/trait/burn_weak + name = "Burn Weakness" + desc = "Increases damage from burn damage sources." + cost = -1 + var_changes = list("burn_mod" = 1.15) + +/datum/trait/burn_weak_plus + name = "Burn Weakness (Plus)" + desc = "Increases damage significantly from burn damage sources." + cost = -2 + var_changes = list("burn_mod" = 1.30) + +/datum/trait/conductive + name = "Conductive" + desc = "Increases your susceptibility to electric shocks by a small amount." + cost = -1 + var_changes = list("siemens_coefficient" = 1.15) + +/datum/trait/conductive_plus + name = "Conductive (Plus)" + desc = "Increases your susceptibility to electric shocks by a moderate amount." + cost = -2 + var_changes = list("siemens_coefficient" = 1.3) + +/datum/trait/photosensitive + name = "Photosensitive" + desc = "Increases stun duration from flashes and other light-based stuns." + cost = -1 + var_changes = list("flash_mod" = 2.0) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm new file mode 100644 index 00000000000..b27dbf9cbc9 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -0,0 +1,31 @@ +/datum/trait/metabolism_up + name = "Fast Metabolism" + desc = "You process ingested and injected reagents faster, but get hungry faster." + cost = 0 + var_changes = list("metabolic_rate" = 1.2) + +/datum/trait/metabolism_down + name = "Slow Metabolism" + desc = "You process ingested and injected reagents slower, but get hungry slower." + cost = 0 + var_changes = list("metabolic_rate" = 0.8) + +/datum/trait/vore_numbing + name = "Prey Numbing" + desc = "Adds a 'Digest (Numbing)' belly mode, to douse prey in numbing enzymes during digestion." + cost = 0 + var_changes = list("vore_numbing" = TRUE) + +/datum/trait/cold_discomfort + name = "Hot-Blooded" + desc = "You are too hot at the standard 20C. 18C is more suitable. Rolling down your jumpsuit or being unclothed helps." + cost = 0 + var_changes = list("heat_discomfort_level" = T0C+19) + excludes = list(/datum/trait/hot_discomfort) + +/datum/trait/hot_discomfort + name = "Cold-Blooded" + desc = "You are too cold at the standard 20C. 22C is more suitable. Wearing clothing that covers your legs and torso helps." + cost = 0 + var_changes = list("cold_discomfort_level" = T0C+21) + excludes = list(/datum/trait/cold_discomfort) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm new file mode 100644 index 00000000000..984f886acbe --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/positive.dm @@ -0,0 +1,93 @@ +/datum/trait/speed_fast + name = "Haste" + desc = "Allows you to move faster on average than baseline." + cost = 2 + var_changes = list("slowdown" = -0.5) + +/datum/trait/speed_fast_plus + name = "Haste (Plus)" + desc = "Allows you to move MUCH faster on average than baseline." + cost = 4 + var_changes = list("slowdown" = -1.0) + +/datum/trait/hardy + name = "Hardy" + desc = "Allows you to carry heavy equipment with less slowdown." + cost = 1 + var_changes = list("item_slowdown_mod" = 0.5) + +/datum/trait/hardy_plus + name = "Hardy (Plus)" + desc = "Allows you to carry heavy equipment with almost no slowdown." + cost = 2 + var_changes = list("item_slowdown_mod" = 0.1) + +/datum/trait/endurance_high + name = "High Endurance" + desc = "Increases your maximum total hitpoints." + cost = 2 + var_changes = list("total_health" = 125) + + apply(var/datum/species/S,var/mob/living/carbon/human/H) + ..(S,H) + H.setMaxHealth(S.total_health) + +/datum/trait/nonconductive + name = "Non-Conductive" + desc = "Decreases your susceptibility to electric shocks by a small amount." + cost = 1 + var_changes = list("siemens_coefficient" = 0.85) + +/datum/trait/nonconductive_plus + name = "Non-Conductive (Plus)" + desc = "Decreases your susceptibility to electric shocks by a moderate amount." + cost = 2 + var_changes = list("siemens_coefficient" = 0.7) + +/datum/trait/darksight + name = "Darksight" + desc = "Allows you to see a short distance in the dark." + cost = 1 + var_changes = list("darksight" = 3) + +/datum/trait/darksight_plus + name = "Darksight (Plus)" + desc = "Allows you to see in the dark for the whole screen." + cost = 2 + var_changes = list("darksight" = 7) + +/datum/trait/melee_attack + name = "Sharp Melee" + desc = "Provides sharp melee attacks that do slightly more damage." + cost = 1 + var_changes = list("unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp)) + +/datum/trait/brute_resist + name = "Brute Resist" + desc = "Adds some resistance to brute damage sources." + cost = 1 + var_changes = list("brute_mod" = 0.85) + +/datum/trait/brute_resist_plus + name = "Brute Resist (Plus)" + desc = "Adds some resistance to brute damage sources." + cost = 2 + var_changes = list("brute_mod" = 0.70) + +/datum/trait/burn_resist + name = "Burn Resist" + desc = "Adds some resistance to burn damage sources." + cost = 1 + var_changes = list("burn_mod" = 0.85) + +/datum/trait/burn_resist_plus + name = "Burn Resist (Plus)" + desc = "Adds some resistance to burn damage sources." + cost = 2 + var_changes = list("burn_mod" = 0.70) + +/datum/trait/photoresistant + name = "Photoresistant" + desc = "Decreases stun duration from flashes and other light-based stuns." + cost = 1 + var_changes = list("flash_mod" = 0.5) diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm new file mode 100644 index 00000000000..b225cc6e896 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/trait.dm @@ -0,0 +1,20 @@ +/datum/trait + var/name = "Prototype Trait" + var/desc = "Contact a developer if you see this trait." + + var/cost = 0 // 0 is neutral, negative cost means negative, positive cost means positive. + var/list/var_changes // A list to apply to the custom species vars. + var/list/excludes // Store a list of paths of traits to exclude, but done automatically if they change the same vars. + +//Proc can be overridden lower to include special changes, make sure to call up though for the vars changes +/datum/trait/proc/apply(var/datum/species/S,var/mob/living/carbon/human/H) + ASSERT(S) + if(var_changes) + for(var/V in var_changes) + S.vars[V] = var_changes[V] + return + +//Similar to the above, but for removing. Probably won't be called often/ever. +/datum/trait/proc/remove(var/datum/species/S) + ASSERT(S) + return diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 43ee8916462..877dff5ece4 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -448,7 +448,7 @@ var/global/list/damage_icon_parts = list() //For legacy support. /mob/living/carbon/human/regenerate_icons() ..() - if(transforming) return + if(transforming || QDELETED(src)) return update_mutations(0) update_body(0) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 459195f092f..554de787d79 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -387,6 +387,7 @@ default behaviour is: return result /mob/living/proc/setMaxHealth(var/newMaxHealth) + health = (health/maxHealth) * (newMaxHealth) //VOREStation Add - Adjust existing health maxHealth = newMaxHealth /mob/living/Stun(amount) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 4046c556129..16b613ed64e 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -304,7 +304,7 @@ proc/get_radio_key_from_channel(var/channel) // VOREStation Edit - Attempt Multi-Z Talking var/mob/above = src.shadow - while(!deleted(above)) + while(!QDELETED(above)) var/turf/ST = get_turf(above) if(ST) var/list/results = get_mobs_and_objs_in_view_fast(ST, world.view) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 765acb837a8..470b3cad640 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -215,20 +215,15 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c /mob/living/silicon/ai/Destroy() ai_list -= src - qdel(eyeobj) - eyeobj = null - - qdel(psupply) - psupply = null - - qdel(aiMulti) - aiMulti = null - - qdel(aiRadio) - aiRadio = null - - qdel(aiCamera) - aiCamera = null + qdel_null(announcement) + qdel_null(eyeobj) + qdel_null(psupply) + qdel_null(aiPDA) + qdel_null(aiCommunicator) + qdel_null(aiMulti) + qdel_null(aiRadio) + qdel_null(aiCamera) + hack = null return ..() diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index 671f61e29c2..3e1564b0cfc 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -16,14 +16,6 @@ matter = list(DEFAULT_WALL_MATERIAL = 500, "glass" = 200) var/mode = 1; - -/obj/item/device/robotanalyzer/do_surgery(mob/living/M, mob/living/user) - if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool - return ..() - do_scan(M, user) //default surgery behaviour is just to scan as usual - return 1 - - /obj/item/device/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob) do_scan(M, user) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index a11bcd1ea47..b35c3dedd79 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -225,7 +225,7 @@ user.visible_message("[user] begins to lick off \the [target.name].", "You begin to lick off \the [target.name]...") if(do_after (user, 50)) user << "You finish licking off \the [target.name]." - del(target) + qdel(target) var/mob/living/silicon/robot.R = user R.cell.charge = R.cell.charge + 50 else if(istype(target,/obj/item)) @@ -234,7 +234,7 @@ if(do_after (user, 50)) user.visible_message("[user] finishes eating \the [target.name].", "You finish eating \the [target.name].") user << "You finish off \the [target.name]." - del(target) + qdel(target) var/mob/living/silicon/robot.R = user R.cell.charge = R.cell.charge + 250 return @@ -246,13 +246,13 @@ var/mob/living/silicon/robot.R = user var/obj/item/weapon/cell.C = target R.cell.charge = R.cell.charge + (C.maxcharge / 3) - del(target) + qdel(target) return user.visible_message("[user] begins to lick \the [target.name] clean...", "You begin to lick \the [target.name] clean...") if(do_after (user, 50)) user << "You clean \the [target.name]." var/obj/effect/decal/cleanable/C = locate() in target - del(C) + qdel(C) target.clean_blood() else if(ishuman(target)) if(src.emagged) @@ -282,7 +282,7 @@ if(do_after (user, 50)) user << "You clean \the [target.name]." var/obj/effect/decal/cleanable/C = locate() in target - del(C) + qdel(C) target.clean_blood() return diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 7b34bd45ce2..4711b2dc07f 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -307,7 +307,7 @@ update_patient() return - if(prob(10)) + if(prob(20)) var/churnsound = pick( 'sound/vore/digest1.ogg', 'sound/vore/digest2.ogg', @@ -383,9 +383,11 @@ if (istype(T, /obj/item/device/pda)) var/obj/item/device/pda/PDA = T if (PDA.id) - PDA.id.loc = src + PDA.id.forceMove(src) PDA.id = null - T.Del() + + qdel(T) + //Special case for IDs to make them digested //else if (istype(T, /obj/item/weapon/card/id)) @@ -397,7 +399,7 @@ //Spill(T) //Needs the spill proc to be added qdel(T) src.update_patient() - src.hound.cell.charge += 10 + src.hound.cell.charge += 120 //10 charge? that was such a practically nonexistent number it hardly gave any purpose for this bit :v *cranks up* return /obj/item/device/dogborg/sleeper/process() @@ -431,7 +433,65 @@ name = "Brig-Belly" desc = "Equipment for a K9 unit. A mounted portable-brig that holds criminals." icon = 'icons/mob/dogborg_vr.dmi' - icon_state = "sleeper" + icon_state = "sleeperb" inject_amount = 10 min_health = -100 injection_chems = null //So they don't have all the same chems as the medihound! + +/obj/item/device/dogborg/sleeper/compactor //Janihound gut. + name = "garbage processor" + desc = "A mounted garbage compactor unit with fuel processor." + icon = 'icons/mob/dogborg_vr.dmi' + icon_state = "compactor" + inject_amount = 10 + min_health = -100 + injection_chems = null //So they don't have all the same chems as the medihound! + var/max_item_count = 32 + +/obj/item/device/dogborg/sleeper/compactor/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS + hound = loc + + if(!istype(target)) + return + if(!proximity) + return + if(target.anchored) + return + if(length(contents) > (max_item_count - 1)) + user << "Your [src.name] is full. Eject or process contents to continue." + return + + if(istype(target, /obj/item)) + var/obj/target_obj = target + if(target_obj.w_class > ITEMSIZE_LARGE) + user << "\The [target] is too large to fit into your [src.name]" + return + user.visible_message("[hound.name] is ingesting [target.name] into their [src.name].", "You start ingesting [target] into your [src.name]...") + if(do_after(user, 30, target) && length(contents) < max_item_count) + target.forceMove(src) + user.visible_message("[hound.name]'s garbage processor groans lightly as [target.name] slips inside.", "Your garbage compactor groans lightly as [target] slips inside.") + playsound(hound, 'sound/vore/gulp.ogg', 50, 1) + if(length(contents) > 11) //grow that tum after a certain junk amount + hound.sleeper_r = 1 + hound.updateicon() + return + + else if(ishuman(target)) + var/mob/living/carbon/human/trashman = target + if(patient) + user << "Your [src.name] is already occupied." + return + if(trashman.buckled) + user << "[trashman] is buckled and can not be put into your [src.name]." + return + user.visible_message("[hound.name] is ingesting [trashman] into their [src.name].", "You start ingesting [trashman] into your [src.name]...") + if(do_after(user, 30, trashman) && !patient && !trashman.buckled && length(contents) < max_item_count) + trashman.forceMove(src) + trashman.reset_view(src) + update_patient() + processing_objects.Add(src) + user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") + playsound(hound, 'sound/vore/gulp.ogg', 80, 1) + return + return +//Marking shit changed again because the random travis bug is having its shenanigans again \o/ \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index c7fb1d67284..7d5c270f9b8 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -184,7 +184,7 @@ wrapped.force = 0.0 wrapped.attack(M,user) M.attackby(wrapped, user) //attackby reportedly gets procced by being clicked on, at least according to Anewbe. - if(deleted(wrapped) || wrapped.loc != src.loc) + if(QDELETED(wrapped) || wrapped.loc != src.loc) wrapped = null return 1 return 0 diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index bf70516f1f3..50b20dc8904 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -334,7 +334,8 @@ var/global/list/robot_modules = list( "Antique" = "engineerrobot", "Landmate" = "landmate", "Landmate - Treaded" = "engiborg+tread", - "Drone" = "drone-engineer" + "Drone" = "drone-engineer", + "Treadwell" = "treadwell" ) /obj/item/weapon/robot_module/robot/engineering/construction @@ -352,6 +353,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/floor_painter(src) src.modules += new /obj/item/weapon/gripper/no_use/loader(src) + src.modules += new /obj/item/device/geiger(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal() var/datum/matter_synth/plasteel = new /datum/matter_synth/plasteel() @@ -396,6 +398,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/device/pipe_painter(src) src.modules += new /obj/item/device/floor_painter(src) src.emag = new /obj/item/weapon/melee/baton/robot/arm(src) + src.modules += new /obj/item/device/geiger(src) var/datum/matter_synth/metal = new /datum/matter_synth/metal(40000) var/datum/matter_synth/glass = new /datum/matter_synth/glass(40000) diff --git a/code/modules/mob/living/silicon/robot/robot_modules_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules_vr.dm index c4ac3139065..b45d1eb2612 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules_vr.dm @@ -2,6 +2,7 @@ robot_modules["Medihound"] = /obj/item/weapon/robot_module/medihound robot_modules["K9"] = /obj/item/weapon/robot_module/knine robot_modules["ERT"] = /obj/item/weapon/robot_module/ert + robot_modules["Janihound"] = /obj/item/weapon/robot_module/scrubpup return 1 @@ -71,7 +72,9 @@ src.modules += new /obj/item/device/dogborg/sleeper(src) //So they can nom people and heal them src.modules += new /obj/item/borg/sight/hud/med(src) //See who's hurt generally. src.modules += new /obj/item/weapon/extinguisher/mini(src) //So they can put burning patients out. + src.modules += new /obj/item/weapon/reagent_containers/borghypo(src)//So medi-hounds aren't nearly useless src.modules += new /obj/item/weapon/reagent_containers/syringe(src) //In case the chemist is nice! + src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)//For holding the chemicals when the chemist is nice R.icon = 'icons/mob/widerobot_vr.dmi' R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' //R.icon_state = "medihound" @@ -105,3 +108,28 @@ R.pixel_x = -16 R.old_x = -16 ..() + +/obj/item/weapon/robot_module/scrubpup + name = "Custodial Hound module" + sprites = list( + "Custodial Hound" = "scrubpup", + ) + channels = list("Service" = 1) + can_be_pushed = 0 + +/obj/item/weapon/robot_module/scrubpup/New(var/mob/living/silicon/robot/R) + src.modules += new /obj/item/device/lightreplacer(src) + src.modules += new /obj/item/weapon/dogborg/jaws/small(src) + src.modules += new /obj/item/device/dogborg/boop_module(src) + src.modules += new /obj/item/device/dogborg/tongue(src) + src.modules += new /obj/item/device/dogborg/sleeper/compactor(src) + R.icon = 'icons/mob/widerobot_vr.dmi' + R.hands.icon = 'icons/mob/screen1_robot_vr.dmi' + //R.icon_state = "scrubpup" + R.pixel_x = -16 + R.old_x = -16 + ..() + +/obj/item/weapon/robot_module/scrubpup/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) + var/obj/item/device/lightreplacer/LR = locate() in src.modules + LR.Charge(R, amount) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index f5e146392e0..2d1474d6cfd 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -30,3 +30,38 @@ overlays += "[module_sprites[icontype]]-sleeper_g" if(sleeper_r == 1) overlays += "[module_sprites[icontype]]-sleeper_r" + +/mob/living/silicon/robot/Move(a, b, flag) + + . = ..() + + if(module) + if(module.type == /obj/item/weapon/robot_module/scrubpup)//no water reserve mechanics yet. + var/turf/tile = loc + if(isturf(tile)) + tile.clean_blood() + if(istype(tile, /turf/simulated)) + var/turf/simulated/T = tile + T.dirt = 0 + for(var/A in tile) + if(istype(A,/obj/effect/rune) || istype(A,/obj/effect/decal/cleanable) || istype(A,/obj/effect/overlay)) + qdel(A) + 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) + cleaned_human << "[src] cleans your face!"//Again travis what the fuck? You and your random unrelated bugs. + return + return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 40b18525282..b74b7d6cf79 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -41,7 +41,7 @@ silicon_mob_list -= src for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) AH.unregister_alarm(src) - ..() + return ..() /mob/living/silicon/proc/init_id() if(idcard) diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider.dm b/code/modules/mob/living/simple_animal/animals/giant_spider.dm index e2c833000ec..e0a8b130d62 100644 --- a/code/modules/mob/living/simple_animal/animals/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/animals/giant_spider.dm @@ -56,7 +56,7 @@ melee_damage_lower = 5 melee_damage_upper = 10 poison_per_bite = 7 - poison_type = "stoxin" + poison_type = "spidertoxin" // VOREStation edit, original is stoxin. (sleep toxins) var/fed = 0 var/atom/cocoon_target diff --git a/code/modules/mob/living/simple_animal/animals/mouse_vr.dm b/code/modules/mob/living/simple_animal/animals/mouse_vr.dm index 0cd0bd97c6c..396d43a68bb 100644 --- a/code/modules/mob/living/simple_animal/animals/mouse_vr.dm +++ b/code/modules/mob/living/simple_animal/animals/mouse_vr.dm @@ -1,2 +1,8 @@ +/mob/living/simple_animal/mouse + no_vore = 1 //Mice can't eat others due to the amount of bugs caused by it. + + + + /mob/living/simple_animal/mouse/attack_hand(mob/living/hander) - src.get_scooped(hander) //For one-click mouse scooping under any conditions. They knew what they were getting into! \ No newline at end of file + src.get_scooped(hander) //For one-click mouse scooping under any conditions. They knew what they were getting into! diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 3ad6260813a..0e121e1481d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -195,7 +195,7 @@ friends.Cut() //This one is not walk_list.Cut() languages.Cut() - ..() + return ..() //Client attached /mob/living/simple_animal/Login() diff --git a/code/modules/mob/living/simple_animal/simple_animal_vr.dm b/code/modules/mob/living/simple_animal/simple_animal_vr.dm index ab87fbe70a1..2096e4f5ccf 100644 --- a/code/modules/mob/living/simple_animal/simple_animal_vr.dm +++ b/code/modules/mob/living/simple_animal/simple_animal_vr.dm @@ -35,13 +35,14 @@ for(var/I in vore_organs) var/datum/belly/B = vore_organs[I] B.release_all_contents() // When your stomach is empty - ..() + prey_excludes.Cut() + . = ..() //For all those ID-having mobs /mob/living/simple_animal/GetIdCard() if(myid) return myid - + // Update fullness based on size & quantity of belly contents /mob/living/simple_animal/proc/update_fullness() var/new_fullness = 0 @@ -131,6 +132,8 @@ /mob/living/simple_animal/proc/init_belly() if(vore_organs.len) return + if(no_vore) //If it can't vore, let's not give it a stomach. + return var/datum/belly/B = new /datum/belly(src) B.immutable = 1 diff --git a/code/modules/mob/living/simple_animal/vore/otie.dm b/code/modules/mob/living/simple_animal/vore/otie.dm new file mode 100644 index 00000000000..5b9cfe9c8d8 --- /dev/null +++ b/code/modules/mob/living/simple_animal/vore/otie.dm @@ -0,0 +1,225 @@ +/mob/living/simple_animal/otie //Spawn this one only if you're looking for a bad time. + name = "otie" + desc = "The classic bioengineered longdog." + icon = 'icons/mob/vore64x32.dmi' + icon_state = "otie" + icon_living = "otie" + icon_dead = "otie-dead" + icon_rest = "otie_rest" + faction = "otie" + recruitable = 1 + maxHealth = 120 + health = 120 + minbodytemp = 200 + move_to_delay = 4 + hostile = 1 + cooperative = 1 + investigates = 1 + reacts = 1 + retaliate = 1 + specific_targets = 1 + run_at_them = 0 + attack_same = 0 + speak_chance = 4 + speak = list("Boof.","Waaf!","Prurrrr.","Growl!","Bork!","Rurrr..","Aruur!","Awoo!") + speak_emote = list("growls", "roars", "yaps", "Awoos") + emote_hear = list("rurrs", "rumbles", "rowls", "groans softly", "murrs", "sounds hungry", "yawns") + emote_see = list("stares ferociously", "snarls", "licks their chops", "stretches", "yawns") + say_maybe_target = list("Ruh?", "Waf?") + say_got_target = list("Rurrr!", "ROAR!", "MINE!", "RAHH!", "Slurp.. RAH!") + melee_damage_lower = 5 + melee_damage_upper = 20 + response_help = "pets the" + response_disarm = "bops the" + response_harm = "hits the" + attacktext = "mauled" + friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops") + meat_amount = 5 + old_x = -16 + old_y = 0 + pixel_x = -16 + pixel_y = 0 + + var/mob/living/carbon/human/friend + var/tamed = 0 + +/mob/living/simple_animal/otie/fluff + name = "otie" + desc = "The classic bioengineered longdog. This one might even tolerate you!" + icon_state = "otie" + icon_living = "otie" + icon_rest = "otie_rest" + faction = "neutral" + +/mob/living/simple_animal/otie/fluff/cotie + name = "tamed otie" + desc = "The classic bioengineered longdog. This one has a nice little collar on its neck. However a proper domesticated otie is an oxymoron and the collar is likely just a decoration." + icon_state = "cotie" + icon_living = "cotie" + icon_rest = "cotie_rest" + faction = "neutral" + +/mob/living/simple_animal/otie/fluff/security + name = "guard otie" + desc = "The V.A.R.M.A.corp bioengineering division flagship product on trained optimal snowflake guard dogs." + icon_state = "sotie" + icon_living = "sotie" + icon_rest = "sotie_rest" + icon_dead = "sotie-dead" + faction = "neutral" + tamed = 1 + maxHealth = 150 + health = 150 + loot_list = list(/obj/item/clothing/glasses/sunglasses/sechud,/obj/item/clothing/suit/armor/vest/alt) + + var/check_records = 1 // If true, arrests people without a record. + var/check_arrest = 1 // If true, arrests people who are set to arrest. + +/mob/living/simple_animal/otie/PunchTarget() + if(istype(target_mob,/mob/living/simple_animal/mouse)) + return EatTarget() + else ..() + +/mob/living/simple_animal/otie/Found(var/atom/found_atom) + if(!SA_attackable(found_atom)) + return null + if(istype(found_atom,/mob/living/simple_animal/mouse)) + return found_atom + if(will_eat(found_atom)) + if(found_atom in friends) + return null + else if(found_atom in faction_friends) + return null + else if (friend == found_atom) + return null + else if(tamed == 1 && ishuman(found_atom)) + return null + else if(tamed == 1 && isrobot(found_atom)) + return null + else + return found_atom + +/mob/living/simple_animal/otie/fluff/security/Found(var/atom/found_atom) + if(!SA_attackable(found_atom)) + return null + if(istype(found_atom,/mob/living/simple_animal/mouse)) + return found_atom + if(check_threat(found_atom) >= 4) + return found_atom + if(will_eat(found_atom)) + if(found_atom in friends) + return null + else if(found_atom in faction_friends) + return null + else if (friend == found_atom) + return null + else if(tamed == 1 && ishuman(found_atom)) + return null + else if(tamed == 1 && isrobot(found_atom)) + return null + else + return found_atom + +/mob/living/simple_animal/otie/fluff/security/proc/check_threat(var/mob/living/M) + if(!M || !ishuman(M) || M.stat == DEAD || src == M) + return 0 + return M.assess_perp(0, 0, 0, check_records, check_arrest) + +/mob/living/simple_animal/otie/fluff/security/set_target(var/mob/M) + ai_log("SetTarget([M])",2) + if(!M || (world.time - last_target_time < 5 SECONDS) && target_mob) + ai_log("SetTarget() can't set it again so soon",3) + return 0 + + var/turf/seen = get_turf(M) + + if(investigates && (annoyed < 10)) + try_say_list(say_maybe_target) + face_atom(seen) + annoyed += 14 + sleep(1 SECOND) //For realism + + if(M in ListTargets(view_range)) + try_say_list(say_got_target) + target_mob = M + last_target_time = world.time + return M + if(check_threat(M) >= 4) + broadcast_security_hud_message("[src] is attempting to 'detain' suspect [target_name(M)] in [get_area(src)].", src) + else if(investigates) + spawn(1) + WanderTowards(seen) + + return 0 + + +/mob/living/simple_animal/otie/fluff/security/proc/target_name(mob/living/T) + if(ishuman(T)) + var/mob/living/carbon/human/H = T + return H.get_id_name("unidentified person") + return "unidentified lifeform" + +//Basic friend AI + +/mob/living/simple_animal/otie/fluff/Life() + . = ..() + if(!. || ai_inactive || !friend) return + + var/friend_dist = get_dist(src,friend) + + if (friend_dist <= 4) + if(stance == STANCE_IDLE) + if(set_follow(friend)) + handle_stance(STANCE_FOLLOW) + if(resting) + lay_down() + + if (friend_dist <= 1) + if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit) + if (prob((friend.stat < DEAD)? 50 : 15)) + var/verb = pick("whines", "yelps", "whimpers") + audible_emote(pick("[verb] in distress.", "[verb] anxiously.")) + else + if (prob(5)) + visible_emote(pick("nuzzles [friend].", + "brushes against [friend].", + "rubs against [friend].", + "noses softly at [friend].", + "slobberlicks [friend].", + "murrs.")) + else if (friend.health <= 50) + if (prob(10)) + var/verb = pick("whines", "yelps", "whimpers") + audible_emote("[verb] anxiously.") + +/mob/living/simple_animal/otie/Life() + . = ..() + if(!. || ai_inactive) return + + if(prob(5)) + lay_down() + +//Pet 4 frond + +/mob/living/simple_animal/otie/attack_hand(mob/living/carbon/human/M as mob) + ..() + if(M.a_intent == I_HELP) + if (health > 0) + LoseTarget() + handle_stance(STANCE_IDLE) + if(prob(50)) //It's a fiddy-fiddy you may get a buddy pal or you may get mauled and ate. Win-win! + friend = M + if(tamed != 1) + tamed = 1 + sleep(1 SECOND) + return + ..() + +// Activate Noms! + +/mob/living/simple_animal/otie + vore_active = 1 + vore_capacity = 1 + vore_escape_chance = 8 + vore_pounce_chance = 16 + vore_icons = SA_ICON_LIVING diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm index 9408800ad07..9431501ff41 100644 --- a/code/modules/mob/living/voice/voice.dm +++ b/code/modules/mob/living/voice/voice.dm @@ -51,7 +51,7 @@ // Description: Removes reference to the communicator, so it can qdel() successfully. /mob/living/voice/Destroy() comm = null - ..() + return ..() // Proc: ghostize() // Parameters: None diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 1d8ddceeddc..b018fa61f2d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -14,6 +14,7 @@ spellremove(src) ghostize() ..() + return QDEL_HINT_HARDDEL_NOW /mob/proc/remove_screen_obj_references() hands = null @@ -673,6 +674,23 @@ if(processScheduler) processScheduler.statProcesses() + if(statpanel("MC")) + stat("CPU:","[world.cpu]") + stat("Instances:","[world.contents.len]") + stat(null) + if(Master) + Master.stat_entry() + else + stat("Master Controller:", "ERROR") + if(Failsafe) + Failsafe.stat_entry() + else + stat("Failsafe Controller:", "ERROR") + if(Master) + stat(null) + for(var/datum/controller/subsystem/SS in Master.subsystems) + SS.stat_entry() + if(listed_turf && client) if(!TurfAdjacent(listed_turf)) listed_turf = null diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 80f68b979d5..890ff2e8732 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -83,7 +83,9 @@ //This makes sure that the grab screen object is displayed in the correct hand. -/obj/item/weapon/grab/proc/synch() +/obj/item/weapon/grab/proc/synch() //why is this needed? + if(QDELETED(src)) + return if(affecting) if(assailant.r_hand == src) hud.screen_loc = ui_rhand @@ -91,7 +93,7 @@ hud.screen_loc = ui_lhand /obj/item/weapon/grab/process() - if(gcDestroyed) // GC is trying to delete us, we'll kill our processing so we can cleanly GC + if(QDELETED(src)) // GC is trying to delete us, we'll kill our processing so we can cleanly GC return PROCESS_KILL confirm() @@ -221,6 +223,8 @@ animate(affecting, pixel_x =-shift, pixel_y = 0, 5, 1, LINEAR_EASING) /obj/item/weapon/grab/proc/s_click(obj/screen/S) + if(QDELETED(src)) + return if(!affecting) return if(state == GRAB_UPGRADING) @@ -291,6 +295,8 @@ return 1 /obj/item/weapon/grab/attack(mob/M, mob/living/user) + if(QDELETED(src)) + return if(!affecting) return if(world.time < (last_action + 20)) @@ -336,7 +342,7 @@ /obj/item/weapon/grab/dropped() loc = null - if(!destroying) + if(!QDELETED(src)) qdel(src) /obj/item/weapon/grab/proc/reset_kill_state() @@ -387,9 +393,6 @@ /obj/item/weapon/grab/proc/size_difference(mob/A, mob/B) return mob_size_difference(A.mob_size, B.mob_size) -/obj/item/weapon/grab - var/destroying = 0 - /obj/item/weapon/grab/Destroy() animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1, LINEAR_EASING) affecting.layer = 4 @@ -402,5 +405,4 @@ assailant = null qdel(hud) hud = null - destroying = 1 // stops us calling qdel(src) on dropped() - ..() + return ..() diff --git a/code/modules/mob/modifiers.dm b/code/modules/mob/modifiers.dm index f67ffc374b6..0b39c9e2754 100644 --- a/code/modules/mob/modifiers.dm +++ b/code/modules/mob/modifiers.dm @@ -73,7 +73,7 @@ /mob/living/Destroy() remove_all_modifiers(TRUE) - ..() + return ..() // Called by Life(). /mob/living/proc/handle_modifiers() diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 782e03a06af..c4ad0699ef9 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -488,7 +488,7 @@ //new_character.dna.UpdateSE() // Do the initial caching of the player's body icons. - new_character.force_update_limbs() + //new_character.force_update_limbs() //VOREStation Removal - This is done in copy_to, don't waste time. new_character.update_eyes() new_character.regenerate_icons() diff --git a/code/modules/mob/new_player/new_player_vr.dm b/code/modules/mob/new_player/new_player_vr.dm index d2dbfadf523..f32834589a0 100644 --- a/code/modules/mob/new_player/new_player_vr.dm +++ b/code/modules/mob/new_player/new_player_vr.dm @@ -1,8 +1,46 @@ /mob/new_player/proc/spawn_checks_vr() - var/pass = 1 - if (config.allow_Metadata && client && client.prefs && (isnull(client.prefs.metadata) || length(client.prefs.metadata) < 5)) - src << "You must first set your OOC notes before spawning in!" - pass = 0 + var/pass = TRUE + + //No OOC notes + if (config.allow_Metadata && client && client.prefs && (isnull(client.prefs.metadata) || length(client.prefs.metadata) < 15)) + to_chat(src,"Please set informative OOC notes related to ERP preferences. Set them using the 'OOC Notes' button on the 'General' tab in character setup.") + pass = FALSE + + //Are they on the VERBOTEN LIST? + if (prevent_respawns.Find(client.prefs.real_name)) + to_chat(src,"You've already quit the round as this character. You can't go back now that you've free'd your job slot. Play another character, or wait for the next round.") + pass = FALSE + + //Custom species checks + if (client && client.prefs && client.prefs.species == "Custom Species") + + //Didn't name it + if(!client.prefs.custom_species) + pass = FALSE + to_chat(src,"You have to name your custom species. Do this on the VORE tab in character setup.") + + //Check traits/costs + var/list/megalist = client.prefs.pos_traits + client.prefs.neu_traits + client.prefs.neg_traits + var/points_left = client.prefs.starting_trait_points + var/traits_left = client.prefs.max_traits + for(var/T in megalist) + traits_left-- + var/cost = traits_costs[T] + + //A trait was removed from the game + if(isnull(cost)) + pass = FALSE + to_chat(src,"Your custom species is not playable. One or more traits appear to have been removed from the game or renamed. Enter character setup to correct this.") + break + else + points_left -= traits_costs[T] + + //Went into negatives + if(points_left < 0 || traits_left < 0) + pass = FALSE + to_chat(src,"Your custom species is not playable. Reconfigure your traits on the VORE tab.") + + //Final popup notice if (!pass) alert(src,"There were problems with spawning your character. Check your message log for details.","Error","OK") return pass diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 04e45f93d0b..470b4e1a008 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -627,7 +627,6 @@ /datum/sprite_accessory/facial_hair icon = 'icons/mob/Human_face.dmi' - gender = MALE shaved name = "Shaved" @@ -1309,4 +1308,4 @@ name = "Default skrell skin" icon_state = "default" icon = 'icons/mob/human_races/r_skrell.dmi' - species_allowed = list("Skrell") \ No newline at end of file + species_allowed = list("Skrell") diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 86a4b1dc21d..2cc7ff46ab4 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -75,6 +75,26 @@ icon_state = "soghun_horns" species_allowed = list("Unathi", "Xenochimera") + una_bighorns + name = "Unathi Big Horns" + icon_state = "unathi_bighorn" + species_allowed = list("Unathi", "Xenochimera") + + una_smallhorns + name = "Unathi Small Horns" + icon_state = "unathi_smallhorn" + species_allowed = list("Unathi", "Xenochimera") + + una_ramhorns + name = "Unathi Ram Horns" + icon_state = "unathi_ramhorn" + species_allowed = list("Unathi", "Xenochimera") + + una_sidefrills + name = "Unathi Side Frills" + icon_state = "unathi_sidefrills" + species_allowed = list("Unathi", "Xenochimera") + una_doublehorns name = "Double Unathi Horns" icon = 'icons/mob/human_face_vr.dmi' @@ -141,110 +161,134 @@ name = "Tajara Messy" icon_state = "hair_messy" species_allowed = list("Tajara", "Xenochimera") + +//Skrell 'hairstyles' - these were requested for a chimera and screw it, if one wants to eat seafood, go nuts + skr_tentacle_veryshort + name = "Skrell Very Short Tentacles" + icon_state = "skrell_hair_veryshort" + species_allowed = list("Tajara", "Xenochimera") + gender = MALE + + skr_tentacle_short + name = "Skrell Short Tentacles" + icon_state = "skrell_hair_short" + species_allowed = list("Tajara", "Xenochimera") + + skr_tentacle_average + name = "Skrell Average Tentacles" + icon_state = "skrell_hair_average" + species_allowed = list("Tajara", "Xenochimera") + + skr_tentacle_verylong + name = "Skrell Long Tentacles" + icon_state = "skrell_hair_verylong" + species_allowed = list("Tajara", "Xenochimera") + gender = FEMALE + // Vulpa stuffs vulp_hair_none name = "None" icon_state = "bald" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_kajam name = "Kajam" icon = 'icons/mob/human_face_vr.dmi' icon_state = "kajam" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_keid name = "Keid" icon = 'icons/mob/human_face_vr.dmi' icon_state = "keid" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_adhara name = "Adhara" icon = 'icons/mob/human_face_vr.dmi' icon_state = "adhara" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_kleeia name = "Kleeia" icon = 'icons/mob/human_face_vr.dmi' icon_state = "kleeia" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_mizar name = "Mizar" icon = 'icons/mob/human_face_vr.dmi' icon_state = "mizar" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_apollo name = "Apollo" icon = 'icons/mob/human_face_vr.dmi' icon_state = "apollo" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_belle name = "Belle" icon = 'icons/mob/human_face_vr.dmi' icon_state = "belle" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_bun name = "Bun" icon = 'icons/mob/human_face_vr.dmi' icon_state = "bun" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_jagged name = "Jagged" icon = 'icons/mob/human_face_vr.dmi' icon_state = "jagged" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_curl name = "Curl" icon = 'icons/mob/human_face_vr.dmi' icon_state = "curl" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_hawk name = "Hawk" icon = 'icons/mob/human_face_vr.dmi' icon_state = "hawk" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_anita name = "Anita" icon = 'icons/mob/human_face_vr.dmi' icon_state = "anita" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_short name = "Short" icon = 'icons/mob/human_face_vr.dmi' icon_state = "short" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER vulp_hair_spike name = "Spike" icon = 'icons/mob/human_face_vr.dmi' icon_state = "spike" - species_allowed = list("Vulpkanin") + species_allowed = list("Vulpkanin", "Xenochimera") gender = NEUTER /datum/sprite_accessory/facial_hair diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 7df92b802b0..c0e7c6b9ce4 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -12,6 +12,8 @@ return message = sanitize(message) + if(!message) + return set_typing_indicator(0) if(use_me) @@ -19,8 +21,6 @@ else usr.emote_vr(message) - - /mob/proc/custom_emote_vr(var/m_type=1,var/message = null) //This would normally go in emote.dm if(stat || !use_me && usr == src) src << "You are unable to emote." @@ -40,32 +40,23 @@ else return - if (message) - log_emote("[name]/[key] : [message]") + log_subtle("[name]/[key] : [message]") - for(var/mob/M in player_list) - if (!M.client) - continue //skip monkeys and leavers - if (istype(M, /mob/new_player)) - continue - if(findtext(message," snores.")) //Because we have so many sleeping people. - break - if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_sight) && !(M in viewers(src,null))) - M.show_message(message, m_type) - var/list/subtle = get_mobs_or_objects_in_view(1,src) - for(var/I in subtle) - if(isobj(I)) - spawn(0) - if(I) //It's possible that it could be deleted in the meantime. - var/obj/O = I - O.see_emote(src, message, 2) - else if(ismob(I)) - var/mob/M = I + var/list/vis = get_mobs_and_objs_in_view_fast(get_turf(src),1,2) //Turf, Range, and type 2 is emote + var/list/vis_mobs = vis["mobs"] + var/list/vis_objs = vis["objs"] + + for(var/vismob in vis_mobs) + var/mob/M = vismob + spawn(0) M.show_message(message, 2) - + for(var/visobj in vis_objs) + var/obj/O = visobj + spawn(0) + O.see_emote(src, message, 2) /mob/proc/emote_vr(var/act, var/type, var/message) //This would normally go in say.dm if(act == "me") - return custom_emote_vr(type, message) \ No newline at end of file + return custom_emote_vr(type, message) diff --git a/code/modules/multiz/ladder_assembly_vr.dm b/code/modules/multiz/ladder_assembly_vr.dm index c7343abe0aa..9347dc8ffc1 100644 --- a/code/modules/multiz/ladder_assembly_vr.dm +++ b/code/modules/multiz/ladder_assembly_vr.dm @@ -53,7 +53,7 @@ "You start to weld \the [src] to the floor.", \ "You hear welding") if(do_after(user, 2 SECONDS)) - if(deleted(src) || !WT.isOn()) return + if(QDELETED(src) || !WT.isOn()) return state = CONSTRUCTION_WELDED to_chat(user, "You weld \the [src] to the floor.") try_construct(user) @@ -66,7 +66,7 @@ "You start to cut \the [src] free from the floor.", \ "You hear welding") if(do_after(user, 2 SECONDS)) - if(deleted(src) || !WT.isOn()) return + if(QDELETED(src) || !WT.isOn()) return state = CONSTRUCTION_WRENCHED to_chat(user, "You cut \the [src] free from the floor.") else diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index eecc8448f80..4604db82ec2 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -164,6 +164,14 @@ /obj/effect/decal/cleanable/can_fall() return TRUE +// These didn't fall anyways but better to nip this now just incase. +/atom/movable/lighting_overlay/can_fall() + return FALSE + +// Mechas are anchored, so we need to override. +/obj/mecha/can_fall() + return TRUE + /obj/item/pipe/can_fall() . = ..() @@ -291,3 +299,33 @@ apply_damage(rand(0, damage), BRUTE, BP_R_ARM) Weaken(4) updatehealth() + +/obj/mecha/handle_fall(var/turf/landing) + // First things first, break any lattice + var/obj/structure/lattice/lattice = locate(/obj/structure/lattice, loc) + if(lattice) + // Lattices seem a bit too flimsy to hold up a massive exosuit. + lattice.visible_message("\The [lattice] collapses under the weight of \the [src]!") + qdel(lattice) + + // Then call parent to have us actually fall + return ..() + +/obj/mecha/fall_impact(var/atom/hit_atom) + // Tell the pilot that they just dropped down with a superheavy mecha. + if(occupant) + to_chat(occupant, "\The [src] crashed down onto \the [hit_atom]!") + + // Anything on the same tile as the landing tile is gonna have a bad day. + for(var/mob/living/L in hit_atom.contents) + L.visible_message("\The [src] crushes \the [L] as it lands on them!") + L.adjustBruteLoss(rand(70, 100)) + L.Weaken(8) + + // Now to hurt the mech. + take_damage(rand(15, 30)) + + // And hurt the floor. + if(istype(hit_atom, /turf/simulated/floor)) + var/turf/simulated/floor/ground = hit_atom + ground.break_tile() diff --git a/code/modules/multiz/open_space_controller.dm b/code/modules/multiz/open_space_controller.dm index 4921c9ec5a0..fc6c7e54841 100644 --- a/code/modules/multiz/open_space_controller.dm +++ b/code/modules/multiz/open_space_controller.dm @@ -36,7 +36,7 @@ for(last_object in turfs_to_process_old) var/turf/T = last_object - if(T && !T.gcDestroyed) + if(!QDELETED(T)) update_turf(T) SCHECK diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index 7c1fee0525e..f36258b4920 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -91,7 +91,7 @@ obj/machinery/atmospherics/pipe/zpipe/Destroy() node1.disconnect(src) if(node2) node2.disconnect(src) - ..() + . = ..() obj/machinery/atmospherics/pipe/zpipe/pipeline_expansion() return list(node1, node2) diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm index 0b637d90bf5..08856680371 100644 --- a/code/modules/multiz/turf.dm +++ b/code/modules/multiz/turf.dm @@ -72,7 +72,7 @@ * Update icon and overlays of open space to be that of the turf below, plus any visible objects on that turf. */ /turf/simulated/open/update_icon() - overlays.Cut() + overlays = list() //VOREStation Edit - Overlays are being crashy when modified. update_icon_edge() //VOREStation Add - Get grass into open spaces and whatnot. var/turf/below = GetBelow(src) if(below) @@ -94,7 +94,7 @@ // VOREStation Edit End // get objects (not mobs, they are handled by /obj/zshadow) - var/image/o_img = list() + var/list/o_img = list() for(var/obj/O in below) if(O.invisibility) continue // Ignore objects that have any form of invisibility if(O.loc != below) continue // Ignore multi-turf objects not directly below @@ -104,7 +104,13 @@ temp2.overlays += O.overlays // TODO Is pixelx/y needed? o_img += temp2 + var/overlays_pre = overlays.len overlays += o_img + var/overlays_post = overlays.len + if(overlays_post != (overlays_pre + o_img.len)) //Here we go! + world.log << "Corrupted openspace turf at [x],[y],[z] being replaced. Pre: [overlays_pre], Post: [overlays_post]" + new /turf/simulated/open(src) + return //Let's get out of here. if(!below_is_open) overlays += over_OS_darkness diff --git a/code/modules/nano/interaction/inventory_vr.dm b/code/modules/nano/interaction/inventory_vr.dm index 373e9f382b9..21ee1ca590f 100644 --- a/code/modules/nano/interaction/inventory_vr.dm +++ b/code/modules/nano/interaction/inventory_vr.dm @@ -1,7 +1,7 @@ /* This state checks that the src_object is on the user's glasses slot. */ -/var/global/datum/topic_state/inventory_state/glasses_state = new() +/var/global/datum/topic_state/glasses_state/glasses_state = new() /datum/topic_state/glasses_state/can_use_topic(var/src_object, var/mob/user) if(ishuman(user)) @@ -10,3 +10,23 @@ return user.shared_nano_interaction() return STATUS_CLOSE + +/var/global/datum/topic_state/nif_state/nif_state = new() + +/datum/topic_state/nif_state/can_use_topic(var/src_object, var/mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.nif && H.nif.stat == NIF_WORKING && src_object == H.nif) + return user.shared_nano_interaction() + + return STATUS_CLOSE + +/var/global/datum/topic_state/commlink_state/commlink_state = new() + +/datum/topic_state/commlink_state/can_use_topic(var/src_object, var/mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.nif && H.nif.stat == NIF_WORKING && H.nif.comm == src_object) + return user.shared_nano_interaction() + + return STATUS_CLOSE diff --git a/code/modules/nifsoft/nif.dm b/code/modules/nifsoft/nif.dm new file mode 100644 index 00000000000..f791c778b6c --- /dev/null +++ b/code/modules/nifsoft/nif.dm @@ -0,0 +1,574 @@ +/* ////////////////////////////// +The NIF has a proc API shared with NIFSofts, and you should not really ever +directly interact with this API. Procs like install(), uninstall(), etc should +not be directly called. If you want to install a new NIFSoft, pass the NIF in +the constructor for a new instance of the NIFSoft. If you want to force a NIFSoft +to be uninstalled, use imp_check to get a reference to it, and call +uninstall() only on the return value of that. + +You can also set the stat of a NIF to NIF_TEMPFAIL without any issues to disable it. +*/ ////////////////////////////// + +//Holder on humans to prevent having to 'find' it every time +/mob/living/carbon/human/var/obj/item/device/nif/nif + +//Nanotech Implant Foundation +/obj/item/device/nif + name = "nanite implant framework" + desc = "A somewhat diminished knockoff of a Kitsuhana nano working surface, in a box. Can print new \ + implants inside living hosts on the fly based on software uploads. Must be surgically \ + implanted in the head to work. May eventually wear out and break." + + icon = 'icons/obj/device_alt.dmi' + icon_state = "nif_0" + + w_class = ITEMSIZE_TINY + + var/durability = 100 // Durability remaining + var/bioadap = FALSE // If it'll work in fancy species + + var/tmp/power_usage = 0 // Nifsoft adds to this + var/tmp/mob/living/carbon/human/human // Our owner! + var/tmp/list/nifsofts[TOTAL_NIF_SOFTWARE] // All our nifsofts + var/tmp/list/nifsofts_life = list() // Ones that want to be talked to on life() + var/owner // Owner character name + + var/tmp/vision_flags = 0 // Flags implants set for faster lookups + var/tmp/health_flags = 0 + var/tmp/combat_flags = 0 + var/tmp/other_flags = 0 + + var/tmp/stat = NIF_PREINSTALL // Status of the NIF + var/tmp/install_done // Time when install will finish + var/tmp/open = FALSE // If it's open for maintenance (1-3) + + var/obj/item/clothing/glasses/hud/nif_hud/nif_hud // The AR ones require this + var/obj/item/device/communicator/commlink/comm // The commlink requires this + + var/global/icon/big_icon + var/global/click_sound = 'sound/items/nif_click.ogg' + var/global/bad_sound = 'sound/items/nif_tone_bad.ogg' + var/global/good_sound = 'sound/items/nif_tone_good.ogg' + var/global/list/look_messages = list( + "flicks their eyes around", + "looks at something unseen", + "reads some invisible text", + "seems to be daydreaming", + "focuses elsewhere for a moment") + + var/list/save_data + +//Constructor comes with a free AR HUD +/obj/item/device/nif/New(var/newloc,var/wear,var/list/load_data) + ..(newloc) + + //First one to spawn in the game, make a big icon + if(!big_icon) + big_icon = new(icon,icon_state = "nif_full") + + //Required for AR stuff. + nif_hud = new(src) + + //Put loaded data here if we loaded any + save_data = islist(load_data) ? load_data.Copy() : list() + + //If given a human on spawn (probably from persistence) + if(ishuman(newloc)) + var/mob/living/carbon/human/H = newloc + if(!quick_implant(H)) + WARNING("NIF spawned in [H] failed to implant") + spawn(0) + qdel(src) + return FALSE + else + //Free commlink for return customers + new /datum/nifsoft/commlink(src) + + //Free civilian AR included + new /datum/nifsoft/ar_civ(src) + + //If given wear (like when spawned) then done + if(wear) + durability = wear + wear(0) //Just make it update. + + //Draw me yo. + update_icon() + +//Destructor cleans up references +/obj/item/device/nif/Destroy() + if(human) + human.nif = null + human = null + qdel_null_list(nifsofts) + qdel_null(nif_hud) + qdel_null(comm) + nifsofts_life.Cut() + return ..() + +//Being implanted in some mob +/obj/item/device/nif/proc/implant(var/mob/living/carbon/human/H) + if(istype(H) && !H.nif && H.species && (loc == H.get_organ(BP_HEAD))) + if(!bioadap && (H.species.flags & NO_SCAN)) //NO_SCAN is the default 'too complicated' flag + return FALSE + + human = H + human.nif = src + stat = NIF_INSTALLING + return TRUE + + return FALSE + +//For debug or antag purposes +/obj/item/device/nif/proc/quick_implant(var/mob/living/carbon/human/H) + if(istype(H)) + var/obj/item/organ/external/head = H.get_organ(BP_HEAD) + if(!head) + return FALSE + src.forceMove(head) + head.implants += src + spawn(0) //Let the character finish spawning yo. + if(H.mind) + owner = H.mind.name + implant(H) + return TRUE + + return FALSE + +//Being removed from some mob +/obj/item/device/nif/proc/unimplant(var/mob/living/carbon/human/H) + human = null + stat = NIF_PREINSTALL + install_done = null + if(istype(H)) + H.nif = null + update_icon() + +//EMP adds wear and disables all nifsoft +/obj/item/device/nif/emp_act(var/severity) + notify("Danger! Significant electromagnetic interference!",TRUE) + for(var/nifsoft in nifsofts) + if(nifsoft) + var/datum/nifsoft/NS = nifsoft + NS.deactivate() + + switch (severity) + if (1) + wear(rand(30,40)) + if (2) + wear(rand(15,25)) + if (3) + wear(rand(8,15)) + if (4) + wear(rand(1,8)) + +//Wear update/check proc +/obj/item/device/nif/proc/wear(var/wear = 0) + wear *= (rand(85,115) / 100) //Apparently rand() only takes integers. + durability -= wear + + if(durability <= 0) + notify("Danger! General system insta#^!($",TRUE) + to_chat(human,"Your NIF vision overlays disappear and your head suddenly seems very quiet...") + stat = NIF_TEMPFAIL + update_icon() + +//Attackby proc, for maintenance +/obj/item/device/nif/attackby(obj/item/weapon/W, mob/user as mob) + if(open == 0 && istype(W,/obj/item/weapon/screwdriver)) + if(do_after(user, 4 SECONDS, src) && open == 0) + user.visible_message("[user] unscrews and pries open \the [src].","You unscrew and pry open \the [src].") + playsound(user, 'sound/items/Screwdriver.ogg', 50, 1) + open = 1 + update_icon() + else if(open == 1 && istype(W,/obj/item/stack/cable_coil)) + var/obj/item/stack/cable_coil/C = W + if(C.get_amount() < 3) + to_chat(user,"You need at least three coils of wire to add them to \the [src].") + return + if(do_after(user, 6 SECONDS, src) && open == 1 && C.use(3)) + user.visible_message("[user] replaces some wiring in \the [src].","You replace any burned out wiring in \the [src].") + playsound(user, 'sound/items/Deconstruct.ogg', 50, 1) + open = 2 + update_icon() + else if(open == 2 && istype(W,/obj/item/device/multitool)) + if(do_after(user, 8 SECONDS, src) && open == 2) + user.visible_message("[user] resets several circuits in \the [src].","You find and repair any faulty circuits in \the [src].") + open = 3 + update_icon() + else if(open == 3 && istype(W,/obj/item/weapon/screwdriver)) + if(do_after(user, 3 SECONDS, src) && open == 3) + user.visible_message("[user] closes up \the [src].","You re-seal \the [src] for use once more.") + playsound(user, 'sound/items/Screwdriver.ogg', 50, 1) + open = FALSE + durability = initial(durability) + stat = NIF_PREINSTALL + update_icon() + +//Icon updating +/obj/item/device/nif/update_icon() + if(open) + icon_state = "nif_open[open]" + else + switch(stat) + if(NIF_PREINSTALL) + icon_state = "nif_1" + if(NIF_INSTALLING) + icon_state = "nif_0" + if(NIF_WORKING) + icon_state = "nif_0" + if(NIF_TEMPFAIL) + icon_state = "nif_2" + else + icon_state = "nif_2" + +//The (dramatic) install process +/obj/item/device/nif/proc/handle_install() + if(human.stat || !human.mind) //No stuff while KO or not sleeved + return FALSE + + //Firsties + if(!install_done) + if(human.mind.name == owner) + install_done = world.time + 1 MINUTE + notify("Welcome back, [owner]! Performing quick-calibration...") + else if(!owner) + install_done = world.time + 30 MINUTES + notify("Adapting to new user...") + sleep(5 SECONDS) + notify("Adjoining optic [human.isSynthetic() ? "interface" : "nerve"], please be patient.",TRUE) + else + notify("You are not an authorized user for this device. Please contact [owner].",TRUE) + unimplant() + stat = NIF_TEMPFAIL + return FALSE + + var/percent_done = (world.time - (install_done - (30 MINUTES))) / (30 MINUTES) + + if(human.client) + human.client.screen.Add(global_hud.whitense) //This is the camera static + + switch(percent_done) //This is 0.0 to 1.0 kinda percent. + //Connecting to optical nerves + if(0.0 to 0.1) + human.eye_blind = 5 + + //Mapping brain + if(0.2 to 0.9) + if(prob(98)) return TRUE + var/incident = rand(1,3) + switch(incident) + if(1) + var/message = pick(list( + "Your head throbs around your new implant!", + "The skin around your recent surgery itches!", + "A wave of nausea overtakes you as the world seems to spin!", + "The floor suddenly seems to come up at you!", + "There's a throbbing lump of ice behind your eyes!", + "A wave of pain shoots down your neck!" + )) + human.adjustHalLoss(35) + human.custom_pain(message,35) + if(2) + human.Weaken(5) + to_chat(human,"A wave of weakness rolls over you.") + if(3) + human.Sleeping(5) + to_chat(human,"You suddenly black out!") + + //Finishing up + if(1.0 to INFINITY) + stat = NIF_WORKING + owner = human.mind.name + name = initial(name) + " ([owner])" + notify("Calibration complete! User data stored!") + +//Called each life() tick on the mob +/obj/item/device/nif/proc/life() + if(!human || loc != human.get_organ(BP_HEAD)) + unimplant(human) + return FALSE + + switch(stat) + if(NIF_WORKING) + //Perform our passive drain + if(!use_charge(power_usage)) + stat = NIF_POWFAIL + notify("Insufficient energy!",TRUE) + return FALSE + + //HUD update! + nif_hud.process_hud(human,1) + + //Process all the ones that want that + for(var/S in nifsofts_life) + var/datum/nifsoft/nifsoft = S + nifsoft.life(human) + + if(NIF_POWFAIL) + if(human && human.nutrition < 100) + return FALSE + else + stat = NIF_WORKING + notify("System Reboot Complete.") + + if(NIF_TEMPFAIL) + //Something else has to take us out of tempfail + return FALSE + + if(NIF_INSTALLING) + handle_install() + return FALSE + +//Prints 'AR' messages to the user +/obj/item/device/nif/proc/notify(var/message,var/alert = 0) + if(!human || stat == NIF_TEMPFAIL) return + + to_chat(human,"\[\icon[src.big_icon]NIF\] displays, \"[message]\"") + if(prob(1)) human.visible_message("\The [human] [pick(look_messages)].") + if(alert) + human << bad_sound + else + human << good_sound + +//Called to spend nutrition, returns 1 if it was able to +/obj/item/device/nif/proc/use_charge(var/use_charge) + if(stat != NIF_WORKING) return FALSE + + //You don't want us to take any? Well okay. + if(!use_charge) + return TRUE + + //Not enough nutrition/charge left. + if(!human || human.nutrition < use_charge) + return FALSE + + //Was enough, reduce and return. + human.nutrition -= use_charge + return TRUE + +//Install a piece of software +/obj/item/device/nif/proc/install(var/datum/nifsoft/new_soft) + if(stat == NIF_TEMPFAIL) return FALSE + + if(nifsofts[new_soft.list_pos]) + return FALSE + + if(human) + var/applies_to = new_soft.applies_to + var/synth = human.isSynthetic() + if(synth && !(applies_to & NIF_SYNTHETIC)) + notify("The software \"[new_soft]\" is not supported on your chassis type.",TRUE) + return FALSE + if(!synth && !(applies_to & NIF_ORGANIC)) + notify("The software \"[new_soft]\" is not supported in organic life.",TRUE) + return FALSE + + wear(new_soft.wear) + nifsofts[new_soft.list_pos] = new_soft + power_usage += new_soft.p_drain + + if(new_soft.tick_flags == NIF_ALWAYSTICK) + nifsofts_life += new_soft + + if(new_soft.vision_flags) + vision_flags |= new_soft.vision_flags + if(new_soft.health_flags) + health_flags |= new_soft.health_flags + if(new_soft.combat_flags) + combat_flags |= new_soft.combat_flags + if(new_soft.other_flags) + other_flags |= new_soft.other_flags + + return TRUE + +//Uninstall a piece of software +/obj/item/device/nif/proc/uninstall(var/datum/nifsoft/old_soft) + var/datum/nifsoft/NS = nifsofts[old_soft.list_pos] + if(!NS || NS != old_soft) + return FALSE //what?? + + nifsofts[old_soft.list_pos] = null + power_usage -= old_soft.p_drain + + if(old_soft.tick_flags == NIF_ALWAYSTICK) + nifsofts_life -= old_soft + + if(old_soft.active) + power_usage -= old_soft.a_drain + if(old_soft.tick_flags == NIF_ACTIVETICK) + nifsofts_life -= old_soft + + if(old_soft.vision_flags) + vision_flags &= ~old_soft.vision_flags + if(old_soft.health_flags) + health_flags &= ~old_soft.health_flags + if(old_soft.combat_flags) + combat_flags &= ~old_soft.combat_flags + if(old_soft.other_flags) + other_flags &= ~old_soft.other_flags + + return TRUE + +//Activate a nifsoft +/obj/item/device/nif/proc/activate(var/datum/nifsoft/soft) + if(stat != NIF_WORKING) return FALSE + + if(human) + if(prob(5)) human.visible_message("\The [human] [pick(look_messages)].") + var/applies_to = soft.applies_to + var/synth = human.isSynthetic() + if(synth && !(applies_to & NIF_SYNTHETIC)) + notify("The software \"[soft]\" is not supported on your chassis type and will be uninstalled.",TRUE) + uninstall(soft) + return FALSE + if(!synth && !(applies_to & NIF_ORGANIC)) + notify("The software \"[soft]\" is not supported in organic life and will be uninstalled.",TRUE) + uninstall(soft) + return FALSE + + if(!use_charge(soft.a_drain)) + notify("Not enough power to activate \"[soft]\" NIFsoft!",TRUE) + return FALSE + + if(soft.tick_flags == NIF_ACTIVETICK) + nifsofts_life += soft + + power_usage += soft.a_drain + human << click_sound + + return TRUE + +//Deactivate a nifsoft +/obj/item/device/nif/proc/deactivate(var/datum/nifsoft/soft) + if(human) + if(prob(5)) human.visible_message("\The [human] [pick(look_messages)].") + + if(soft.tick_flags == NIF_ACTIVETICK) + nifsofts_life -= soft + + power_usage -= soft.a_drain + human << click_sound + + return TRUE + +//Deactivate several nifsofts +/obj/item/device/nif/proc/deactivate_these(var/list/turn_off) + for(var/N in turn_off) + var/datum/nifsoft/NS = nifsofts[N] + if(NS) + NS.deactivate() + +//Add a flag to one of the holders +/obj/item/device/nif/proc/set_flag(var/flag,var/hint) + ASSERT(flag && hint) + + switch(hint) + if(NIF_FLAGS_VISION) + vision_flags |= flag + if(NIF_FLAGS_HEALTH) + health_flags |= flag + if(NIF_FLAGS_COMBAT) + combat_flags |= flag + if(NIF_FLAGS_OTHER) + other_flags |= flag + else + CRASH("Not a valid NIF flag hint: [hint]") + +//Clear a flag from one of the holders +/obj/item/device/nif/proc/clear_flag(var/flag,var/hint) + ASSERT(flag && hint) + + switch(hint) + if(NIF_FLAGS_VISION) + vision_flags &= ~flag + if(NIF_FLAGS_HEALTH) + health_flags &= ~flag + if(NIF_FLAGS_COMBAT) + combat_flags &= ~flag + if(NIF_FLAGS_OTHER) + other_flags &= ~flag + else + CRASH("Not a valid NIF flag hint: [hint]") + +//Check for an installed implant +/obj/item/device/nif/proc/imp_check(var/soft) + if(stat != NIF_WORKING) return FALSE + ASSERT(soft) + + if(ispath(soft)) + var/datum/nifsoft/path = soft + soft = initial(path.list_pos) + var/entry = nifsofts[soft] + if(entry) + return entry + +//Check for a set flag +/obj/item/device/nif/proc/flag_check(var/flag,var/hint) + if(stat != NIF_WORKING) return FALSE + + ASSERT(flag && hint) + + var/result = FALSE + switch(hint) + if(NIF_FLAGS_VISION) + if(flag & vision_flags) result = TRUE + if(NIF_FLAGS_HEALTH) + if(flag & health_flags) result = TRUE + if(NIF_FLAGS_COMBAT) + if(flag & combat_flags) result = TRUE + if(NIF_FLAGS_OTHER) + if(flag & other_flags) result = TRUE + else + CRASH("Not a valid NIF flag hint: [hint]") + + return result + +/////////////////////////////////////////////////////////////////////////////////////// +//NIF HUD object becasue HUD handling is trash and should be rewritten +/obj/item/clothing/glasses/hud/nif_hud/var/obj/item/device/nif/nif + +/obj/item/clothing/glasses/hud/nif_hud/New(var/newloc) + ..(newloc) + nif = newloc + +/obj/item/clothing/glasses/hud/nif_hud/Destroy() + if(nif) + nif.nif_hud = null + nif = null + return ..() + +/obj/item/clothing/glasses/hud/nif_hud/process_hud(M,var/thing) + //Faster checking with local var, and this is called often so I want fast. + var/visflags = nif.vision_flags + if(NIF_V_AR_OMNI & visflags) + process_omni_hud(nif.human, "best") + else if(NIF_V_AR_SECURITY & visflags) + process_omni_hud(nif.human, "sec") + else if(NIF_V_AR_MEDICAL & visflags) + process_omni_hud(nif.human, "med") + else if(NIF_V_AR_ENGINE & visflags) + process_omni_hud(nif.human, "eng") + else if(NIF_V_AR_SCIENCE & visflags) + process_omni_hud(nif.human, "sci") + else if(NIF_V_AR_CIVILIAN & visflags) + process_omni_hud(nif.human, "civ") + +// Alternate NIFs +/obj/item/device/nif/bad + name = "second-hand NIF" + desc = "A copy of a copy of a copy of a copy of... this can't be any good, right? Surely?" + durability = 10 + +/obj/item/device/nif/authentic + name = "\improper Kitsuhana NIF" + desc = "An actual Kitsuhana working surface, in a box. From a society slightly less afraid \ + of self-replicating nanotechnology. Basically just a high-endurance NIF." + durability = 1000 + +/obj/item/device/nif/bioadap + name = "bioadaptive NIF" + desc = "A NIF that goes out of it's way to accomidate strange body types. \ + Will function in species where it normally wouldn't." + durability = 25 + bioadap = TRUE diff --git a/code/modules/nifsoft/nif_softshop.dm b/code/modules/nifsoft/nif_softshop.dm new file mode 100644 index 00000000000..67e786bf183 --- /dev/null +++ b/code/modules/nifsoft/nif_softshop.dm @@ -0,0 +1,183 @@ +//Custom vendors +/obj/machinery/vending/nifsoft_shop + name = "NIFSoft Shop" + desc = "For all your mindware and mindware accessories." + product_ads = "Let us get into your head!;Looking for an upgrade?;Surpass Humanity!;Why be normal when you can be SUPERnormal?;Jack in with NIFSoft!" + icon_state = "nifsoft" + icon_vend = "nifsoft-purchase" + icon_deny = "nifsoft-problem" + products = list() + contraband = list() + premium = list() + var/global/list/starting_legal_nifsoft + var/global/list/starting_illegal_nifsoft + +// Special Treatment! +/obj/machinery/vending/nifsoft_shop/build_inventory() + //Firsties + if(!starting_legal_nifsoft) + starting_legal_nifsoft = list() + starting_illegal_nifsoft = list() + for(var/P in subtypesof(/datum/nifsoft) - /datum/nifsoft/package) + var/datum/nifsoft/NS = P + if(initial(NS.vended)) + switch(initial(NS.illegal)) + if(TRUE) + starting_illegal_nifsoft += NS + if(FALSE) + starting_legal_nifsoft += NS + + products = starting_legal_nifsoft.Copy() + contraband = starting_illegal_nifsoft.Copy() + + var/list/all_products = list( + list(products, CAT_NORMAL), + list(contraband, CAT_HIDDEN), + list(premium, CAT_COIN)) + + for(var/current_list in all_products) + var/category = current_list[2] + + for(var/entry in current_list[1]) + var/datum/nifsoft/NS = entry + var/applies_to = initial(NS.applies_to) + var/context = "" + if(!(applies_to & NIF_SYNTHETIC)) + context = " (Org Only)" + else if(!(applies_to & NIF_ORGANIC)) + context = " (Syn Only)" + var/name = "[initial(NS.name)][context]" + var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry, name) + + product.price = initial(NS.cost) + product.amount = 10 + product.category = category + + product_records.Add(product) + +/obj/machinery/vending/nifsoft_shop/allowed(mob/user) + if(!ishuman(user)) + return FALSE + + var/mob/living/carbon/human/H = user + if(!H.nif || !H.nif.stat == NIF_WORKING) + to_chat(H,"[src] seems unable to connect to your NIF...") + flick(icon_deny,src) + return FALSE + + return ..() + +//Had to override this too +/obj/machinery/vending/nifsoft_shop/Topic(href, href_list) + if(stat & (BROKEN|NOPOWER)) + return + if(usr.stat || usr.restrained()) + return + + if(href_list["remove_coin"] && !istype(usr,/mob/living/silicon)) + if(!coin) + usr << "There is no coin in this machine." + return + + coin.forceMove(src.loc) + if(!usr.get_active_hand()) + usr.put_in_hands(coin) + usr << "You remove \the [coin] from \the [src]" + coin = null + categories &= ~CAT_COIN + + if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) + if((href_list["vend"]) && (vend_ready) && (!currently_vending)) + if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH + usr << "Access denied." //Unless emagged of course + flick(icon_deny,src) + return + + var/key = text2num(href_list["vend"]) + var/datum/stored_item/vending_product/R = product_records[key] + + // This should not happen unless the request from NanoUI was bad + if(!(R.category & categories)) + return + + //Specific soft access checking + var/datum/nifsoft/path = R.item_path + if(initial(path.access)) + var/list/soft_access = list(initial(path.access)) + var/list/usr_access = usr.GetAccess() + if(!has_access(soft_access, list(), usr_access) && !emagged) + usr << "You aren't authorized to buy [initial(path.name)]." + flick(icon_deny,src) + return + + if(R.price <= 0) + vend(R, usr) + else if(istype(usr,/mob/living/silicon)) //If the item is not free, provide feedback if a synth is trying to buy something. + usr << "Artificial unit recognized. Artificial units cannot complete this transaction. Purchase canceled." + return + else + currently_vending = R + if(!vendor_account || vendor_account.suspended) + status_message = "This machine is currently unable to process payments due to problems with the associated account." + status_error = 1 + else + status_message = "[initial(path.desc)]

Please swipe a card or insert cash to pay for the item." + status_error = 0 + + else if(href_list["cancelpurchase"]) + currently_vending = null + + else if((href_list["togglevoice"]) && (panel_open)) + shut_up = !shut_up + + add_fingerprint(usr) + nanomanager.update_uis(src) + +// Also special treatment! +/obj/machinery/vending/nifsoft_shop/vend(datum/stored_item/vending_product/R, mob/user) + var/mob/living/carbon/human/H = user + if((!allowed(usr)) && !emagged && scan_id && istype(H)) //For SECURE VENDING MACHINES YEAH + usr << "Purchase not allowed." //Unless emagged of course + flick(icon_deny,src) + return + vend_ready = 0 //One thing at a time!! + status_message = "Installing..." + status_error = 0 + nanomanager.update_uis(src) + + if(R.category & CAT_COIN) + if(!coin) + user << "You need to insert a coin to get this item." + return + if(coin.string_attached) + if(prob(50)) + user << "You successfully pull the coin out before \the [src] could swallow it." + else + user << "You weren't able to pull the coin out fast enough, the machine ate it, string and all." + qdel(coin) + coin = null + categories &= ~CAT_COIN + else + qdel(coin) + coin = null + categories &= ~CAT_COIN + + if(((last_reply + (vend_delay + 200)) <= world.time) && vend_reply) + spawn(0) + speak(vend_reply) + last_reply = world.time + + use_power(vend_power_usage) //actuators and stuff + spawn(vend_delay) + R.amount-- + new R.item_path(H.nif) + flick(icon_vend,src) + if(has_logs) + do_logging(R, user, 1) + + status_message = "" + status_error = 0 + vend_ready = 1 + currently_vending = null + nanomanager.update_uis(src) + return 1 diff --git a/code/modules/nifsoft/nif_statpanel.dm b/code/modules/nifsoft/nif_statpanel.dm new file mode 100644 index 00000000000..0cf2307b650 --- /dev/null +++ b/code/modules/nifsoft/nif_statpanel.dm @@ -0,0 +1,78 @@ +/mob/living/carbon/human/Stat() + . = ..() + if(nif && statpanel("NIF")) + SetupNifStat() + +/mob/living/carbon/human/proc/SetupNifStat() + var/nif_status = "" + var/nif_percent = round((nif.durability/initial(nif.durability))*100) + switch(nif.stat) + if(NIF_WORKING) + if(nif_percent < 20) + nif_status = "Service Needed Soon" + else + nif_status = "Operating Normally" + if(NIF_POWFAIL) + nif_status = "Insufficient Energy!" + if(NIF_TEMPFAIL) + nif_status = "System Failure!" + if(NIF_INSTALLING) + nif_status = "Adapting To User" + else + nif_status = "Unknown - Error" + nif_status += " (Condition: [nif_percent]%)" + stat("NIF Status", nif_status) + + if(nif.stat == NIF_WORKING) + stat("- Modules -", "LMB: Toggle, Shift+LMB: Info/Uninstall") + for(var/nifsoft in nif.nifsofts) + if(!nifsoft) continue + var/datum/nifsoft/NS = nifsoft + var/obj/effect/nif_stat/stat_line = NS.stat_line + stat("[stat_line.nifsoft_name]",stat_line.atom_button_text()) + +/////////////////// +// Stat Line Object +/obj/effect/nif_stat + name = "" + var/nifsoft_name //Prevents deeper lookups, and the name won't change + var/datum/nifsoft/nifsoft //Reference to our nifsoft + var/toggleable = FALSE //Won't change, prevents looking it up deeper + +/obj/effect/nif_stat/New(var/datum/nifsoft/new_soft) + ..() + nifsoft = new_soft + nifsoft_name = new_soft.name + name = new_soft.name + +/obj/effect/nif_stat/Destroy() + nifsoft = null + return ..() + +/obj/effect/nif_stat/proc/atom_button_text() + name = nifsoft.stat_text() + return src + +/obj/effect/nif_stat/Click(var/location, var/control, var/params) + if(usr != nifsoft.nif.human) return + + var/list/clickprops = params2list(params) + var/opts = clickprops["shift"] + + if(opts) + var/choice = alert("Select an option","[nifsoft_name]","Display Info","Cancel","Uninstall") + switch(choice) + if("Display Info") + nifsoft.nif.notify("[nifsoft_name]: [nifsoft.desc] - It consumes [nifsoft.p_drain] energy units \ + while installed, and [nifsoft.a_drain] additionally while active. It is [nifsoft.illegal ? "NOT " : ""]\ + a legal software package. The MSRP of the package is [nifsoft.cost] Thalers. The difficulty to construct \ + the associated implant is Rating [nifsoft.wear].") + if("Uninstall") + var/confirm = alert("Really uninstall [nifsoft_name]?","Are you sure?","Cancel","Uninstall","Cancel") + if(confirm == "Uninstall") + nifsoft.uninstall() + else if(nifsoft.activates) + if(nifsoft.active) + nifsoft.deactivate() + else + nifsoft.activate() diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm new file mode 100644 index 00000000000..529fa644577 --- /dev/null +++ b/code/modules/nifsoft/nifsoft.dm @@ -0,0 +1,282 @@ +//Please see the comment above the main NIF definition before +//trying to call any of these procs directly. + +//A single piece of NIF software +/datum/nifsoft + var/name = "Prototype" + var/desc = "Contact a dev!" + + var/obj/item/device/nif/nif //The NIF that the software is stored in + + var/list_pos // List position in the nifsoft list + + var/cost = 1000 // Cost in cash of buying this software from a terminal + + var/vended = TRUE // This is available in NIFSoft Shops at the start of the game + var/wear = 1 // The wear (+/- 10% when applied) that this causes to the NIF + var/access // What access they need to buy it, can only set one for ~reasons~ + var/illegal = FALSE // If this is a black-market nifsoft (emag option) + + var/active = FALSE // Whether the active mode of this implant is on + var/p_drain = 0 // Passive power drain, can be used in various ways from the software + var/a_drain = 0 // Active power drain, same purpose as above, software can treat however + var/activates = TRUE // Whether or not this has an active power consumption mode + var/tick_flags = 0 // Flags to tell when we'd like to be ticked + + var/empable = TRUE // If the implant can be destroyed via EMP attack + + var/expiring = FALSE // Trial software! Or self-deleting illegal ones! + var/expires_at // World.time for when they expire + + var/applies_to = (NIF_ORGANIC|NIF_SYNTHETIC) // Who this software is useful for + + var/vision_flags = 0 // Various flags for fast lookups that are settable on the NIF + var/health_flags = 0 // These are added as soon as the implant is installed + var/combat_flags = 0 // Otherwise use set_flag on the nif in your activate/deactivate + var/other_flags = 0 + + var/obj/effect/nif_stat/stat_line + + +//Constructor accepts the NIF it's being loaded into +/datum/nifsoft/New(var/obj/item/device/nif/nif_load) + ASSERT(nif_load) + + nif = nif_load + stat_line = new(src) + if(!install(nif)) + qdel(src) + +//Destructor cleans up the software and nif reference +/datum/nifsoft/Destroy() + if(nif) + uninstall() + nif = null + qdel_null(stat_line) + return ..() + +//Called when the software is installed in the NIF +/datum/nifsoft/proc/install() + return nif.install(src) + +//Called when the software is removed from the NIF +/datum/nifsoft/proc/uninstall() + if(active) + deactivate() + if(nif) + . = nif.uninstall(src) + nif = null + if(!QDESTROYING(src)) + qdel(src) + +//Called every life() tick on a mob on active implants +/datum/nifsoft/proc/life(var/mob/living/carbon/human/human) + return TRUE + +//Called when attempting to activate an implant (could be a 'pulse' activation or toggling it on) +/datum/nifsoft/proc/activate() + if(active) + return + var/nif_result = nif.activate(src) + if(nif_result) + active = TRUE + return nif_result + +//Called when attempting to deactivate an implant +/datum/nifsoft/proc/deactivate() + if(!active) + return + var/nif_result = nif.deactivate(src) + if(nif_result) + active = FALSE + return nif_result + +//Called when an implant expires +/datum/nifsoft/proc/expire() + uninstall() + return + +//Called when installed from a disk +/datum/nifsoft/proc/disk_install(var/mob/living/carbon/human/target,var/mob/living/carbon/human/user) + return TRUE + +//Stat-line clickable text +/datum/nifsoft/proc/stat_text() + if(activates) + return "[active ? "Active" : "Disabled"]" + + return "Always On" + +////////////////////// +//A package of NIF software +/datum/nifsoft/package + var/list/software = list() + wear = 0 //Packages don't cause wear themselves, the software does + +//Constructor accepts a NIF and loads all the software +/datum/nifsoft/package/New(var/obj/item/device/nif/nif_load) + ASSERT(nif_load) + + for(var/P in software) + new P(nif_load) + + qdel(src) + +//Clean self up +/datum/nifsoft/package/Destroy() + software.Cut() + software = null + return ..() + +///////////////// +// A NIFSoft Disk +/obj/item/weapon/disk/nifsoft + name = "NIFSoft Disk" + desc = "It has a small label: \n\ + \"Portable NIFSoft Disk. \n\ + Insert directly into brain.\"" + icon = 'icons/obj/cloning.dmi' + icon_state = "datadisk2" + item_state = "card-id" + w_class = ITEMSIZE_SMALL + var/datum/nifsoft/stored = null + var/laws = "" + +/obj/item/weapon/disk/nifsoft/afterattack(var/A, mob/user, flag, params) + if(!in_range(user, A)) + return + + if(!ishuman(user) || !ishuman(A)) + return + + var/mob/living/carbon/human/Ht = A + var/mob/living/carbon/human/Hu = user + + if(!Ht.nif || Ht.nif.stat != NIF_WORKING) + to_chat(user,"Either they don't have a NIF, or the disk can't connect.") + return + + Ht.visible_message("[Hu] begins uploading new NIFSoft into [Ht]!","[Hu] is uploading new NIFSoft into you!") + if(do_after(Hu,10 SECONDS,Ht)) + var/extra = extra_params() + new stored(Ht.nif,extra) + qdel(src) + +//So disks can pass fancier stuff. +/obj/item/weapon/disk/nifsoft/proc/extra_params() + return null + + +// Compliance Disk // +/obj/item/weapon/disk/nifsoft/compliance + name = "NIFSoft Disk (Compliance)" + desc = "Wow, adding laws to people? That seems illegal. It probably is. Okay, it really is." + stored = /datum/nifsoft/compliance + +/obj/item/weapon/disk/nifsoft/compliance/afterattack(var/A, mob/user, flag, params) + if(!laws) + to_chat(user,"You haven't set any laws yet. Use the disk in-hand first.") + return + ..(A,user,flag,params) + +/obj/item/weapon/disk/nifsoft/compliance/attack_self(mob/user) + var/newlaws = input(user,"Please Input Laws","Compliance Laws",laws) as message + newlaws = sanitize(newlaws,2048) + if(newlaws) + to_chat(user,"You set the laws to:
[newlaws]") + laws = newlaws + +/obj/item/weapon/disk/nifsoft/compliance/extra_params() + return laws + +// Security Disk // +/obj/item/weapon/disk/nifsoft/security + name = "NIFSoft Disk - Security" + desc = "Contains free NIFSofts useful for security members.\n\ + It has a small label: \n\ + \"Portable NIFSoft Disk. \n\ + Insert directly into brain.\"" + + stored = /datum/nifsoft/package/security + +/datum/nifsoft/package/security + software = list(/datum/nifsoft/ar_sec,/datum/nifsoft/flashprot) + +/obj/item/weapon/storage/box/nifsofts_security + name = "security nifsoft disks" + desc = "A box of free nifsofts for security employees." + icon_state = "disk_kit" + +/obj/item/weapon/storage/box/nifsofts_security/New() + ..() + for(var/i = 0 to 7) + new /obj/item/weapon/disk/nifsoft/security(src) + +// Engineering Disk // +/obj/item/weapon/disk/nifsoft/engineering + name = "NIFSoft Disk - Engineering" + desc = "Contains free NIFSofts useful for engineering members.\n\ + It has a small label: \n\ + \"Portable NIFSoft Disk. \n\ + Insert directly into brain.\"" + + stored = /datum/nifsoft/package/engineering + +/datum/nifsoft/package/engineering + software = list(/datum/nifsoft/ar_eng,/datum/nifsoft/uvblocker) + +/obj/item/weapon/storage/box/nifsofts_engineering + name = "engineering nifsoft disks" + desc = "A box of free nifsofts for engineering employees." + icon_state = "disk_kit" + +/obj/item/weapon/storage/box/nifsofts_engineering/New() + ..() + for(var/i = 0 to 7) + new /obj/item/weapon/disk/nifsoft/engineering(src) + +// Medical Disk // +/obj/item/weapon/disk/nifsoft/medical + name = "NIFSoft Disk - Medical" + desc = "Contains free NIFSofts useful for medical members.\n\ + It has a small label: \n\ + \"Portable NIFSoft Disk. \n\ + Insert directly into brain.\"" + + stored = /datum/nifsoft/package/medical + +/datum/nifsoft/package/medical + software = list(/datum/nifsoft/ar_med,/datum/nifsoft/crewmonitor) + +/obj/item/weapon/storage/box/nifsofts_medical + name = "medical nifsoft disks" + desc = "A box of free nifsofts for medical employees." + icon_state = "disk_kit" + +/obj/item/weapon/storage/box/nifsofts_medical/New() + ..() + for(var/i = 0 to 7) + new /obj/item/weapon/disk/nifsoft/medical(src) + +// Mining Disk // +/obj/item/weapon/disk/nifsoft/mining + name = "NIFSoft Disk - Mining" + desc = "Contains free NIFSofts useful for mining members.\n\ + It has a small label: \n\ + \"Portable NIFSoft Disk. \n\ + Insert directly into brain.\"" + + stored = /datum/nifsoft/package/mining + +/datum/nifsoft/package/mining + software = list(/datum/nifsoft/material,/datum/nifsoft/spare_breath) + +/obj/item/weapon/storage/box/nifsofts_mining + name = "mining nifsoft disks" + desc = "A box of free nifsofts for mining employees." + icon_state = "disk_kit" + +/obj/item/weapon/storage/box/nifsofts_mining/New() + ..() + for(var/i = 0 to 7) + new /obj/item/weapon/disk/nifsoft/mining(src) \ No newline at end of file diff --git a/code/modules/nifsoft/software/01_vision.dm b/code/modules/nifsoft/software/01_vision.dm new file mode 100644 index 00000000000..c58377f9577 --- /dev/null +++ b/code/modules/nifsoft/software/01_vision.dm @@ -0,0 +1,252 @@ +////////////////// +// AR HUD Overlays +/datum/nifsoft/ar_civ + name = "AR Overlay (Civ)" + desc = "Provides a general identification and health status overlay on your vision with no frills." + list_pos = NIF_CIVILIAN_AR + cost = 500 + a_drain = 0.05 + + activate() + if((. = ..())) + nif.deactivate_these(NIF_MEDICAL_AR,NIF_SECURITY_AR,NIF_ENGINE_AR,NIF_SCIENCE_AR,NIF_OMNI_AR) + nif.set_flag(NIF_V_AR_CIVILIAN,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_AR_CIVILIAN,NIF_FLAGS_VISION) + +/datum/nifsoft/ar_med + name = "AR Overlay (Med)" + desc = "Like the civilian model, but provides medical records access and virus database lookup." + list_pos = NIF_MEDICAL_AR + cost = 750 + access = access_medical + a_drain = 0.05 + + activate() + if((. = ..())) + nif.deactivate_these(NIF_CIVILIAN_AR,NIF_SECURITY_AR,NIF_ENGINE_AR,NIF_SCIENCE_AR,NIF_OMNI_AR) + nif.set_flag(NIF_V_AR_MEDICAL,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_AR_MEDICAL,NIF_FLAGS_VISION) + +/datum/nifsoft/ar_sec + name = "AR Overlay (Sec)" + desc = "Like the civilian model, but provides access to arrest status and security records." + list_pos = NIF_SECURITY_AR + cost = 750 + access = access_security + a_drain = 0.05 + + activate() + if((. = ..())) + nif.deactivate_these(NIF_CIVILIAN_AR,NIF_MEDICAL_AR,NIF_ENGINE_AR,NIF_SCIENCE_AR,NIF_OMNI_AR) + nif.set_flag(NIF_V_AR_SECURITY,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_AR_SECURITY,NIF_FLAGS_VISION) + +/datum/nifsoft/ar_eng + name = "AR Overlay (Eng)" + desc = "Like the civilian model, but provides station alert notices." + list_pos = NIF_ENGINE_AR + cost = 750 + access = access_engine + a_drain = 0.05 + + activate() + if((. = ..())) + nif.deactivate_these(NIF_CIVILIAN_AR,NIF_MEDICAL_AR,NIF_SECURITY_AR,NIF_SCIENCE_AR,NIF_OMNI_AR) + nif.set_flag(NIF_V_AR_ENGINE,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_AR_ENGINE,NIF_FLAGS_VISION) + +/datum/nifsoft/ar_science + name = "AR Overlay (Sci)" + desc = "Like the civilian model, but provides ... well, nothing. For now." + list_pos = NIF_SCIENCE_AR + cost = 750 + access = access_research + a_drain = 0.05 + + activate() + if((. = ..())) + nif.deactivate_these(NIF_CIVILIAN_AR,NIF_MEDICAL_AR,NIF_SECURITY_AR,NIF_ENGINE_AR,NIF_OMNI_AR) + nif.set_flag(NIF_V_AR_SCIENCE,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_AR_SCIENCE,NIF_FLAGS_VISION) + +/datum/nifsoft/ar_omni + name = "AR Overlay (Omni)" + desc = "Like the civilian model, but provides most of the features of the medical and security overlays as well." + list_pos = NIF_OMNI_AR + cost = 750 + access = access_captain + a_drain = 0.05 + + activate() + if((. = ..())) + nif.deactivate_these(NIF_CIVILIAN_AR,NIF_MEDICAL_AR,NIF_SECURITY_AR,NIF_ENGINE_AR,NIF_SCIENCE_AR) + nif.set_flag(NIF_V_AR_OMNI,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_AR_OMNI,NIF_FLAGS_VISION) + +////////////// +// Misc Vision +/datum/nifsoft/corrective + name = "Corrective AR" + desc = "Subtly alters perception to compensate for cataracts and retinal misalignment, among other common disabilities." + list_pos = NIF_CORRECTIVE_GLASS + cost = 200 + a_drain = 0.025 + + activate() + if((. = ..())) + nif.set_flag(NIF_V_CORRECTIVE,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_CORRECTIVE,NIF_FLAGS_VISION) + +/datum/nifsoft/uvblocker + name = "Nictating Membrane" + desc = "A synthetic nictating membrane (aka 'third eyelid') that protects the eyes from UV or hostile atmospheres. Does not protect from photonic stun weapons." + list_pos = NIF_UVFILTER + cost = 450 + a_drain = 0.2 + + activate() + if((. = ..())) + nif.set_flag(NIF_V_UVFILTER,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_UVFILTER,NIF_FLAGS_VISION) + +/datum/nifsoft/flashprot + name = "Responsive Filter" + desc = "Enables a high-speed shielding response to intense light, such as flashes, to block them." + list_pos = NIF_FLASHPROT + cost = 600 + access = access_security + a_drain = 0.05 + + activate() + if((. = ..())) + nif.set_flag(NIF_V_FLASHPROT,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_FLASHPROT,NIF_FLAGS_VISION) + +//////////////// +// Goggle-alikes +/datum/nifsoft/mesons + name = "Meson Scanner" + desc = "Similar to the worn Optical Meson Scanner Goggles, these allow you to see the base structure and terrain through walls." + list_pos = NIF_MESONS + cost = 1000 + a_drain = 0.1 + access = access_engine + tick_flags = NIF_ACTIVETICK + + activate() + if((. = ..())) + nif.deactivate_these(NIF_MATERIAL,NIF_THERMALS,NIF_NIGHTVIS) + nif.set_flag(NIF_V_MESONS,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_MESONS,NIF_FLAGS_VISION) + + life() + if((. = ..())) + var/mob/living/carbon/human/H = nif.human + H.sight |= SEE_TURFS + if(H.client) + H.client.screen |= global_hud.meson + +/datum/nifsoft/material + name = "Material Scanner" + desc = "Similar to the worn Optical Material Scanner Goggles, these allow you to see objects through walls." + list_pos = NIF_MATERIAL + cost = 1000 + a_drain = 0.1 + access = access_research + tick_flags = NIF_ACTIVETICK + + activate() + if((. = ..())) + nif.deactivate_these(NIF_MESONS,NIF_THERMALS,NIF_NIGHTVIS) + nif.set_flag(NIF_V_MATERIAL,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_MATERIAL,NIF_FLAGS_VISION) + + life() + if((. = ..())) + nif.human.sight |= SEE_OBJS + +/datum/nifsoft/thermals + name = "Thermal Scanner" + desc = "Similar to the worn Thermal Goggles, these allow you to see heat-emitting creatures through walls." + list_pos = NIF_THERMALS + cost = 1000 + a_drain = 0.1 + access = access_captain + tick_flags = NIF_ACTIVETICK + + activate() + if((. = ..())) + nif.deactivate_these(NIF_MESONS,NIF_MATERIAL,NIF_NIGHTVIS) + nif.set_flag(NIF_V_THERMALS,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_THERMALS,NIF_FLAGS_VISION) + + life() + if((. = ..())) + var/mob/living/carbon/human/H = nif.human + H.sight |= SEE_MOBS + H.see_invisible = SEE_INVISIBLE_NOLIGHTING + if(H.client) + H.client.screen |= global_hud.thermal + +/datum/nifsoft/nightvis + name = "Low-Light Amp" + desc = "Similar to the worn Night Vision Goggles, these allow you to see in complete darkness." + list_pos = NIF_NIGHTVIS + cost = 1000 + a_drain = 0.1 + access = access_security + tick_flags = NIF_ACTIVETICK + + activate() + if((. = ..())) + nif.deactivate_these(NIF_MESONS,NIF_MATERIAL,NIF_THERMALS) + nif.set_flag(NIF_V_NIGHTVIS,NIF_FLAGS_VISION) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_V_NIGHTVIS,NIF_FLAGS_VISION) + + life() + if((. = ..())) + var/mob/living/carbon/human/H = nif.human + H.see_in_dark += 7 + H.see_invisible = SEE_INVISIBLE_NOLIGHTING + if(H.client) + H.client.screen |= global_hud.nvg + diff --git a/code/modules/nifsoft/software/05_health.dm b/code/modules/nifsoft/software/05_health.dm new file mode 100644 index 00000000000..cc60ff1f910 --- /dev/null +++ b/code/modules/nifsoft/software/05_health.dm @@ -0,0 +1,212 @@ +/datum/nifsoft/crewmonitor + name = "Crew Monitor" + desc = "A link to the local crew monitor sensors. Useful for finding people in trouble." + list_pos = NIF_CREWMONITOR + access = access_medical + cost = 1250 + p_drain = 0.025 + var/datum/nano_module/crew_monitor/arscreen + + New() + ..() + arscreen = new(nif) + + Destroy() + qdel_null(arscreen) + return ..() + + activate() + if((. = ..())) + arscreen.ui_interact(nif.human,"main",null,1,nif_state) + return TRUE + + deactivate() + if((. = ..())) + return TRUE + + stat_text() + return "Show Monitor" + +/datum/nifsoft/medichines_org + name = "Medichines" + desc = "An internal swarm of nanites to make sure you stay in good shape and to promote healing, or to preserve you if you are critically injured." + list_pos = NIF_ORGANIC_HEAL + cost = 2500 + p_drain = 0.05 + a_drain = 0.1 //This is messed with manually below. + wear = 2 + activates = FALSE //It is automatic in emergencies, not manually controllable. + tick_flags = NIF_ALWAYSTICK + applies_to = NIF_ORGANIC + var/mode = 0 + + //These self-activate on their own, these aren't user-settable to on/off. + activate() + if((. = ..())) + nif.set_flag(NIF_H_ORGREPAIR,NIF_FLAGS_HEALTH) + mode = 1 + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_H_ORGREPAIR,NIF_FLAGS_HEALTH) + a_drain = initial(a_drain) + mode = initial(mode) + nif.human.Stasis(0) + + life() + if((. = ..())) + var/mob/living/carbon/human/H = nif.human + var/HP_percent = H.health/H.getMaxHealth() + + //Mode changing state machine + if(HP_percent >= 0.9) + if(mode) + nif.notify("User Status: NORMAL. Medichines deactivating.") + deactivate() + return TRUE + else if(!mode && HP_percent < 0.8) + nif.notify("User Status: INJURED. Commencing medichine routines.",TRUE) + activate() + else if(mode == 1 && HP_percent < 0.2) + nif.notify("User Status: DANGER. Seek medical attention!",TRUE) + mode = 2 + else if(mode == 2 && HP_percent < -0.4) + nif.notify("User Status: CRITICAL. Notifying medical, and starting emergency stasis!",TRUE) + mode = 3 + if(!ishuman(H.loc)) //Not notified in case of vore, for gameplay purposes. + var/turf/T = get_turf(H) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) + a.autosay("[H.real_name] has been put in emergency stasis, located at ([T.x],[T.y],[T.z])!", "[H.real_name]'s NIF", "Medical") + qdel(a) + + //Handle the actions in each mode + + //Injured but not critical + if(mode) + H.adjustToxLoss(-0.1 * mode) + H.adjustBruteLoss(-0.1 * mode) + H.adjustFireLoss(-0.1 * mode) + + if(mode >= 2) + nif.use_charge(a_drain) //A second drain if we're in level 2+ + + //Patient critical - emergency stasis + if(mode >= 3) + if(HP_percent <= 0) + H.Stasis(3) + if(HP_percent > 0.2) + H.Stasis(0) + nif.notify("Ending emergency stasis.",TRUE) + mode = 2 + + return TRUE + +/datum/nifsoft/medichines_syn + name = "Medichines" + desc = "A swarm of mechanical repair nanites, able to repair relatively minor damage to synthetic bodies. Large repairs must still be performed manually." + list_pos = NIF_SYNTH_HEAL + cost = 2500 + p_drain = 0.05 + a_drain = 0.00 //This is manually drained below. + wear = 2 + activates = FALSE //It is automatic in emergencies, not manually controllable. + tick_flags = NIF_ALWAYSTICK + applies_to = NIF_SYNTHETIC + var/mode = 0 + + //These self-activate on their own, these aren't user-settable to on/off. + activate() + if((. = ..())) + nif.set_flag(NIF_H_SYNTHREPAIR,NIF_FLAGS_HEALTH) + mode = 1 + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_H_SYNTHREPAIR,NIF_FLAGS_HEALTH) + mode = 0 + + life() + if((. = ..())) + //We're good! + if(!nif.human.bad_external_organs.len) + if(mode || active) + nif.notify("User Status: NORMAL. Medichines deactivating.") + deactivate() + return TRUE + + if(!mode && !active) + nif.notify("User Status: DAMAGED. Medichines performing minor repairs.",TRUE) + activate() + + for(var/eo in nif.human.bad_external_organs) + var/obj/item/organ/external/EO = eo + for(var/w in EO.wounds) + var/datum/wound/W = w + if(W.damage <= 5) + W.heal_damage(0.1) + EO.update_damages() + if(EO.update_icon()) + nif.human.UpdateDamageIcon(1) + nif.use_charge(0.1) + return TRUE //Return entirely, we only heal one at a time. + else if(mode == 1) + mode = 2 + nif.notify("Medichines unable to repair all damage. Perform manual repairs.",TRUE) + + return TRUE + +/datum/nifsoft/spare_breath + name = "Respirocytes" + desc = "Nanites simulating red blood cells will filter and recycle oxygen for a short time, preventing suffocation in hostile environments. NOTE: Only capable of supplying OXYGEN." + list_pos = NIF_SPAREBREATH + cost = 650 + p_drain = 0.05 + a_drain = 0.1 + wear = 2 + tick_flags = NIF_ALWAYSTICK + applies_to = NIF_ORGANIC + var/filled = 100 //Tracks the internal tank 'refilling', which still uses power + + activate() + if(!(filled > 50)) + nif.notify("Respirocytes not saturated!",TRUE) + return FALSE + if((. = ..())) + nif.set_flag(NIF_H_SPAREBREATH,NIF_FLAGS_HEALTH) + nif.notify("Now taking air from reserves.") + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_H_SPAREBREATH,NIF_FLAGS_HEALTH) + nif.notify("Now taking air from environment and refilling reserves.") + + life() + if((. = ..())) + if(active) //Supplying air, not recharging it + switch(filled) //Text warnings + if(75) + nif.notify("Respirocytes at 75% saturation.",TRUE) + if(50) + nif.notify("Respirocytes at 50% saturation!",TRUE) + if(25) + nif.notify("Respirocytes at 25% saturation, seek a habitable environment!",TRUE) + if(5) + nif.notify("Respirocytes at 5% saturation! Failure imminent!",TRUE) + + if(filled == 0) //Ran out + deactivate() + else //Drain a little + filled-- + + else //Recharging air, not supplying it + if(filled == 100) + return TRUE + else if(nif.use_charge(0.1) && ++filled == 100) + nif.notify("Respirocytes now fully saturated.") + + proc/resp_breath() + if(!active) return null + var/datum/gas_mixture/breath = new() + breath.adjust_gas("oxygen", 300) + breath.temperature = T20C + return breath diff --git a/code/modules/nifsoft/software/10_combat.dm b/code/modules/nifsoft/software/10_combat.dm new file mode 100644 index 00000000000..ef94ec715b5 --- /dev/null +++ b/code/modules/nifsoft/software/10_combat.dm @@ -0,0 +1,122 @@ +/datum/nifsoft/brute_armor + name = "Bullhide Mod" + desc = "A difficult-to-produce thickening of the dermis and skeletal structure, allowing a user to absorb more external trauma from physical sources." + list_pos = NIF_BRUTEARMOR + cost = 3200 + p_drain = 0.05 + illegal = TRUE + wear = 3 + access = 999 //Prevents anyone from buying it without an emag. + activates = FALSE //It's armor. + combat_flags = NIF_C_BRUTEARMOR // Default on when installed, clear when uninstalled + +/datum/nifsoft/burn_armor + name = "Dragon's Skin" + desc = "A thin layer of material under the skin provides heat disappation for burns, reducing the trauma from lasers and fire. Not effective against ongoing environmental heat." + list_pos = NIF_BURNARMOR + cost = 3200 + p_drain = 0.05 + illegal = TRUE + wear = 3 + access = 999 //Prevents anyone from buying it without an emag. + activates = FALSE //It's armor. + combat_flags = NIF_C_BURNARMOR // Default on when installed, clear when uninstalled + +/datum/nifsoft/painkillers + name = "Nova Shock" + desc = "A constant stream of high-grade painkillers numb the user's body to all pain. Generally results in extreme addiction or overdose." + list_pos = NIF_PAINKILLERS + cost = 2600 + a_drain = 1 //Gotta produce them drugs, yo. + illegal = TRUE + wear = 2 + access = 999 //Prevents anyone from buying it without an emag. + tick_flags = NIF_ACTIVETICK + + activate() + if((. = ..())) + nif.set_flag(NIF_C_PAINKILLERS,NIF_FLAGS_COMBAT) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_C_PAINKILLERS,NIF_FLAGS_COMBAT) + + life() + if((. = ..())) + var/mob/living/carbon/human/H = nif.human + H.bloodstr.add_reagent("numbenzyme",0.5) + +/datum/nifsoft/hardclaws + name = "Bloodletters" + desc = "Generates monofilament wires from one's fingertips, allowing one to slash through almost any armor with relative ease. The monofilaments need to be replaced constantly, though, which does use power." + list_pos = NIF_HARDCLAWS + cost = 2200 + a_drain = 0.5 + illegal = TRUE + wear = 4 + access = 999 //Prevents anyone from buying it without an emag. + + activate() + if((. = ..())) + nif.set_flag(NIF_C_HARDCLAWS,NIF_FLAGS_COMBAT) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_C_HARDCLAWS,NIF_FLAGS_COMBAT) + +// The unarmed attack to go with the hardclaws +var/global/datum/unarmed_attack/hardclaws/unarmed_hardclaws = new() +/datum/unarmed_attack/hardclaws + attack_verb = list("claws") + attack_noun = list("talons") + damage = 15 + attack_sound = "punch" + miss_sound = 'sound/weapons/punchmiss.ogg' + sharp = 1 + edge = 1 + sparring_variant_type = /datum/unarmed_attack/hardclaws + +/datum/nifsoft/hidelaser + name = "Dazzle" + desc = "Fabricates a 2-shot holdout laser inside your body, which can be deployed (somewhat painfully) on demand. Only enough materials to generate one." + list_pos = NIF_HIDDENLASER + cost = 2200 + //a_drain = 50 //Done manually below. + illegal = TRUE + wear = 6 + access = 999 //Prevents anyone from buying it without an emag. + var/used = FALSE + + activate() + if((. = ..())) + nif.set_flag(NIF_C_HIDELASER,NIF_FLAGS_COMBAT) + if(used) + nif.notify("You do not have a hidden weapon to deploy anymore!",TRUE) + deactivate() + return FALSE + if(!nif.use_charge(50)) + nif.notify("Insufficient energy to deploy weapon!",TRUE) + deactivate() + return FALSE + + var/mob/living/carbon/human/H = nif.human + H.adjustHalLoss(30) + var/obj/item/weapon/gun/energy/gun/martin/dazzle/dgun = new(get_turf(H)) + H.put_in_hands(dgun) + nif.notify("Weapon deployed!",TRUE) + used = TRUE + spawn(0) + uninstall() + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_C_HIDELASER,NIF_FLAGS_COMBAT) + +//The gun to go with this implant +/obj/item/weapon/gun/energy/gun/martin/dazzle + name = "Microlaser" + desc = "A tiny nanofabricated laser." + + icon = 'icons/obj/gun_vr.dmi' + icon_state = "PDW" + item_state = "gun" diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm new file mode 100644 index 00000000000..6cd7ea6df3d --- /dev/null +++ b/code/modules/nifsoft/software/13_soulcatcher.dm @@ -0,0 +1,340 @@ +//These two also have NIF FLAG representations. These are the local setting representations. +#define NIF_SC_CATCHING_ME 0x1 +#define NIF_SC_CATCHING_OTHERS 0x2 +//These are purely local setings flags, without global representation. +#define NIF_SC_ALLOW_EARS 0x4 +#define NIF_SC_ALLOW_EYES 0x8 +#define NIF_SC_BACKUPS 0x10 + +/////////// +// Soulcatcher - Like a posibrain, sorta! +/datum/nifsoft/soulcatcher + name = "Soulcatcher" + desc = "A mind storage and processing system capable of capturing and supporting human-level minds in a small VR space." + list_pos = NIF_SOULCATCHER + cost = 950 + wear = 1 + p_drain = 0.01 + other_flags = (NIF_O_SCMYSELF|NIF_O_SCOTHERS) // Default on when installed, clear when uninstalled + + var/setting_flags = (NIF_SC_CATCHING_ME|NIF_SC_CATCHING_OTHERS|NIF_SC_ALLOW_EARS|NIF_SC_ALLOW_EYES|NIF_SC_BACKUPS) + var/list/brainmobs = list() + var/inside_flavor = "A small completely white room with a couch, and a window to what seems to be the outside world. A small sign in the corner says 'Configure Me'." + + New() + ..() + load_settings() + + Destroy() + qdel_null_list(brainmobs) + return ..() + + activate() + if((. = ..())) + show_settings(nif.human) + spawn(0) + deactivate() + + deactivate() + if((. = ..())) + return TRUE + + stat_text() + return "Change Settings ([brainmobs.len] minds)" + + proc/save_settings() + nif.save_data["[list_pos]"] = inside_flavor + return TRUE + + proc/load_settings() + var/load = nif.save_data["[list_pos]"] + if(load) + inside_flavor = load + return TRUE + + proc/notify_into(var/message) + var/sound = nif.good_sound + + to_chat(nif.human,"\[\icon[nif.big_icon]NIF\] Soulcatcher displays, \"[message]\"") + nif.human << sound + + for(var/brainmob in brainmobs) + var/mob/living/carbon/brain/caught_soul/CS = brainmob + to_chat(CS,"\[\icon[nif.big_icon]NIF\] Soulcatcher displays, \"[message]\"") + brainmob << sound + + proc/say_into(var/message, var/mob/living/sender) + var/sender_name = sender.name + log_nsay("[sender_name]/[sender.key] : [message]",nif.human) + + to_chat(nif.human,"\[\icon[nif.big_icon]NIF\] [sender_name] speaks, \"[message]\"") + for(var/brainmob in brainmobs) + var/mob/living/carbon/brain/caught_soul/CS = brainmob + to_chat(CS,"\[\icon[nif.big_icon]NIF\] [sender_name] speaks, \"[message]\"") + + proc/emote_into(var/message, var/mob/living/sender) + var/sender_name = sender.name + log_nme("[sender_name]/[sender.key] : [message]",nif.human) + + to_chat(nif.human,"\[\icon[nif.big_icon]NIF\] [sender_name] [message]") + for(var/brainmob in brainmobs) + var/mob/living/carbon/brain/caught_soul/CS = brainmob + to_chat(CS,"\[\icon[nif.big_icon]NIF\] [sender_name] [message]") + + proc/show_settings(var/mob/living/carbon/human/H) + set waitfor = FALSE + var/settings_list = list( + "Catching You \[[setting_flags & NIF_SC_CATCHING_ME ? "Enabled" : "Disabled"]\]" = NIF_SC_CATCHING_ME, + "Catching Prey \[[setting_flags & NIF_SC_CATCHING_OTHERS ? "Enabled" : "Disabled"]\]" = NIF_SC_CATCHING_OTHERS, + "Ext. Hearing \[[setting_flags & NIF_SC_ALLOW_EARS ? "Enabled" : "Disabled"]\]" = NIF_SC_ALLOW_EARS, + "Ext. Vision \[[setting_flags & NIF_SC_ALLOW_EYES ? "Enabled" : "Disabled"]\]" = NIF_SC_ALLOW_EYES, + "Mind Backups \[[setting_flags & NIF_SC_BACKUPS ? "Enabled" : "Disabled"]\]" = NIF_SC_BACKUPS, + "Design Inside", + "Erase Contents") + var/choice = input(nif.human,"Select a setting to modify:","Soulcatcher NIFSoft") as null|anything in settings_list + if(choice in settings_list) + switch(choice) + + if("Design Inside") + var/new_flavor = input(nif.human, "Type what the prey sees after being 'caught'. This will be \ + printed after an intro ending with: \"Around you, you see...\" to the prey. If you already \ + have prey, this will be printed to them after \"Your surroundings change to...\". Limit 2048 char.", \ + "VR Environment", html_decode(inside_flavor)) as message + new_flavor = sanitize(new_flavor) + inside_flavor = new_flavor + nif.notify("Updating VR environment...") + for(var/brain in brainmobs) + var/mob/living/carbon/brain/caught_soul/CS = brain + to_chat(CS,"Your surroundings change to...\n[inside_flavor]") + save_settings() + return TRUE + + if("Erase Contents") + var/mob/living/carbon/brain/caught_soul/brainpick = input(nif.human,"Select a mind to delete:","Erase Mind") as null|anything in brainmobs + + var/warning = alert(nif.human,"Are you SURE you want to erase \"[brainpick]\"?","Erase Mind","CANCEL","DELETE","CANCEL") + if(warning == "DELETE") + brainmobs -= brainpick + qdel(brainpick) + return TRUE + + //Must just be a flag without special handling then. + else + var/flag = settings_list[choice] + return toggle_setting(flag) + + proc/toggle_setting(var/flag) + setting_flags ^= flag + + var/notify_message + //Special treatment + switch(flag) + if(NIF_SC_BACKUPS) + if(setting_flags & NIF_SC_BACKUPS) + notify_message = "Mind backup system enabled." + else + notify_message = "Mind backup system disabled." + + if(NIF_SC_CATCHING_ME) + if(setting_flags & NIF_SC_CATCHING_ME) + nif.set_flag(NIF_O_SCMYSELF,NIF_FLAGS_OTHER) + else + nif.clear_flag(NIF_O_SCMYSELF,NIF_FLAGS_OTHER) + if(NIF_SC_CATCHING_OTHERS) + if(setting_flags & NIF_SC_CATCHING_OTHERS) + nif.set_flag(NIF_O_SCOTHERS,NIF_FLAGS_OTHER) + else + nif.clear_flag(NIF_O_SCOTHERS,NIF_FLAGS_OTHER) + if(NIF_SC_ALLOW_EARS) + if(setting_flags & NIF_SC_ALLOW_EARS) + for(var/brain in brainmobs) + var/mob/living/carbon/brain/caught_soul/brainmob = brain + brainmob.ext_deaf = FALSE + notify_message = "External audio input enabled." + else + for(var/brain in brainmobs) + var/mob/living/carbon/brain/caught_soul/brainmob = brain + brainmob.ext_deaf = TRUE + notify_message = "External audio input disabled." + if(NIF_SC_ALLOW_EYES) + if(setting_flags & NIF_SC_ALLOW_EYES) + for(var/brain in brainmobs) + var/mob/living/carbon/brain/caught_soul/brainmob = brain + brainmob.ext_blind = FALSE + notify_message = "External video input enabled." + else + for(var/brain in brainmobs) + var/mob/living/carbon/brain/caught_soul/brainmob = brain + brainmob.ext_blind = TRUE + notify_message = "External video input disabled." + + if(notify_message) + notify_into(notify_message) + + return TRUE + + proc/catch_mob(var/mob/living/carbon/human/H) + //Create a new brain mob + var/mob/living/carbon/brain/caught_soul/brainmob = new(nif) + brainmob.nif = nif + brainmob.soulcatcher = src + brainmob.container = src + brainmob.stat = 0 + brainmob.silent = FALSE + dead_mob_list -= brainmob + brainmob.add_language(LANGUAGE_GALCOM) + brainmobs |= brainmob + + //If we caught our owner, special settings. + if(H == nif.human) + brainmob.ext_deaf = FALSE + brainmob.ext_blind = FALSE + brainmob.parent_mob = TRUE + SStranscore.m_backup(H.mind,H) //ONE backup. Won't be called in life due to avoidance of parent_mob backups. + + //Set some basics on the mob. + brainmob.dna = H.dna + brainmob.timeofhostdeath = H.timeofdeath + brainmob.stat = 0 + + //Put the mind and player into the mob + H.mind.transfer_to(brainmob) + brainmob.name = brainmob.mind.name + SStranscore.m_backup(brainmob.mind,0) //It does ONE, so medical will hear about it. + + //Give them a flavortext message + var/message = "Your vision fades in a haze of static, before returning.\n\ + Around you, you see...\n\ + [inside_flavor]" + + to_chat(brainmob,message) + + //Reminder on how this works to host + if(brainmobs.len == 1) //Only spam this on the first one + to_chat(nif.human,"Your occupant's messages/actions can only be seen by you, and you can \ + send messages that only they can hear/see by 'say'ing either '*nsay' or '*nme'.") + + //Announce to host and other minds + notify_into("New mind loaded: [brainmob.name]") + return TRUE + +//////////////// +//The caught mob +/mob/living/carbon/brain/caught_soul + name = "recorded mind" + desc = "A mind recorded and being played on digital hardware." + use_me = 1 + var/ext_deaf = FALSE //Forbidden from 'ear' access on host + var/ext_blind = FALSE //Forbidden from 'eye' access on host + var/parent_mob = FALSE //If we've captured our owner + var/obj/item/device/nif/nif + var/datum/nifsoft/soulcatcher/soulcatcher + +/mob/living/carbon/brain/caught_soul/Destroy() + if(soulcatcher) + soulcatcher.notify_into("Mind unloaded: [name]") + soulcatcher.brainmobs -= src + soulcatcher = null + if(nif) + nif = null + container = null + return ..() + +/mob/living/carbon/brain/caught_soul/Life() + if(!mind) + qdel(src) + return + + . = ..() + + if(!parent_mob && (life_tick % 150 == 0) && soulcatcher.setting_flags & NIF_SC_BACKUPS) + SStranscore.m_backup(mind,0) //Passed 0 means "Don't touch the nif fields on the mind record" + + life_tick++ + + if(!client) return + if(parent_mob) return + //If they're blinded + if(ext_blind) + eye_blind = 5 + client.screen.Remove(global_hud.whitense) + overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + else + eye_blind = 0 + clear_fullscreens() + client.screen.Add(global_hud.whitense) + + //If they're deaf + if(ext_deaf) + ear_deaf = 5 + else + ear_deaf = 0 + +/mob/living/carbon/brain/caught_soul/hear_say() + if(ext_deaf || !client) + return FALSE + ..() + +/mob/living/carbon/brain/caught_soul/show_message() + if(ext_blind || !client) + return FALSE + ..() + +/mob/living/carbon/brain/caught_soul/me_verb_subtle() + set hidden = TRUE + + return FALSE + +/mob/living/carbon/brain/caught_soul/whisper() + set hidden = TRUE + + return FALSE + +/mob/living/carbon/brain/caught_soul/say(var/message) + if(parent_mob) return ..() + if(silent) return FALSE + soulcatcher.say_into(message,src) + +/mob/living/carbon/brain/caught_soul/emote(var/act,var/m_type=1,var/message = null) + if(parent_mob) return ..() + if(silent) return FALSE + if (act == "me") + if(silent) + return + if (src.client) + if (client.prefs.muted & MUTE_IC) + src << "You cannot send IC messages (muted)." + return + if (stat) + return + if(!(message)) + return + return custom_emote(m_type, message) + else + return FALSE + +/mob/living/carbon/brain/caught_soul/custom_emote(var/m_type, var/message) + if(silent) return FALSE + soulcatcher.emote_into(message,src) + +/mob/living/carbon/brain/caught_soul/resist() + set name = "Resist" + set category = "IC" + + to_chat(src,"There's no way out! You're stuck in VR.") + +/////////////////// +//The catching hook +/hook/death/proc/nif_soulcatcher(var/mob/living/carbon/human/H) + if(!istype(H) || !H.mind) return TRUE //Hooks must return TRUE + + if(H.nif && H.nif.flag_check(NIF_O_SCMYSELF,NIF_FLAGS_OTHER)) //They are caught in their own NIF + var/datum/nifsoft/soulcatcher/SC = H.nif.imp_check(NIF_SOULCATCHER) + SC.catch_mob(H,TRUE) + else if(ishuman(H.loc)) //Died in someone + var/mob/living/carbon/human/HP = H.loc + if(HP.nif && HP.nif.flag_check(NIF_O_SCOTHERS,NIF_FLAGS_OTHER)) + var/datum/nifsoft/soulcatcher/SC = HP.nif.imp_check(NIF_SOULCATCHER) + SC.catch_mob(H,FALSE) + + return TRUE \ No newline at end of file diff --git a/code/modules/nifsoft/software/14_commlink.dm b/code/modules/nifsoft/software/14_commlink.dm new file mode 100644 index 00000000000..196af53c74c --- /dev/null +++ b/code/modules/nifsoft/software/14_commlink.dm @@ -0,0 +1,133 @@ +/////////// +// Commlink - Has a bunch of extra stuff due to communicator defines. +/datum/nifsoft/commlink + name = "Commlink" + desc = "An internal communicator for keeping in touch with people." + list_pos = NIF_COMMLINK + cost = 500 + wear = 0 + p_drain = 0.01 + + install() + if((. = ..())) + nif.comm = new(nif,src) + + activate() + if((. = ..())) + nif.set_flag(NIF_O_COMMLINK,NIF_FLAGS_OTHER) + nif.comm.initialize_exonet(nif.human) + nif.comm.ui_interact(nif.human,key_state = commlink_state) + spawn(0) + deactivate() + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_O_COMMLINK,NIF_FLAGS_OTHER) + + stat_text() + return "Show Commlink" + +/datum/nifsoft/commlink/Topic(href, href_list) + if(href_list["open"]) + activate() + +/obj/item/device/communicator/commlink + name = "commlink" + desc = "An internal communicator, basically." + occupation = "\[Commlink\]" + var/obj/item/device/nif/nif + var/datum/nifsoft/commlink/nifsoft + + New(var/newloc,var/soft) + ..() + nif = newloc + nifsoft = soft + register_device(nif.human) + qdel_null(camera) //Not supported on internal one. + + Destroy() + if(nif) + nif.comm = null + nif = null + nifsoft = null + return ..() + +//So that only the owner's chat is relayed to others. +/obj/item/device/communicator/commlink/hear_talk(mob/living/M, text, verb, datum/language/speaking) + if(M != nif.human) return + for(var/obj/item/device/communicator/comm in communicating) + + var/turf/T = get_turf(comm) + if(!T) return + + var/icon_object = src + + var/list/mobs_to_relay + if(istype(comm,/obj/item/device/communicator/commlink)) + var/obj/item/device/communicator/commlink/CL = comm + mobs_to_relay = list(CL.nif.human) + icon_object = CL.nif.big_icon + else + var/list/in_range = get_mobs_and_objs_in_view_fast(T,world.view,0) + mobs_to_relay = in_range["mobs"] + + for(var/mob/mob in mobs_to_relay) + //Can whoever is hearing us understand? + if(!mob.say_understands(M, speaking)) + if(speaking) + text = speaking.scramble(text) + else + text = stars(text) + var/name_used = M.GetVoice() + var/rendered = null + if(speaking) //Language being used + rendered = "\icon[icon_object] [name_used] [speaking.format_message(text, verb)]" + else + rendered = "\icon[icon_object] [name_used] [verb], \"[text]\"" + mob.show_message(rendered, 2) + +//Not supported by the internal one +/obj/item/device/communicator/commlink/show_message(msg, type, alt, alt_type) + return + +//The silent treatment +/obj/item/device/communicator/commlink/request(var/atom/candidate) + if(candidate in voice_requests) + return + var/who = null + if(isobserver(candidate)) + who = candidate.name + else if(istype(candidate, /obj/item/device/communicator)) + var/obj/item/device/communicator/comm = candidate + who = comm.owner + comm.voice_invites |= src + + if(!who) + return + + voice_requests |= candidate + + if(ringer && nif.human) + nif.notify("New commlink call from [who]. (Open)") + +//Similar reason +/obj/item/device/communicator/commlink/request_im(var/atom/candidate, var/origin_address, var/text) + var/who = null + if(isobserver(candidate)) + var/mob/observer/dead/ghost = candidate + who = ghost + im_list += list(list("address" = origin_address, "to_address" = exonet.address, "im" = text)) + else if(istype(candidate, /obj/item/device/communicator)) + var/obj/item/device/communicator/comm = candidate + who = comm.owner + comm.im_contacts |= src + im_list += list(list("address" = origin_address, "to_address" = exonet.address, "im" = text)) + else return + + im_contacts |= candidate + + if(!who) + return + + if(ringer && nif.human) + nif.notify("Commlink message from [who]: \"[text]\" (Open)") diff --git a/code/modules/nifsoft/software/15_misc.dm b/code/modules/nifsoft/software/15_misc.dm new file mode 100644 index 00000000000..91ea1753389 --- /dev/null +++ b/code/modules/nifsoft/software/15_misc.dm @@ -0,0 +1,182 @@ +/datum/nifsoft/apc_recharge + name = "APC Connector" + desc = "A small attachment that allows synthmorphs to recharge themselves from APCs." + list_pos = NIF_APCCHARGE + cost = 1250 + wear = 2 + applies_to = NIF_SYNTHETIC + tick_flags = NIF_ACTIVETICK + var/obj/machinery/power/apc/apc + + activate() + if((. = ..())) + var/mob/living/carbon/human/H = nif.human + nif.set_flag(NIF_O_APCCHARGE,NIF_FLAGS_OTHER) + apc = locate(/obj/machinery/power/apc) in get_step(H,H.dir) + if(!apc) + apc = locate(/obj/machinery/power/apc) in get_step(H,0) + if(!apc) + nif.notify("You must be facing an APC to connect to.",TRUE) + spawn(0) + deactivate() + return FALSE + + H.visible_message("Thin snakelike tendrils grow from [H] and connect to \the [apc].","Thin snakelike tendrils grow from you and connect to \the [apc].") + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_O_APCCHARGE,NIF_FLAGS_OTHER) + apc = null + + life() + if((. = ..())) + var/mob/living/carbon/human/H = nif.human + if(apc && (get_dist(H,apc) <= 1) && H.nutrition < 440) // 440 vs 450, life() happens before we get here so it'll never be EXACTLY 450 + H.nutrition = min(H.nutrition+10, 450) + apc.drain_power(7000/450*10) //This is from the large rechargers. No idea what the math is. + return TRUE + else + nif.notify("APC charging has ended.") + H.visible_message("[H]'s snakelike tendrils whip back into their body from \the [apc].","The APC connector tendrils return to your body.") + deactivate() + return FALSE + +/datum/nifsoft/pressure + name = "Pressure Seals" + desc = "Creates pressure seals around important synthetic components to protect them from vacuum. Almost impossible on organics." + list_pos = NIF_PRESSURE + cost = 1750 + a_drain = 0.5 + wear = 3 + applies_to = NIF_SYNTHETIC + + activate() + if((. = ..())) + nif.set_flag(NIF_O_PRESSURESEAL,NIF_FLAGS_OTHER) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_O_PRESSURESEAL,NIF_FLAGS_OTHER) + +/datum/nifsoft/heatsinks + name = "Heat Sinks" + desc = "Advanced heat sinks for internal heat storage of heat on a synth until able to vent it in atmosphere." + list_pos = NIF_HEATSINK + cost = 1450 + a_drain = 0.25 + wear = 3 + var/used = 0 + tick_flags = NIF_ALWAYSTICK + applies_to = NIF_SYNTHETIC + + activate() + if((. = ..())) + if(used >= 50) + nif.notify("Heat sinks not safe to operate again yet!",TRUE) + spawn(0) + deactivate() + return FALSE + nif.set_flag(NIF_O_HEATSINKS,NIF_FLAGS_OTHER) + + deactivate() + if((. = ..())) + nif.clear_flag(NIF_O_HEATSINKS,NIF_FLAGS_OTHER) + + life() + if((. = ..())) + //Not being used, all clean. + if(!active && !used) + return TRUE + + //Being used, and running out. + else if(active && ++used == 100) + nif.notify("Heat sinks overloaded! Shutting down!",TRUE) + deactivate() + + //Being cleaned, and finishing empty. + else if(!active && --used == 0) + nif.notify("Heat sinks re-chilled.") + +/datum/nifsoft/compliance + name = "Compliance Module" + desc = "A system that allows one to apply 'laws' to sapient life. Extremely illegal, of course." + list_pos = NIF_COMPLIANCE + cost = 8200 + wear = 4 + illegal = TRUE + vended = FALSE + access = 999 //Prevents anyone from buying it without an emag. + var/laws = "Be nice to people!" + + New(var/newloc,var/newlaws) + laws = newlaws //Sanitize before this (the disk does) + ..(newloc) + + activate() + if((. = ..())) + to_chat(nif.human,"You are compelled to follow these rules: \n[laws]") + + install() + if((. = ..())) + to_chat(nif.human,"You feel suddenly compelled to follow these rules: \n[laws]") + + uninstall() + nif.notify("ERROR! Unable to comply!",TRUE) + return FALSE //NOPE. + + stat_text() + return "Show Laws" + +/datum/nifsoft/sizechange + name = "Mass Alteration" + desc = "A system that allows one to change their size, through drastic mass rearrangement. Causes significant wear when installed." + list_pos = NIF_SIZECHANGE + cost = 750 + wear = 6 + + activate() + if((. = ..())) + var/choice = alert(nif.human,"Change which way?","Mass Alteration","Size Up","Cancel", "Size Down") + if(choice == "Cancel") + spawn(0) deactivate() + return FALSE + + if(!nif.use_charge(100)) + nif.notify("Insufficient energy to resize!",TRUE) + spawn(0) deactivate() + return FALSE + + if(choice == "Size Up") + switch(nif.human.size_multiplier) + if(RESIZE_BIG to RESIZE_HUGE) + nif.human.resize(RESIZE_HUGE) + if(RESIZE_NORMAL to RESIZE_BIG) + nif.human.resize(RESIZE_BIG) + if(RESIZE_SMALL to RESIZE_NORMAL) + nif.human.resize(RESIZE_NORMAL) + if((0 - INFINITY) to RESIZE_TINY) + nif.human.resize(RESIZE_SMALL) + + else if(choice == "Size Down") + switch(nif.human.size_multiplier) + if(RESIZE_HUGE to INFINITY) + nif.human.resize(RESIZE_BIG) + if(RESIZE_BIG to RESIZE_HUGE) + nif.human.resize(RESIZE_NORMAL) + if(RESIZE_NORMAL to RESIZE_BIG) + nif.human.resize(RESIZE_SMALL) + if((0 - INFINITY) to RESIZE_NORMAL) + nif.human.resize(RESIZE_TINY) + + nif.human.visible_message("Swirling grey mist envelops [nif.human] as they change size!","Swirling streams of nanites wrap around you as you change size!") + nif.human.update_icons() + + spawn(0) + deactivate() + + deactivate() + if((. = ..())) + return TRUE + + stat_text() + return "Change Size" \ No newline at end of file diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 1390c89b291..e0809e32b59 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -67,10 +67,8 @@ brainmob.client.screen.len = null //clear the hud /obj/item/organ/internal/brain/Destroy() - if(brainmob) - qdel(brainmob) - brainmob = null - ..() + qdel_null(brainmob) + . = ..() /obj/item/organ/internal/brain/proc/transfer_identity(var/mob/living/carbon/H) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 02450c2c5cc..1899b8a3c76 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -55,7 +55,7 @@ var/list/organ_cache = list() species = all_species["Human"] if(holder.dna) dna = holder.dna.Clone() - species = all_species[dna.species] + species = holder.species //VOREStation Edit - For custom species else log_debug("[src] at [loc] spawned without a proper DNA.") var/mob/living/carbon/human/H = holder diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 583b56921dc..638d2354b23 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -98,6 +98,8 @@ while(null in owner.organs) owner.organs -= null + implants.Cut() //VOREStation Add - Remove these too! + return ..() /obj/item/organ/external/emp_act(severity) @@ -448,7 +450,7 @@ This function completely restores a damaged organ to perfect condition. // remove embedded objects and drop them on the floor for(var/obj/implanted_object in implants) - if(!istype(implanted_object,/obj/item/weapon/implant)) // We don't want to remove REAL implants. Just shrapnel etc. + if(!istype(implanted_object,/obj/item/weapon/implant) && !istype(implanted_object,/obj/item/device/nif)) // We don't want to remove REAL implants. Just shrapnel etc. //VOREStation Edit - NIFs pls implanted_object.loc = get_turf(src) implants -= implanted_object @@ -546,7 +548,7 @@ This function completely restores a damaged organ to perfect condition. /obj/item/organ/external/proc/need_process() if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)) return 1 - if((brute_dam || burn_dam) && (robotic < ORGAN_ROBOT)) //Robot limbs don't autoheal and thus don't need to process when damaged + if(brute_dam || burn_dam)//VOREStation Edit - But they do for medichines! ---&& (robotic < ORGAN_ROBOT)) //Robot limbs don't autoheal and thus don't need to process when damaged return 1 if(last_dam != brute_dam + burn_dam) // Process when we are fully healed up. last_dam = brute_dam + burn_dam diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index c64fb36cc4c..fc734e0e813 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -102,7 +102,7 @@ var/global/list/limb_icon_cache = list() if(owner && owner.gender == MALE) gender = "m" - icon_cache_key = "[icon_name]_[species ? species.name : "Human"]" + icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : "Human"]" //VOREStation Edit if(force_icon) mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]") diff --git a/code/modules/organs/robolimbs_vr.dm b/code/modules/organs/robolimbs_vr.dm index 43551f4b208..4bcd25e35cd 100644 --- a/code/modules/organs/robolimbs_vr.dm +++ b/code/modules/organs/robolimbs_vr.dm @@ -31,6 +31,18 @@ /obj/item/weapon/disk/limb/white_kryten company = "White Kryten Cybernetics" +// verkister : Rahwoof Boop +/datum/robolimb/eggnerdltd + company = "Eggnerd Prototyping Ltd." + desc = "This limb has a slight salvaged handicraft vibe to it. The CE-marking on it is definitely not the standardized one, it looks more like a hand-written sharpie monogram." + icon = 'icons/mob/human_races/cyberlimbs/_fluff_vr/rahboop.dmi' + blood_color = "#5e280d" + includes_tail = 1 + unavailable_to_build = 1 + +/obj/item/weapon/disk/limb/eggnerdltd + company = "Eggnerd Prototyping Ltd." + //////////////// General VS-only ones ///////////////// /datum/robolimb/talon //They're buildable by default due to being extremely basic. company = "Talon LLC" diff --git a/code/modules/organs/wound.dm b/code/modules/organs/wound.dm index 060f1f045e0..85925d9158e 100644 --- a/code/modules/organs/wound.dm +++ b/code/modules/organs/wound.dm @@ -44,7 +44,7 @@ var/damage_type = CUT // whether this wound needs a bandage/salve to heal at all // the maximum amount of damage that this wound can have and still autoheal - var/autoheal_cutoff = 15 + var/autoheal_cutoff = 10 @@ -336,7 +336,6 @@ datum/wound/puncture/massive "moderate bruise" = 20, "small bruise" = 10, "tiny bruise" = 5) bleed_threshold = 20 max_bleeding_stage = 2 //only huge bruise and above can bleed. - autoheal_cutoff = 30 damage_type = BRUISE /** BURNS **/ diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index e133f82e6e2..2b10a9017d0 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -20,7 +20,7 @@ var/update_locked = 0 /obj/machinery/power/breakerbox/Destroy() - ..() + . = ..() for(var/datum/nano_module/rcon/R in world) R.FindDevices() diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 27bf4c0ab7c..ebfa5330864 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -108,7 +108,7 @@ var/list/possible_cable_coil_colours = list( if(powernet) cut_cable_from_powernet() // update the powernets cable_list -= src //remove it from global cable list - ..() // then go ahead and delete the cable + return ..() // then go ahead and delete the cable // Ghost examining the cable -> tells him the power /obj/structure/cable/attack_ghost(mob/user) @@ -526,9 +526,9 @@ obj/structure/cable/proc/cableColor(var/colorC) if(!S || S.robotic < ORGAN_ROBOT || S.open == 3) return ..() - var/use_amt = min(src.amount, ceil(S.burn_dam/3), 5) + var/use_amt = min(src.amount, ceil(S.burn_dam/5), 5) if(can_use(use_amt)) - if(S.robo_repair(3*use_amt, BURN, "some damaged wiring", src, user)) + if(S.robo_repair(5*use_amt, BURN, "some damaged wiring", src, user)) src.use(use_amt) else diff --git a/code/modules/power/grid_checker.dm b/code/modules/power/grid_checker.dm index 4d42d4ca3f2..b8a123e02fa 100644 --- a/code/modules/power/grid_checker.dm +++ b/code/modules/power/grid_checker.dm @@ -28,7 +28,7 @@ /obj/machinery/power/grid_checker/Destroy() qdel(wires) wires = null - ..() + return ..() /obj/machinery/power/grid_checker/update_icon() if(power_failing) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 3b32ff6ee92..963d2be9a53 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -162,7 +162,7 @@ active_power_usage = 20 power_channel = LIGHT //Lights are calc'd via area so they dont need to be in the machine list var/on = 0 // 1 if on, 0 if off - var/brightness_range = 10 // luminosity when on, also used in power calculation + var/brightness_range = 10 // luminosity when on, also used in power calculation // VOREStation Edit - Put light range back how it was for now. var/brightness_power = 3 var/brightness_color = null var/status = LIGHT_OK // LIGHT_OK, _EMPTY, _BURNED or _BROKEN @@ -183,7 +183,7 @@ icon_state = "bulb1" base_state = "bulb" fitting = "bulb" - brightness_range = 6 + brightness_range = 6 // VOREStation Edit - Put light range back how it was for now. brightness_power = 2 brightness_color = "#FFF4E5" desc = "A small lighting fixture." @@ -210,7 +210,7 @@ layer = OBJ_LAYER /obj/machinery/light/small/emergency - brightness_range = 6 + brightness_range = 4 brightness_power = 2 brightness_color = "#da0205" @@ -268,7 +268,7 @@ if(A) on = 0 // A.update_lights() - ..() + return ..() /obj/machinery/light/update_icon() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index f900f6fcf45..6a40cf3b8ea 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -396,17 +396,13 @@ /obj/machinery/power/port_gen/pacman/super/UseFuel() //produces a tiny amount of radiation when in use if (prob(2*power_output)) - for (var/mob/living/L in range(src, 5)) - L.apply_effect(1, IRRADIATE) //should amount to ~5 rads per minute at max safe power + radiation_repository.radiate(src, 4) ..() /obj/machinery/power/port_gen/pacman/super/explode() //a nice burst of radiation var/rads = 50 + (sheets + sheet_left)*1.5 - for (var/mob/living/L in range(src, 10)) - //should really fall with the square of the distance, but that makes the rads value drop too fast - //I dunno, maybe physics works different when you live in 2D -- SM radiation also works like this, apparently - L.apply_effect(max(20, round(rads/get_dist(L,src))), IRRADIATE) + radiation_repository.radiate(src, (max(20, rads))) explosion(src.loc, 3, 3, 5, 3) qdel(src) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 13213c2e7e3..76320db4796 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -19,7 +19,7 @@ disconnect_from_network() disconnect_terminal() - ..() + return ..() /////////////////////////////// // General procedures diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index dee15d9f140..53e3dc29c98 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -23,7 +23,7 @@ var/global/list/rad_collectors = list() /obj/machinery/power/rad_collector/Destroy() rad_collectors -= src - ..() + return ..() /obj/machinery/power/rad_collector/process() //so that we don't zero out the meter if the SM is processed first. @@ -31,6 +31,11 @@ var/global/list/rad_collectors = list() last_power_new = 0 + if(P && active) + var/rads = radiation_repository.get_rads_at_turf(get_turf(src)) + if(rads) + receive_pulse(rads * 5) //Maths is hard + if(P) if(P.air_contents.gas["phoron"] == 0) investigate_log("out of fuel.","singulo") diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 39090ceac50..9309c6bd3cc 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -406,15 +406,13 @@ var/toxrange = 10 var/toxdamage = 4 var/radiation = 15 - var/radiationmin = 3 if (src.energy>200) toxdamage = round(((src.energy-150)/50)*4,1) radiation = round(((src.energy-150)/50)*5,1) - radiationmin = round((radiation/5),1)// + radiation_repository.radiate(src, radiation) //Always radiate at max, so a decent dose of radiation is applied for(var/mob/living/M in view(toxrange, src.loc)) if(M.status_flags & GODMODE) continue - M.apply_effect(rand(radiationmin,radiation), IRRADIATE) toxdamage = (toxdamage - (toxdamage*M.getarmor(null, "rad"))) M.apply_effect(toxdamage, TOX) return @@ -448,13 +446,13 @@ /obj/singularity/proc/smwave() for(var/mob/living/M in view(10, src.loc)) if(prob(67)) - M.apply_effect(rand(energy), IRRADIATE) - M << "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat." - M << "Miraculously, it fails to kill you." + to_chat(M, "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.") + to_chat(M, "Miraculously, it fails to kill you.") else M << "You hear an uneartly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat." M << "You don't even have a moment to react as you are reduced to ashes by the intense radiation." M.dust() + radiation_repository.radiate(src, rand(energy)) return /obj/singularity/proc/pulse() diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/magazines.dm similarity index 57% rename from code/modules/projectiles/ammunition/boxes.dm rename to code/modules/projectiles/ammunition/magazines.dm index 73d03697ece..6202e03cde9 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/magazines.dm @@ -1,493 +1,514 @@ -///////// .357 ///////// - -/obj/item/ammo_magazine/a357 - name = "speedloader (.357)" - desc = "A speedloader for .357 revolvers." - icon_state = "38" - caliber = "357" - ammo_type = /obj/item/ammo_casing/a357 - matter = list(DEFAULT_WALL_MATERIAL = 1260) - max_ammo = 6 - multiple_sprites = 1 - -///////// .38 ///////// - -/obj/item/ammo_magazine/c38 - name = "speedloader (.38)" - desc = "A speedloader for .38 revolvers." - icon_state = "38" - caliber = "38" - matter = list(DEFAULT_WALL_MATERIAL = 360) - ammo_type = /obj/item/ammo_casing/c38 - max_ammo = 6 - multiple_sprites = 1 - -/obj/item/ammo_magazine/c38/rubber - name = "speedloader (.38 rubber)" - ammo_type = /obj/item/ammo_casing/c38r - -/obj/item/ammo_magazine/c38/emp - name = "ammunition box (.38 haywire)" - ammo_type = /obj/item/ammo_casing/c38/emp - -///////// .45 ///////// - -/obj/item/ammo_magazine/c45m - name = "pistol magazine (.45)" - icon_state = "45" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c45 - matter = list(DEFAULT_WALL_MATERIAL = 525) //metal costs are very roughly based around 1 .45 casing = 75 metal - caliber = ".45" - max_ammo = 7 - multiple_sprites = 1 - -/obj/item/ammo_magazine/c45m/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/c45m/rubber - name = "magazine (.45 rubber)" - ammo_type = /obj/item/ammo_casing/c45r - -/obj/item/ammo_magazine/c45m/practice - name = "magazine (.45 practice)" - ammo_type = /obj/item/ammo_casing/c45p - -/obj/item/ammo_magazine/c45m/flash - name = "magazine (.45 flash)" - ammo_type = /obj/item/ammo_casing/c45f - -/obj/item/ammo_magazine/c45m/ap - name = "magazine (.45 AP)" - ammo_type = /obj/item/ammo_casing/c45ap - -/obj/item/ammo_magazine/box/emp/c45 - name = "ammunition box (.45 haywire)" - ammo_type = /obj/item/ammo_casing/c45/emp - -/obj/item/ammo_magazine/c45uzi - name = "stick magazine (.45)" - icon_state = "uzi45" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c45 - matter = list(DEFAULT_WALL_MATERIAL = 1200) - caliber = ".45" - max_ammo = 16 - multiple_sprites = 1 - -/obj/item/ammo_magazine/c45uzi/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/tommymag - name = "tommygun magazine (.45)" - icon_state = "tommy-mag" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c45 - matter = list(DEFAULT_WALL_MATERIAL = 1500) - caliber = ".45" - max_ammo = 20 - -/obj/item/ammo_magazine/tommymag/ap - name = "tommygun magazine (.45 AP)" - ammo_type = /obj/item/ammo_casing/c45ap - -/obj/item/ammo_magazine/tommymag/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/tommydrum - name = "tommygun drum magazine (.45)" - icon_state = "tommy-drum" - w_class = ITEMSIZE_NORMAL // Bulky ammo doesn't fit in your pockets! - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c45 - matter = list(DEFAULT_WALL_MATERIAL = 3750) - caliber = ".45" - max_ammo = 50 - -/obj/item/ammo_magazine/tommydrum/ap - name = "tommygun drum magazine (.45 AP)" - ammo_type = /obj/item/ammo_casing/c45ap - -/obj/item/ammo_magazine/tommydrum/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/clip/c45 - name = "ammo clip (.45)" - icon_state = "clip_pistol" - desc = "A stripper clip for reloading .45 rounds into magazines." - caliber = ".45" - ammo_type = /obj/item/ammo_casing/c45 - matter = list(DEFAULT_WALL_MATERIAL = 675) // metal costs very roughly based around one .45 casing = 75 metal - max_ammo = 9 - multiple_sprites = 1 - -/obj/item/ammo_magazine/clip/c45/rubber - name = "ammo clip (.45 rubber)" - ammo_type = /obj/item/ammo_casing/c45r - -/obj/item/ammo_magazine/clip/c45/practice - name = "ammo clip (.45 practice)" - ammo_type = /obj/item/ammo_casing/c45p - -/obj/item/ammo_magazine/clip/c45/flash - name = "ammo clip (.45 flash)" - ammo_type = /obj/item/ammo_casing/c45f - -///////// 9mm ///////// - -/obj/item/ammo_magazine/mc9mm - name = "magazine (9mm)" - icon_state = "9x19p" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - matter = list(DEFAULT_WALL_MATERIAL = 480) - caliber = "9mm" - ammo_type = /obj/item/ammo_casing/c9mm - max_ammo = 8 - multiple_sprites = 1 - -/obj/item/ammo_magazine/mc9mm/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/mc9mm/flash - ammo_type = /obj/item/ammo_casing/c9mmf - -/obj/item/ammo_magazine/mc9mm/rubber - name = "magazine (9mm rubber)" - ammo_type = /obj/item/ammo_casing/c9mmr - -/obj/item/ammo_magazine/mc9mm/practice - name = "magazine (9mm practice)" - ammo_type = /obj/item/ammo_casing/c9mmp - -/obj/item/ammo_magazine/mc9mmt - name = "top mounted magazine (9mm)" - icon_state = "9mmt" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c9mm - matter = list(DEFAULT_WALL_MATERIAL = 1200) - caliber = "9mm" - max_ammo = 20 - multiple_sprites = 1 - -/obj/item/ammo_magazine/mc9mmt/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/mc9mmt/rubber - name = "top mounted magazine (9mm rubber)" - ammo_type = /obj/item/ammo_casing/c9mmr - -/obj/item/ammo_magazine/mc9mmt/flash - name = "top mounted magazine (9mm flash)" - ammo_type = /obj/item/ammo_casing/c9mmf - -/obj/item/ammo_magazine/mc9mmt/practice - name = "top mounted magazine (9mm practice)" - ammo_type = /obj/item/ammo_casing/c9mmp - -/obj/item/ammo_magazine/p90 - name = "high capacity top mounted magazine (9mm armor-piercing)" - icon_state = "p90" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c9mm/ap - matter = list(DEFAULT_WALL_MATERIAL = 3000) - caliber = "9mm" - max_ammo = 50 - multiple_sprites = 1 - -/obj/item/ammo_magazine/p90/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/clip/c9mm - name = "ammo clip (9mm)" - icon_state = "clip_pistol" - desc = "A stripper clip for reloading 9mm rounds into magazines." - caliber = "9mm" - ammo_type = /obj/item/ammo_casing/c9mm - matter = list(DEFAULT_WALL_MATERIAL = 540) // metal costs are very roughly based around one 9mm casing = 60 metal - max_ammo = 9 - multiple_sprites = 1 - -/obj/item/ammo_magazine/clip/c9mm/rubber - name = "ammo clip (.45 rubber)" - ammo_type = /obj/item/ammo_casing/c9mmr - -/obj/item/ammo_magazine/clip/c9mm/practice - name = "ammo clip (.45 practice)" - ammo_type = /obj/item/ammo_casing/c9mmp - -/obj/item/ammo_magazine/clip/c9mm/flash - name = "ammo clip (.45 flash)" - ammo_type = /obj/item/ammo_casing/c9mmf - -/obj/item/ammo_magazine/c9mm // Made by RnD for Prototype SMG and should probably be removed because why does it require DIAMONDS to make bullets? - name = "ammunition Box (9mm)" - icon_state = "9mm" - origin_tech = list(TECH_COMBAT = 2) - matter = list(DEFAULT_WALL_MATERIAL = 1800) - caliber = "9mm" - ammo_type = /obj/item/ammo_casing/c9mm - max_ammo = 30 - -/obj/item/ammo_magazine/c9mm/empty - initial_ammo = 0 - -///////// 5mm ///////// -/* -/obj/item/ammo_magazine/c5mm - name = "magazine (5mm)" - icon_state = "fiveseven" - mag_type = MAGAZINE - ammo_type = /obj/item/ammo_casing/c5mm - matter = list(DEFAULT_WALL_MATERIAL = 1200) - caliber = "5mm" - max_ammo = 20 - //multiple_sprites = 1 - -/obj/item/ammo_magazine/clip/c5mm - name = "ammo clip (5mm)" - icon_state = "clip_pistol" - desc = "A stripper clip for reloading 5mm rounds into magazines." - caliber = "5mm" - ammo_type = /obj/item/ammo_casing/c5mm - matter = list(DEFAULT_WALL_MATERIAL = 540) // metal costs are very roughly based around one 5mm casing = 60 metal - max_ammo = 9 - multiple_sprites = 1 -*/ -///////// 10mm ///////// - -/obj/item/ammo_magazine/a10mm - name = "magazine (10mm)" - icon_state = "10mm" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - caliber = "10mm" - matter = list(DEFAULT_WALL_MATERIAL = 1500) - ammo_type = /obj/item/ammo_casing/a10mm - max_ammo = 20 - multiple_sprites = 1 - -/obj/item/ammo_magazine/a10mm/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/clip/a10mm - name = "ammo clip (10mm)" - icon_state = "clip_pistol" - desc = "A stripper clip for reloading 5mm rounds into magazines." - caliber = "10mm" - ammo_type = /obj/item/ammo_casing/a10mm - matter = list(DEFAULT_WALL_MATERIAL = 675) // metal costs are very roughly based around one 10mm casing = 75 metal - max_ammo = 9 - multiple_sprites = 1 - -/obj/item/ammo_magazine/box/emp/a10mm - name = "ammunition box (10mm haywire)" - ammo_type = /obj/item/ammo_casing/a10mm/emp - -///////// 5.56mm ///////// - -/obj/item/ammo_magazine/c556 - name = "magazine (5.56mm)" - icon_state = "c5.56" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - caliber = "a556" - matter = list(DEFAULT_WALL_MATERIAL = 1800) - ammo_type = /obj/item/ammo_casing/a556 - max_ammo = 20 - multiple_sprites = 1 - -/obj/item/ammo_magazine/c556/ext - name = "extended magazine (5.56mm)" - matter = list(DEFAULT_WALL_MATERIAL = 2700) - max_ammo = 30 - -/obj/item/ammo_magazine/c556/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/c556/ext/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/c556/practice - name = "magazine (5.56mm practice)" - ammo_type = /obj/item/ammo_casing/a556p - -/obj/item/ammo_magazine/c556/practice/ext - name = "extended magazine (5.56mm practice)" - max_ammo = 30 - -/obj/item/ammo_magazine/c556/ap - name = "magazine (5.56mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a556/ap - -/obj/item/ammo_magazine/c556/ap/ext - name = "extended magazine (5.56mm armor-piercing)" - max_ammo = 30 - -/obj/item/ammo_magazine/clip/a556 - name = "ammo clip (5.56mm)" - icon_state = "clip_rifle" - caliber = "a556" - ammo_type = /obj/item/ammo_casing/a556 - matter = list(DEFAULT_WALL_MATERIAL = 450) // metal costs are very roughly based around one 10mm casing = 180 metal - max_ammo = 5 - multiple_sprites = 1 - -/obj/item/ammo_magazine/clip/a556/ap - name = "rifle clip (5.56mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a556/ap - -/obj/item/ammo_magazine/clip/a556/practice - name = "rifle clip (5.56mm practice)" - ammo_type = /obj/item/ammo_casing/a556 - -/obj/item/ammo_magazine/a556 - name = "magazine box (5.56mm)" - icon_state = "a556" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - caliber = "a556" - matter = list(DEFAULT_WALL_MATERIAL = 10000) - ammo_type = /obj/item/ammo_casing/a556 - w_class = ITEMSIZE_NORMAL // This should NOT fit in your pocket!! - max_ammo = 50 - multiple_sprites = 1 - -/obj/item/ammo_magazine/a556/ap - name = "magazine box (5.56mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a556/ap - -/obj/item/ammo_magazine/a556/empty - initial_ammo = 0 - -///////// .50 AE ///////// - -/obj/item/ammo_magazine/a50 - name = "magazine (.50 AE)" - icon_state = "50ae" - origin_tech = list(TECH_COMBAT = 2) - mag_type = MAGAZINE - caliber = ".50" - matter = list(DEFAULT_WALL_MATERIAL = 1260) - ammo_type = /obj/item/ammo_casing/a50 - max_ammo = 7 - multiple_sprites = 1 - -/obj/item/ammo_magazine/a50/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/clip/a50 - name = "ammo clip (.50 AE)" - icon_state = "clip_pistol" - desc = "A stripper clip for reloading .50 Action Express rounds into magazines." - caliber = ".50" - ammo_type = /obj/item/ammo_casing/a50 - matter = list(DEFAULT_WALL_MATERIAL = 1620) // metal costs are very roughly based around one .50 casing = 180 metal - max_ammo = 9 - multiple_sprites = 1 - -///////// 7.62mm ///////// - -/obj/item/ammo_magazine/c762 - name = "magazine (7.62mm)" - icon_state = "c7.62" - mag_type = MAGAZINE - caliber = "a762" - matter = list(DEFAULT_WALL_MATERIAL = 2000) - ammo_type = /obj/item/ammo_casing/a762 - max_ammo = 20 // VOREStation Edit - This one is supposed to be bigger than the small one. - multiple_sprites = 1 - -/obj/item/ammo_magazine/c762/ap - name = "magazine (7.62mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a762/ap - -/obj/item/ammo_magazine/c762/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/s762 // 's' for small! - name = "magazine (7.62mm)" - icon_state = "SVD" - mag_type = MAGAZINE - caliber = "a762" - matter = list(DEFAULT_WALL_MATERIAL = 1000) - ammo_type = /obj/item/ammo_casing/a762 - max_ammo = 10 - multiple_sprites = 1 - -/obj/item/ammo_magazine/s762/empty - initial_ammo = 0 - -/obj/item/ammo_magazine/s762/ap - name = "magazine (7.62mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a762/ap - -/obj/item/ammo_magazine/clip/a762 - name = "ammo clip (7.62mm)" - icon_state = "clip_rifle" - caliber = "a762" - ammo_type = /obj/item/ammo_casing/a762 - matter = list(DEFAULT_WALL_MATERIAL = 1000) // metal costs are very roughly based around one 7.62 casing = 200 metal - max_ammo = 5 - multiple_sprites = 1 - -/obj/item/ammo_magazine/clip/a762/ap - name = "rifle clip (7.62mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/a762/ap - -/obj/item/ammo_magazine/clip/a762/practice - name = "rifle clip (7.62mm practice)" - ammo_type = /obj/item/ammo_casing/a762p - -///////// 12g ///////// - -/obj/item/ammo_magazine/g12 - name = "magazine (12 gauge)" - icon_state = "12g" - mag_type = MAGAZINE - caliber = "shotgun" - matter = list(DEFAULT_WALL_MATERIAL = 2200) - ammo_type = /obj/item/ammo_casing/shotgun - max_ammo = 24 - multiple_sprites = 1 - -/obj/item/ammo_magazine/g12/beanbag - name = "magazine (12 gauge beanbag)" - ammo_type = /obj/item/ammo_casing/shotgun/beanbag - -/obj/item/ammo_magazine/g12/pellet - name = "magazine (12 gauge pellet)" - ammo_type = /obj/item/ammo_casing/shotgun/pellet - -/obj/item/ammo_magazine/g12/flash - name = "magazine (12 gauge flash)" - ammo_type = /obj/item/ammo_casing/shotgun/flash - -/obj/item/ammo_magazine/g12/empty - initial_ammo = 0 - -///////// .75 Gyrojet ///////// - -/obj/item/ammo_magazine/a75 - name = "ammo magazine (.75 Gyrojet)" - icon_state = "75" - mag_type = MAGAZINE - caliber = "75" - ammo_type = /obj/item/ammo_casing/a75 - multiple_sprites = 1 - max_ammo = 4 - -/obj/item/ammo_magazine/a75/empty - initial_ammo = 0 - -///////// Misc. ///////// - -/obj/item/ammo_magazine/caps - name = "speedloader (caps)" - icon_state = "T38" - caliber = "caps" - color = "#FF0000" - ammo_type = /obj/item/ammo_casing/cap - matter = list(DEFAULT_WALL_MATERIAL = 600) - max_ammo = 7 +/************************************************************************/ +/* +# An explaination of the naming format for guns and ammo: +# +# a = Ammo, as in individual rounds of ammunition. +# b = Box, intended to have ammo taken out one at a time by hand. +# c = Clips, intended to reload magazines or guns quickly. +# m = Magazine, intended to hold rounds of ammo. +# s = Speedloaders, intended to reload guns quickly. +# +# Use this format, followed by the caliber. For example, a shotgun's caliber +# variable is "12g" as a result. Ergo, a shotgun round's path would have "a12g", +# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion +# for developers and in-game admins spawning these items, stick to this format. +# Likewise, when creating new rounds, the caliber variable should match whatever +# the name says. +# +# This comment is copied in rounds.dm as well. +# +# Also, if a magazine is only meant for a specific gun, include the name +# of the specific gun in the path. Example: m45uzi is only for the Uzi. +*/ +/************************************************************************/ + + + +///////// .357 ///////// + +/obj/item/ammo_magazine/s357 + name = "speedloader (.357)" + desc = "A speedloader for .357 revolvers." + icon_state = "38" + caliber = "357" + ammo_type = /obj/item/ammo_casing/a357 + matter = list(DEFAULT_WALL_MATERIAL = 1260) + max_ammo = 6 + multiple_sprites = 1 + +///////// .38 ///////// + +/obj/item/ammo_magazine/s38 + name = "speedloader (.38)" + desc = "A speedloader for .38 revolvers." + icon_state = "38" + caliber = ".38" + matter = list(DEFAULT_WALL_MATERIAL = 360) + ammo_type = /obj/item/ammo_casing/a38 + max_ammo = 6 + multiple_sprites = 1 + +/obj/item/ammo_magazine/s38/rubber + name = "speedloader (.38 rubber)" + ammo_type = /obj/item/ammo_casing/a38r + +/obj/item/ammo_magazine/s38/emp + name = "speedloader (.38 haywire)" + ammo_type = /obj/item/ammo_casing/a38/emp + +///////// .45 ///////// + +/obj/item/ammo_magazine/m45 + name = "pistol magazine (.45)" + icon_state = "45" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a45 + matter = list(DEFAULT_WALL_MATERIAL = 525) //metal costs are very roughly based around 1 .45 casing = 75 metal + caliber = ".45" + max_ammo = 7 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m45/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m45/rubber + name = "magazine (.45 rubber)" + ammo_type = /obj/item/ammo_casing/a45r + +/obj/item/ammo_magazine/m45/practice + name = "magazine (.45 practice)" + ammo_type = /obj/item/ammo_casing/a45p + +/obj/item/ammo_magazine/m45/flash + name = "magazine (.45 flash)" + ammo_type = /obj/item/ammo_casing/a45f + +/obj/item/ammo_magazine/m45/ap + name = "magazine (.45 AP)" + ammo_type = /obj/item/ammo_casing/a45ap + +/obj/item/ammo_magazine/box/emp/b45 + name = "ammunition box (.45 haywire)" + ammo_type = /obj/item/ammo_casing/a45/emp + +/obj/item/ammo_magazine/m45uzi + name = "stick magazine (.45)" + icon_state = "uzi45" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a45 + matter = list(DEFAULT_WALL_MATERIAL = 1200) + caliber = ".45" + max_ammo = 16 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m45uzi/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m45tommy + name = "tommygun magazine (.45)" + icon_state = "tommy-mag" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a45 + matter = list(DEFAULT_WALL_MATERIAL = 1500) + caliber = ".45" + max_ammo = 20 + +/obj/item/ammo_magazine/m45tommy/ap + name = "tommygun magazine (.45 AP)" + ammo_type = /obj/item/ammo_casing/a45ap + +/obj/item/ammo_magazine/m45tommy/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m45tommydrum + name = "tommygun drum magazine (.45)" + icon_state = "tommy-drum" + w_class = ITEMSIZE_NORMAL // Bulky ammo doesn't fit in your pockets! + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a45 + matter = list(DEFAULT_WALL_MATERIAL = 3750) + caliber = ".45" + max_ammo = 50 + +/obj/item/ammo_magazine/m45tommydrum/ap + name = "tommygun drum magazine (.45 AP)" + ammo_type = /obj/item/ammo_casing/a45ap + +/obj/item/ammo_magazine/m45tommydrum/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/clip/c45 + name = "ammo clip (.45)" + icon_state = "clip_pistol" + desc = "A stripper clip for reloading .45 rounds into magazines." + caliber = ".45" + ammo_type = /obj/item/ammo_casing/a45 + matter = list(DEFAULT_WALL_MATERIAL = 675) // metal costs very roughly based around one .45 casing = 75 metal + max_ammo = 9 + multiple_sprites = 1 + +/obj/item/ammo_magazine/clip/c45/rubber + name = "ammo clip (.45 rubber)" + ammo_type = /obj/item/ammo_casing/a45r + +/obj/item/ammo_magazine/clip/c45/practice + name = "ammo clip (.45 practice)" + ammo_type = /obj/item/ammo_casing/a45p + +/obj/item/ammo_magazine/clip/c45/flash + name = "ammo clip (.45 flash)" + ammo_type = /obj/item/ammo_casing/a45f + +///////// 9mm ///////// + +/obj/item/ammo_magazine/m9mm + name = "magazine (9mm)" + icon_state = "9x19p" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + matter = list(DEFAULT_WALL_MATERIAL = 480) + caliber = "9mm" + ammo_type = /obj/item/ammo_casing/a9mm + max_ammo = 8 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m9mm/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m9mm/flash + ammo_type = /obj/item/ammo_casing/a9mmf + +/obj/item/ammo_magazine/m9mm/rubber + name = "magazine (9mm rubber)" + ammo_type = /obj/item/ammo_casing/a9mmr + +/obj/item/ammo_magazine/m9mm/practice + name = "magazine (9mm practice)" + ammo_type = /obj/item/ammo_casing/a9mmp + +/obj/item/ammo_magazine/m9mmt + name = "top mounted magazine (9mm)" + icon_state = "9mmt" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a9mm + matter = list(DEFAULT_WALL_MATERIAL = 1200) + caliber = "9mm" + max_ammo = 20 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m9mmt/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m9mmt/rubber + name = "top mounted magazine (9mm rubber)" + ammo_type = /obj/item/ammo_casing/a9mmr + +/obj/item/ammo_magazine/m9mmt/flash + name = "top mounted magazine (9mm flash)" + ammo_type = /obj/item/ammo_casing/a9mmf + +/obj/item/ammo_magazine/m9mmt/practice + name = "top mounted magazine (9mm practice)" + ammo_type = /obj/item/ammo_casing/a9mmp + +/obj/item/ammo_magazine/m9mmp90 + name = "high capacity top mounted magazine (9mm armor-piercing)" + icon_state = "p90" + mag_type = MAGAZINE + ammo_type = /obj/item/ammo_casing/a9mm/ap + matter = list(DEFAULT_WALL_MATERIAL = 3000) + caliber = "9mm" + max_ammo = 50 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m9mmp90/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/clip/c9mm + name = "ammo clip (9mm)" + icon_state = "clip_pistol" + desc = "A stripper clip for reloading 9mm rounds into magazines." + caliber = "9mm" + ammo_type = /obj/item/ammo_casing/a9mm + matter = list(DEFAULT_WALL_MATERIAL = 540) // metal costs are very roughly based around one 9mm casing = 60 metal + max_ammo = 9 + multiple_sprites = 1 + +/obj/item/ammo_magazine/clip/c9mm/rubber + name = "ammo clip (.45 rubber)" + ammo_type = /obj/item/ammo_casing/a9mmr + +/obj/item/ammo_magazine/clip/c9mm/practice + name = "ammo clip (.45 practice)" + ammo_type = /obj/item/ammo_casing/a9mmp + +/obj/item/ammo_magazine/clip/c9mm/flash + name = "ammo clip (.45 flash)" + ammo_type = /obj/item/ammo_casing/a9mmf + +/obj/item/ammo_magazine/box/c9mm // Made by RnD for Prototype SMG and should probably be removed because why does it require DIAMONDS to make bullets? + name = "ammunition Box (9mm)" + icon_state = "9mm" + origin_tech = list(TECH_COMBAT = 2) + matter = list(DEFAULT_WALL_MATERIAL = 1800) + caliber = "9mm" + ammo_type = /obj/item/ammo_casing/a9mm + max_ammo = 30 + +/obj/item/ammo_magazine/box/c9mm/empty + initial_ammo = 0 + +///////// 10mm ///////// + +/obj/item/ammo_magazine/m10mm + name = "magazine (10mm)" + icon_state = "10mm" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + caliber = "10mm" + matter = list(DEFAULT_WALL_MATERIAL = 1500) + ammo_type = /obj/item/ammo_casing/a10mm + max_ammo = 20 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m10mm/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/clip/c10mm + name = "ammo clip (10mm)" + icon_state = "clip_pistol" + desc = "A stripper clip for reloading 5mm rounds into magazines." + caliber = "10mm" + ammo_type = /obj/item/ammo_casing/a10mm + matter = list(DEFAULT_WALL_MATERIAL = 675) // metal costs are very roughly based around one 10mm casing = 75 metal + max_ammo = 9 + multiple_sprites = 1 + +/obj/item/ammo_magazine/box/emp/b10 + name = "ammunition box (10mm haywire)" + ammo_type = /obj/item/ammo_casing/a10mm/emp + +///////// 5.56mm ///////// + +/obj/item/ammo_magazine/m556 + name = "magazine (5.56mm)" + icon_state = "m556" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + caliber = "5.56mm" + matter = list(DEFAULT_WALL_MATERIAL = 1800) + ammo_type = /obj/item/ammo_casing/a556 + max_ammo = 20 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m556/ext + name = "extended magazine (5.56mm)" + matter = list(DEFAULT_WALL_MATERIAL = 2700) + max_ammo = 30 + +/obj/item/ammo_magazine/m556/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m556/ext/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m556/practice + name = "magazine (5.56mm practice)" + ammo_type = /obj/item/ammo_casing/a556p + +/obj/item/ammo_magazine/m556/practice/ext + name = "extended magazine (5.56mm practice)" + max_ammo = 30 + +/obj/item/ammo_magazine/m556/ap + name = "magazine (5.56mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a556/ap + +/obj/item/ammo_magazine/m556/ap/ext + name = "extended magazine (5.56mm armor-piercing)" + max_ammo = 30 + +/obj/item/ammo_magazine/m556/small + name = "reduced magazine (5.56mm)" + icon_state = "m556-small" + matter = list(DEFAULT_WALL_MATERIAL = 900) + max_ammo = 10 + +/obj/item/ammo_magazine/m556/small/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m556/small/practice + name = "magazine (5.56mm practice)" + ammo_type = /obj/item/ammo_casing/a556p + +/obj/item/ammo_magazine/m556/small/ap + name = "magazine (5.56mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a556/ap + +/obj/item/ammo_magazine/clip/c556 + name = "ammo clip (5.56mm)" + icon_state = "clip_rifle" + caliber = "5.56mm" + ammo_type = /obj/item/ammo_casing/a556 + matter = list(DEFAULT_WALL_MATERIAL = 450) // metal costs are very roughly based around one 10mm casing = 180 metal + max_ammo = 5 + multiple_sprites = 1 + +/obj/item/ammo_magazine/clip/c556/ap + name = "rifle clip (5.56mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a556/ap + +/obj/item/ammo_magazine/clip/c556/practice + name = "rifle clip (5.56mm practice)" + ammo_type = /obj/item/ammo_casing/a556 + +/obj/item/ammo_magazine/m556saw + name = "magazine box (5.56mm)" + icon_state = "a556" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + caliber = "5.56mm" + matter = list(DEFAULT_WALL_MATERIAL = 10000) + ammo_type = /obj/item/ammo_casing/a556 + w_class = ITEMSIZE_NORMAL // This should NOT fit in your pocket!! + max_ammo = 50 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m556saw/ap + name = "magazine box (5.56mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a556/ap + +/obj/item/ammo_magazine/m556saw/empty + initial_ammo = 0 + +///////// .50 AE ///////// + +/obj/item/ammo_magazine/m50 + name = "magazine (.50 AE)" + icon_state = "50ae" + origin_tech = list(TECH_COMBAT = 2) + mag_type = MAGAZINE + caliber = ".50AE" + matter = list(DEFAULT_WALL_MATERIAL = 1260) + ammo_type = /obj/item/ammo_casing/a50ae + max_ammo = 7 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m50/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/clip/c50 + name = "ammo clip (.50 AE)" + icon_state = "clip_pistol" + desc = "A stripper clip for reloading .50 Action Express rounds into magazines." + caliber = ".50AE" + ammo_type = /obj/item/ammo_casing/a50ae + matter = list(DEFAULT_WALL_MATERIAL = 1620) // metal costs are very roughly based around one .50 casing = 180 metal + max_ammo = 9 + multiple_sprites = 1 + +///////// 7.62mm ///////// + +/obj/item/ammo_magazine/m762 + name = "magazine (7.62mm)" + icon_state = "m762-small" + mag_type = MAGAZINE + caliber = "7.62mm" + matter = list(DEFAULT_WALL_MATERIAL = 2000) + ammo_type = /obj/item/ammo_casing/a762 + max_ammo = 10 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m762/ap + name = "magazine (7.62mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a762/ap + +/obj/item/ammo_magazine/m762/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/m762m // Intentionally not a subtype of m762 because it's supposed to be incompatible with the Z8 Bulldog rifle. + name = "magazine (7.62mm)" + icon_state = "m762" + mag_type = MAGAZINE + caliber = "7.62mm" + matter = list(DEFAULT_WALL_MATERIAL = 4000) + ammo_type = /obj/item/ammo_casing/a762 + max_ammo = 20 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m762m/ap + name = "magazine (7.62mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a762/ap + +/obj/item/ammo_magazine/m762m/empty + initial_ammo = 0 + +/obj/item/ammo_magazine/clip/c762 + name = "ammo clip (7.62mm)" + icon_state = "clip_rifle" + caliber = "7.62mm" + ammo_type = /obj/item/ammo_casing/a762 + matter = list(DEFAULT_WALL_MATERIAL = 1000) // metal costs are very roughly based around one 7.62 casing = 200 metal + max_ammo = 5 + multiple_sprites = 1 + +/obj/item/ammo_magazine/clip/c762/ap + name = "rifle clip (7.62mm armor-piercing)" + ammo_type = /obj/item/ammo_casing/a762/ap + +/obj/item/ammo_magazine/clip/c762/practice + name = "rifle clip (7.62mm practice)" + ammo_type = /obj/item/ammo_casing/a762p + +///////// 12g ///////// + +/obj/item/ammo_magazine/m12gdrum + name = "magazine (12 gauge)" + icon_state = "12g" + mag_type = MAGAZINE + caliber = "12g" + matter = list(DEFAULT_WALL_MATERIAL = 2200) + ammo_type = /obj/item/ammo_casing/a12g + max_ammo = 24 + multiple_sprites = 1 + +/obj/item/ammo_magazine/m12gdrum/beanbag + name = "magazine (12 gauge beanbag)" + ammo_type = /obj/item/ammo_casing/a12g/beanbag + +/obj/item/ammo_magazine/m12gdrum/pellet + name = "magazine (12 gauge pellet)" + ammo_type = /obj/item/ammo_casing/a12g/pellet + +/obj/item/ammo_magazine/m12gdrum/flash + name = "magazine (12 gauge flash)" + ammo_type = /obj/item/ammo_casing/a12g/flash + +/obj/item/ammo_magazine/m12gdrum/empty + initial_ammo = 0 + +///////// .75 Gyrojet ///////// + +/obj/item/ammo_magazine/m75 + name = "ammo magazine (.75 Gyrojet)" + icon_state = "75" + mag_type = MAGAZINE + caliber = ".75" + ammo_type = /obj/item/ammo_casing/a75 + multiple_sprites = 1 + max_ammo = 4 + +/obj/item/ammo_magazine/m75/empty + initial_ammo = 0 + +///////// Misc. ///////// + +/obj/item/ammo_magazine/caps + name = "speedloader (caps)" + icon_state = "T38" + caliber = "caps" + color = "#FF0000" + ammo_type = /obj/item/ammo_casing/cap + matter = list(DEFAULT_WALL_MATERIAL = 600) + max_ammo = 7 multiple_sprites = 1 \ No newline at end of file diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/rounds.dm similarity index 76% rename from code/modules/projectiles/ammunition/bullets.dm rename to code/modules/projectiles/ammunition/rounds.dm index dfbd721952d..3230e6ed622 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/rounds.dm @@ -1,291 +1,323 @@ -/obj/item/ammo_casing/a357 - desc = "A .357 bullet casing." - caliber = "357" - projectile_type = /obj/item/projectile/bullet/pistol/strong - -/obj/item/ammo_casing/a50 - desc = "A .50AE bullet casing." - caliber = ".50" - projectile_type = /obj/item/projectile/bullet/pistol/strong - -/obj/item/ammo_casing/a75 - desc = "A .75 gyrojet rocket sheathe." - caliber = "75" - projectile_type = /obj/item/projectile/bullet/gyro - -/obj/item/ammo_casing/c38 - desc = "A .38 bullet casing." - caliber = "38" - projectile_type = /obj/item/projectile/bullet/pistol - -/obj/item/ammo_casing/c38r - desc = "A .38 rubber bullet casing." - caliber = "38" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/rubber - -/obj/item/ammo_casing/c38/emp - name = ".38 haywire round" - desc = "A .38 bullet casing fitted with a single-use ion pulse generator." - icon_state = "empcasing" - projectile_type = /obj/item/projectile/ion/small - matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) - -/* - * 9mm - */ - -/obj/item/ammo_casing/c9mm - desc = "A 9mm bullet casing." - caliber = "9mm" - projectile_type = /obj/item/projectile/bullet/pistol - -/obj/item/ammo_casing/c9mm/ap - desc = "A 9mm armor-piercing bullet casing." - projectile_type = /obj/item/projectile/bullet/pistol/ap - -/obj/item/ammo_casing/c9mmf - desc = "A 9mm flash shell casing." - caliber = "9mm" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/energy/flash - -/obj/item/ammo_casing/c9mmr - desc = "A 9mm rubber bullet casing." - caliber = "9mm" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/rubber - -/obj/item/ammo_casing/c9mmp - desc = "A 9mm practice bullet casing." - caliber = "9mm" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/practice - -/* -/obj/item/ammo_casing/c5mm - desc = "A 5mm bullet casing." - caliber = "5mm" - projectile_type = /obj/item/projectile/bullet/pistol/ap -*/ - -/* - * 45 ammo - */ - -/obj/item/ammo_casing/c45 - desc = "A .45 bullet casing." - caliber = ".45" - projectile_type = /obj/item/projectile/bullet/pistol/medium - -/obj/item/ammo_casing/c45ap - desc = "A .45 Armor-Piercing bullet casing." - caliber = ".45" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/medium/ap - -/obj/item/ammo_casing/c45p - desc = "A .45 practice bullet casing." - caliber = ".45" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/practice - -/obj/item/ammo_casing/c45r - desc = "A .45 rubber bullet casing." - caliber = ".45" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/bullet/pistol/rubber - -/obj/item/ammo_casing/c45f - desc = "A .45 flash shell casing." - caliber = ".45" - icon_state = "r-casing" - projectile_type = /obj/item/projectile/energy/flash - -/obj/item/ammo_casing/c45/emp - name = ".45 haywire round" - desc = "A .45 bullet casing fitted with a single-use ion pulse generator." - projectile_type = /obj/item/projectile/ion/small - icon_state = "empcasing" - matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) - -/obj/item/ammo_casing/c45/hp - desc = "A .45 hollow-point bullet casing." - projectile_type = /obj/item/projectile/bullet/pistol/medium/hollow - - -/* - * 10mm - */ - -/obj/item/ammo_casing/a10mm - desc = "A 10mm bullet casing." - caliber = "10mm" - projectile_type = /obj/item/projectile/bullet/pistol/medium - -/obj/item/ammo_casing/a10mm/emp - name = "10mm haywire round" - desc = "A 10mm bullet casing fitted with a single-use ion pulse generator." - projectile_type = /obj/item/projectile/ion/small - icon_state = "empcasing" - matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) - -/* - * Shotguns - */ - -/obj/item/ammo_casing/shotgun - name = "shotgun slug" - desc = "A 12 gauge slug." - icon_state = "slshell" - caliber = "shotgun" - projectile_type = /obj/item/projectile/bullet/shotgun - matter = list(DEFAULT_WALL_MATERIAL = 360) - -/obj/item/ammo_casing/shotgun/pellet - name = "shotgun shell" - desc = "A 12 gauge shell." - icon_state = "gshell" - projectile_type = /obj/item/projectile/bullet/pellet/shotgun - matter = list(DEFAULT_WALL_MATERIAL = 360) - -/obj/item/ammo_casing/shotgun/blank - name = "shotgun shell" - desc = "A blank shell." - icon_state = "blshell" - projectile_type = /obj/item/projectile/bullet/blank - matter = list(DEFAULT_WALL_MATERIAL = 90) - -/obj/item/ammo_casing/shotgun/practice - name = "shotgun shell" - desc = "A practice shell." - icon_state = "pshell" - projectile_type = /obj/item/projectile/bullet/shotgun/practice - matter = list("metal" = 90) - -/obj/item/ammo_casing/shotgun/beanbag - name = "beanbag shell" - desc = "A beanbag shell." - icon_state = "bshell" - projectile_type = /obj/item/projectile/bullet/shotgun/beanbag - matter = list(DEFAULT_WALL_MATERIAL = 180) - -//Can stun in one hit if aimed at the head, but -//is blocked by clothing that stops tasers and is vulnerable to EMP -/obj/item/ammo_casing/shotgun/stunshell - name = "stun shell" - desc = "A 12 gauge taser cartridge." - icon_state = "stunshell" - projectile_type = /obj/item/projectile/energy/electrode/stunshot - matter = list(DEFAULT_WALL_MATERIAL = 360, "glass" = 720) - -/obj/item/ammo_casing/shotgun/stunshell/emp_act(severity) - if(prob(100/severity)) BB = null - update_icon() - -//Does not stun, only blinds, but has area of effect. -/obj/item/ammo_casing/shotgun/flash - name = "flash shell" - desc = "A chemical shell used to signal distress or provide illumination." - icon_state = "fshell" - projectile_type = /obj/item/projectile/energy/flash/flare - matter = list(DEFAULT_WALL_MATERIAL = 90, "glass" = 90) - -/obj/item/ammo_casing/shotgun/emp - name = "ion shell" - desc = "An advanced shotgun round that creates a small EMP when it strikes a target." - icon_state = "empshell" - projectile_type = /obj/item/projectile/ion -// projectile_type = /obj/item/projectile/bullet/shotgun/ion - matter = list(DEFAULT_WALL_MATERIAL = 360, "uranium" = 240) - -/* - * 762mm - */ - -/obj/item/ammo_casing/a762 - desc = "A 7.62mm bullet casing." - caliber = "a762" - icon_state = "rifle-casing" - projectile_type = /obj/item/projectile/bullet/rifle/a762 - -/obj/item/ammo_casing/a762/ap - desc = "A 7.62mm armor-piercing bullet casing." - projectile_type = /obj/item/projectile/bullet/rifle/a762/ap - -/obj/item/ammo_casing/a762p - desc = "A 7.62mm practice bullet casing." - caliber = "a762" - icon_state = "rifle-casing" // Need to make an icon for these - projectile_type = /obj/item/projectile/bullet/rifle/practice - -/obj/item/ammo_casing/a762/blank - desc = "A blank 7.62mm bullet casing." - projectile_type = /obj/item/projectile/bullet/blank - matter = list(DEFAULT_WALL_MATERIAL = 90) - -/obj/item/ammo_casing/a762/hp - desc = "A 7.62mm hollow-point bullet casing." - projectile_type = /obj/item/projectile/bullet/rifle/a762/hollow - -//145mm - -/obj/item/ammo_casing/a145 - desc = "A 14.5mm shell." - icon_state = "lcasing" - caliber = "14.5mm" - projectile_type = /obj/item/projectile/bullet/rifle/a145 - matter = list(DEFAULT_WALL_MATERIAL = 1250) - -/* - * 556mm - */ - -/obj/item/ammo_casing/a556 - desc = "A 5.56mm bullet casing." - caliber = "a556" - icon_state = "rifle-casing" - projectile_type = /obj/item/projectile/bullet/rifle/a556 - -/obj/item/ammo_casing/a556/ap - desc = "A 5.56mm armor-piercing bullet casing." - projectile_type = /obj/item/projectile/bullet/rifle/a556/ap - -/obj/item/ammo_casing/a556p - desc = "A 5.56mm practice bullet casing." - caliber = "a556" - icon_state = "rifle-casing" // Need to make an icon for these - projectile_type = /obj/item/projectile/bullet/rifle/practice - -/obj/item/ammo_casing/a556/blank - desc = "A blank 5.56mm bullet casing." - projectile_type = /obj/item/projectile/bullet/blank - matter = list(DEFAULT_WALL_MATERIAL = 90) - -/obj/item/ammo_casing/a556/hp - desc = "A 5.56mm hollow-point bullet casing." - projectile_type = /obj/item/projectile/bullet/rifle/a556/hollow - -/* - * Misc - */ - -/obj/item/ammo_casing/rocket - name = "rocket shell" - desc = "A high explosive designed to be fired from a launcher." - icon_state = "rocketshell" - projectile_type = /obj/item/missile - caliber = "rocket" - -/obj/item/ammo_casing/cap - name = "cap" - desc = "A cap for children toys." - caliber = "caps" - icon_state = "r-casing" - color = "#FF0000" - projectile_type = /obj/item/projectile/bullet/pistol/cap - -/obj/item/ammo_casing/spent // For simple hostile mobs only, so they don't cough up usable bullets when firing. This is for literally nothing else. - icon_state = "s-casing-spent" - BB = null +/************************************************************************/ +/* +# An explaination of the naming format for guns and ammo: +# +# a = Ammo, as in individual rounds of ammunition. +# b = Box, intended to have ammo taken out one at a time by hand. +# c = Clips, intended to reload magazines or guns quickly. +# m = Magazine, intended to hold rounds of ammo. +# s = Speedloaders, intended to reload guns quickly. +# +# Use this format, followed by the caliber. For example, a shotgun's caliber +# variable is "12g" as a result. Ergo, a shotgun round's path would have "a12g", +# or a magazine with shotgun shells would be "m12g" instead. To avoid confusion +# for developers and in-game admins spawning these items, stick to this format. +# Likewise, when creating new rounds, the caliber variable should match whatever +# the name says. +# +# This comment is copied in magazines.dm as well. +*/ +/************************************************************************/ + +/* + * .357 + */ + +/obj/item/ammo_casing/a357 + desc = "A .357 bullet casing." + caliber = "357" + projectile_type = /obj/item/projectile/bullet/pistol/strong + +/* + * .38 + */ + +/obj/item/ammo_casing/a38 + desc = "A .38 bullet casing." + caliber = ".38" + projectile_type = /obj/item/projectile/bullet/pistol + +/obj/item/ammo_casing/a38r + desc = "A .38 rubber bullet casing." + caliber = ".38" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/rubber + +/obj/item/ammo_casing/a38/emp + name = ".38 haywire round" + desc = "A .38 bullet casing fitted with a single-use ion pulse generator." + icon_state = "empcasing" + projectile_type = /obj/item/projectile/ion/small + matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) + +/* + * .50 Action Express + */ + +/obj/item/ammo_casing/a50ae + desc = "A .50AE bullet casing." + caliber = ".50AE" + projectile_type = /obj/item/projectile/bullet/pistol/strong + +/* + * .75 (aka Gyrojet Rockets, aka admin abuse) + */ + +/obj/item/ammo_casing/a75 + desc = "A .75 gyrojet rocket sheathe." + caliber = ".75" + projectile_type = /obj/item/projectile/bullet/gyro + +/* + * 9mm + */ + +/obj/item/ammo_casing/a9mm + desc = "A 9mm bullet casing." + caliber = "9mm" + projectile_type = /obj/item/projectile/bullet/pistol + +/obj/item/ammo_casing/a9mm/ap + desc = "A 9mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/pistol/ap + +/obj/item/ammo_casing/a9mmf + desc = "A 9mm flash shell casing." + caliber = "9mm" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/energy/flash + +/obj/item/ammo_casing/a9mmr + desc = "A 9mm rubber bullet casing." + caliber = "9mm" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/rubber + +/obj/item/ammo_casing/a9mmp + desc = "A 9mm practice bullet casing." + caliber = "9mm" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/practice + +/* + * .45 + */ + +/obj/item/ammo_casing/a45 + desc = "A .45 bullet casing." + caliber = ".45" + projectile_type = /obj/item/projectile/bullet/pistol/medium + +/obj/item/ammo_casing/a45ap + desc = "A .45 Armor-Piercing bullet casing." + caliber = ".45" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/medium/ap + +/obj/item/ammo_casing/a45p + desc = "A .45 practice bullet casing." + caliber = ".45" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/practice + +/obj/item/ammo_casing/a45r + desc = "A .45 rubber bullet casing." + caliber = ".45" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/bullet/pistol/rubber + +/obj/item/ammo_casing/a45f + desc = "A .45 flash shell casing." + caliber = ".45" + icon_state = "r-casing" + projectile_type = /obj/item/projectile/energy/flash + +/obj/item/ammo_casing/a45/emp + name = ".45 haywire round" + desc = "A .45 bullet casing fitted with a single-use ion pulse generator." + projectile_type = /obj/item/projectile/ion/small + icon_state = "empcasing" + matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) + +/obj/item/ammo_casing/a45/hp + desc = "A .45 hollow-point bullet casing." + projectile_type = /obj/item/projectile/bullet/pistol/medium/hollow + + +/* + * 10mm + */ + +/obj/item/ammo_casing/a10mm + desc = "A 10mm bullet casing." + caliber = "10mm" + projectile_type = /obj/item/projectile/bullet/pistol/medium + +/obj/item/ammo_casing/a10mm/emp + name = "10mm haywire round" + desc = "A 10mm bullet casing fitted with a single-use ion pulse generator." + projectile_type = /obj/item/projectile/ion/small + icon_state = "empcasing" + matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100) + +/* + * 12g (aka shotgun ammo) + */ + +/obj/item/ammo_casing/a12g + name = "shotgun slug" + desc = "A 12 gauge slug." + icon_state = "slshell" + caliber = "12g" + projectile_type = /obj/item/projectile/bullet/shotgun + matter = list(DEFAULT_WALL_MATERIAL = 360) + +/obj/item/ammo_casing/a12g/pellet + name = "shotgun shell" + desc = "A 12 gauge shell." + icon_state = "gshell" + projectile_type = /obj/item/projectile/bullet/pellet/shotgun + matter = list(DEFAULT_WALL_MATERIAL = 360) + +/obj/item/ammo_casing/a12g/blank + name = "shotgun shell" + desc = "A blank shell." + icon_state = "blshell" + projectile_type = /obj/item/projectile/bullet/blank + matter = list(DEFAULT_WALL_MATERIAL = 90) + +/obj/item/ammo_casing/a12g/practice + name = "shotgun shell" + desc = "A practice shell." + icon_state = "pshell" + projectile_type = /obj/item/projectile/bullet/shotgun/practice + matter = list("metal" = 90) + +/obj/item/ammo_casing/a12g/beanbag + name = "beanbag shell" + desc = "A beanbag shell." + icon_state = "bshell" + projectile_type = /obj/item/projectile/bullet/shotgun/beanbag + matter = list(DEFAULT_WALL_MATERIAL = 180) + +//Can stun in one hit if aimed at the head, but +//is blocked by clothing that stops tasers and is vulnerable to EMP +/obj/item/ammo_casing/a12g/stunshell + name = "stun shell" + desc = "A 12 gauge taser cartridge." + icon_state = "stunshell" + projectile_type = /obj/item/projectile/energy/electrode/stunshot + matter = list(DEFAULT_WALL_MATERIAL = 360, "glass" = 720) + +/obj/item/ammo_casing/a12g/stunshell/emp_act(severity) + if(prob(100/severity)) BB = null + update_icon() + +//Does not stun, only blinds, but has area of effect. +/obj/item/ammo_casing/a12g/flash + name = "flash shell" + desc = "A chemical shell used to signal distress or provide illumination." + icon_state = "fshell" + projectile_type = /obj/item/projectile/energy/flash/flare + matter = list(DEFAULT_WALL_MATERIAL = 90, "glass" = 90) + +/obj/item/ammo_casing/a12g/emp + name = "ion shell" + desc = "An advanced shotgun round that creates a small EMP when it strikes a target." + icon_state = "empshell" + projectile_type = /obj/item/projectile/ion +// projectile_type = /obj/item/projectile/bullet/shotgun/ion + matter = list(DEFAULT_WALL_MATERIAL = 360, "uranium" = 240) + +/* + * 7.62mm + */ + +/obj/item/ammo_casing/a762 + desc = "A 7.62mm bullet casing." + caliber = "7.62mm" + icon_state = "rifle-casing" + projectile_type = /obj/item/projectile/bullet/rifle/a762 + +/obj/item/ammo_casing/a762/ap + desc = "A 7.62mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/rifle/a762/ap + +/obj/item/ammo_casing/a762p + desc = "A 7.62mm practice bullet casing." + caliber = "7.62mm" + icon_state = "rifle-casing" // Need to make an icon for these + projectile_type = /obj/item/projectile/bullet/rifle/practice + +/obj/item/ammo_casing/a762/blank + desc = "A blank 7.62mm bullet casing." + projectile_type = /obj/item/projectile/bullet/blank + matter = list(DEFAULT_WALL_MATERIAL = 90) + +/obj/item/ammo_casing/a762/hp + desc = "A 7.62mm hollow-point bullet casing." + projectile_type = /obj/item/projectile/bullet/rifle/a762/hollow + +/* + * 14.5mm (anti-materiel rifle round) + */ + +/obj/item/ammo_casing/a145 + desc = "A 14.5mm shell." + icon_state = "lcasing" + caliber = "14.5mm" + projectile_type = /obj/item/projectile/bullet/rifle/a145 + matter = list(DEFAULT_WALL_MATERIAL = 1250) + +/* + * 5.56mm + */ + +/obj/item/ammo_casing/a556 + desc = "A 5.56mm bullet casing." + caliber = "5.56mm" + icon_state = "rifle-casing" + projectile_type = /obj/item/projectile/bullet/rifle/a556 + +/obj/item/ammo_casing/a556/ap + desc = "A 5.56mm armor-piercing bullet casing." + projectile_type = /obj/item/projectile/bullet/rifle/a556/ap + +/obj/item/ammo_casing/a556p + desc = "A 5.56mm practice bullet casing." + caliber = "5.56mm" + icon_state = "rifle-casing" // Need to make an icon for these + projectile_type = /obj/item/projectile/bullet/rifle/practice + +/obj/item/ammo_casing/a556/blank + desc = "A blank 5.56mm bullet casing." + projectile_type = /obj/item/projectile/bullet/blank + matter = list(DEFAULT_WALL_MATERIAL = 90) + +/obj/item/ammo_casing/a556/hp + desc = "A 5.56mm hollow-point bullet casing." + projectile_type = /obj/item/projectile/bullet/rifle/a556/hollow + +/* + * Misc + */ + +/obj/item/ammo_casing/rocket + name = "rocket shell" + desc = "A high explosive designed to be fired from a launcher." + icon_state = "rocketshell" + projectile_type = /obj/item/missile + caliber = "rocket" + +/obj/item/ammo_casing/cap + name = "cap" + desc = "A cap for children toys." + caliber = "caps" + icon_state = "r-casing" + color = "#FF0000" + projectile_type = /obj/item/projectile/bullet/pistol/cap + +/obj/item/ammo_casing/spent // For simple hostile mobs only, so they don't cough up usable bullets when firing. This is for literally nothing else. + icon_state = "s-casing-spent" + BB = null projectile_type = null \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 9cb7292baf8..8ff2828cc06 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -87,6 +87,36 @@ var/last_shot = 0 //records the last shot fired +//VOREStation Add - /tg/ icon system + var/charge_sections = 4 + var/shaded_charge = FALSE + var/ammo_x_offset = 2 + var/ammo_y_offset = 0 + var/can_flashlight = FALSE + var/gun_light = FALSE + var/light_state = "flight" + var/light_brightness = 4 + var/flight_x_offset = 0 + var/flight_y_offset = 0 + +/obj/item/weapon/gun/CtrlClick(mob/user) + if(can_flashlight && ishuman(user) && src.loc == usr && !user.incapacitated(INCAPACITATION_ALL)) + toggle_flashlight() + else + return ..() + +/obj/item/weapon/gun/proc/toggle_flashlight() + if(gun_light) + set_light(0) + gun_light = FALSE + else + set_light(light_brightness) + gun_light = TRUE + + playsound(src, 'sound/machines/button.ogg', 25) + update_icon() +//VOREStation Add End + /obj/item/weapon/gun/New() ..() for(var/i in 1 to firemodes.len) @@ -333,7 +363,12 @@ accuracy = initial(accuracy) //Reset the gun's accuracy if(muzzle_flash) - set_light(0) + //VOREStation Edit - Flashlights + if(gun_light) + set_light(light_brightness) + else + set_light(0) + //VOREStation Edit End // Similar to the above proc, but does not require a user, which is ideal for things like turrets. /obj/item/weapon/gun/proc/Fire_userless(atom/target) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 5636b68b947..bddc1fe4905 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -45,7 +45,7 @@ /obj/item/weapon/gun/energy/Destroy() if(self_recharge) processing_objects.Remove(src) - ..() + return ..() /obj/item/weapon/gun/energy/process() if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the battery diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index bf30c19991a..5abcead8f3f 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -8,7 +8,7 @@ caliber = "9mm" origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2) slot_flags = SLOT_BELT - ammo_type = /obj/item/ammo_casing/c9mm + ammo_type = /obj/item/ammo_casing/a9mm multi_aim = 1 burst_delay = 2 @@ -33,8 +33,8 @@ slot_flags = SLOT_BELT|SLOT_BACK fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/a10mm - allowed_magazines = list(/obj/item/ammo_magazine/a10mm) + magazine_type = /obj/item/ammo_magazine/m10mm + allowed_magazines = list(/obj/item/ammo_magazine/m10mm) auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' @@ -56,12 +56,12 @@ item_state = null w_class = ITEMSIZE_LARGE force = 10 - caliber = "a556" + caliber = "5.56mm" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/c556 - allowed_magazines = list(/obj/item/ammo_magazine/c556) + magazine_type = /obj/item/ammo_magazine/m556 + allowed_magazines = list(/obj/item/ammo_magazine/m556) one_handed_penalty = 4 @@ -73,8 +73,8 @@ /obj/item/weapon/gun/projectile/automatic/sts35/update_icon(var/ignore_inhands) ..() - if(istype(ammo_magazine,/obj/item/ammo_magazine/s762)) - icon_state = "arifle-small" + if(istype(ammo_magazine,/obj/item/ammo_magazine/m556/small)) + icon_state = "arifle-small" // If using the small magazines, use the small magazine sprite. else icon_state = (ammo_magazine)? "arifle" : "arifle-empty" if(!ignore_inhands) update_held_icon() @@ -88,11 +88,11 @@ caliber = "9mm" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2) slot_flags = SLOT_BELT - ammo_type = "/obj/item/ammo_casing/c9mmr" + ammo_type = "/obj/item/ammo_casing/a9mmr" fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/mc9mmt/rubber - allowed_magazines = list(/obj/item/ammo_magazine/mc9mmt) + magazine_type = /obj/item/ammo_magazine/m9mmt/rubber + allowed_magazines = list(/obj/item/ammo_magazine/m9mmt) /obj/item/weapon/gun/projectile/automatic/wt550/update_icon() ..() @@ -109,14 +109,14 @@ item_state = "z8carbine" w_class = ITEMSIZE_LARGE force = 10 - caliber = "a762" + caliber = "7.62mm" origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 3) ammo_type = "/obj/item/ammo_casing/a556" // Is this really needed anymore? fire_sound = 'sound/weapons/Gunshot.ogg' slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/c762 - allowed_magazines = list(/obj/item/ammo_magazine/c762) + magazine_type = /obj/item/ammo_magazine/m762 + allowed_magazines = list(/obj/item/ammo_magazine/m762) auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' @@ -181,14 +181,14 @@ force = 10 slot_flags = 0 max_shells = 50 - caliber = "a556" + caliber = "5.56mm" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 2) slot_flags = SLOT_BACK ammo_type = "/obj/item/ammo_casing/a556" // Is this really needed anymore? fire_sound = 'sound/weapons/machinegun.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/a556 - allowed_magazines = list(/obj/item/ammo_magazine/a556, /obj/item/ammo_magazine/c556) + magazine_type = /obj/item/ammo_magazine/m556saw + allowed_magazines = list(/obj/item/ammo_magazine/m556saw, /obj/item/ammo_magazine/m556) one_handed_penalty = 6 @@ -225,7 +225,7 @@ return ..() //once open, behave like normal /obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon() - if(istype(ammo_magazine,/obj/item/ammo_magazine/c762)) + if(istype(ammo_magazine,/obj/item/ammo_magazine/m762)) icon_state = "l6[cover_open ? "open" : "closed"]mag" item_state = icon_state else @@ -252,13 +252,13 @@ item_state = null w_class = ITEMSIZE_LARGE force = 10 - caliber = "shotgun" + caliber = "12g" fire_sound = 'sound/weapons/shotgun.ogg' origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/g12 - allowed_magazines = list(/obj/item/ammo_magazine/g12) + magazine_type = /obj/item/ammo_magazine/m12gdrum + allowed_magazines = list(/obj/item/ammo_magazine/m12gdrum) one_handed_penalty = 4 @@ -284,8 +284,8 @@ load_method = MAGAZINE caliber = ".45" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 5) - magazine_type = /obj/item/ammo_magazine/c45uzi - allowed_magazines = list(/obj/item/ammo_magazine/c45uzi) + magazine_type = /obj/item/ammo_magazine/m45uzi + allowed_magazines = list(/obj/item/ammo_magazine/m45uzi) firemodes = list( list(mode_name="semiauto", burst=1, fire_delay=0), @@ -310,8 +310,8 @@ slot_flags = SLOT_BELT // ToDo: Belt sprite. fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/p90 - allowed_magazines = list(/obj/item/ammo_magazine/p90, /obj/item/ammo_magazine/mc9mmt) // ToDo: New sprite for the different mag. + magazine_type = /obj/item/ammo_magazine/m9mmp90 + allowed_magazines = list(/obj/item/ammo_magazine/m9mmp90, /obj/item/ammo_magazine/m9mmt) // ToDo: New sprite for the different mag. firemodes = list( list(mode_name="semiauto", burst=1, fire_delay=0), @@ -330,8 +330,8 @@ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 5) slot_flags = SLOT_BELT // ToDo: Belt sprite. load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/tommymag - allowed_magazines = list(/obj/item/ammo_magazine/tommymag, /obj/item/ammo_magazine/tommydrum) + magazine_type = /obj/item/ammo_magazine/m45tommy + allowed_magazines = list(/obj/item/ammo_magazine/m45tommy, /obj/item/ammo_magazine/m45tommydrum) firemodes = list( list(mode_name="semiauto", burst=1, fire_delay=0), @@ -343,19 +343,19 @@ icon_state = (ammo_magazine)? "tommygun" : "tommygun-empty" // update_held_icon() -/obj/item/weapon/gun/projectile/automatic/carbine +/obj/item/weapon/gun/projectile/automatic/carbine // Admin abuse assault rifle. ToDo: Make this less shit. Maybe remove its autofire, and make it spawn with only 10 rounds at start. name = "assault carbine" desc = "The bullpup configured GP3000 is a lightweight, compact, military-grade assault rifle produced by Gurov Projectile Weapons LLC. It is sold almost exclusively to standing armies. The serial number on this one has been scratched off. Uses 5.56mm rounds." icon_state = "bullpup" item_state = "bullpup" w_class = ITEMSIZE_LARGE force = 10 - caliber = "a762" + caliber = "7.62mm" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) slot_flags = SLOT_BACK load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/c762 - allowed_magazines = list(/obj/item/ammo_magazine/c762) + magazine_type = /obj/item/ammo_magazine/m762m + allowed_magazines = list(/obj/item/ammo_magazine/m762, /obj/item/ammo_magazine/m762m) one_handed_penalty = 4 @@ -366,9 +366,9 @@ /obj/item/weapon/gun/projectile/automatic/carbine/update_icon(var/ignore_inhands) ..() - if(ammo_magazine) - icon_state = "bullpup" + if(istype(ammo_magazine,/obj/item/ammo_magazine/m762)) + icon_state = "bullpup-small" // If using the smaller magazines, use the small mag sprite. else icon_state = "bullpup-empty" item_state = (ammo_magazine)? "bullpup" : "bullpup-empty" - if(!ignore_inhands) update_held_icon() + if(!ignore_inhands) update_held_icon() \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/automatic_vr.dm b/code/modules/projectiles/guns/projectile/automatic_vr.dm index 9b7fc0c7266..79789292eeb 100644 --- a/code/modules/projectiles/guns/projectile/automatic_vr.dm +++ b/code/modules/projectiles/guns/projectile/automatic_vr.dm @@ -1,2 +1,2 @@ /obj/item/weapon/gun/projectile/automatic/wt550/lethal - magazine_type = /obj/item/ammo_magazine/mc9mmt \ No newline at end of file + magazine_type = /obj/item/ammo_magazine/m9mmt \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/boltaction.dm b/code/modules/projectiles/guns/projectile/boltaction.dm index cbc403c4e00..17e2fe1234d 100644 --- a/code/modules/projectiles/guns/projectile/boltaction.dm +++ b/code/modules/projectiles/guns/projectile/boltaction.dm @@ -7,7 +7,7 @@ icon_state = "boltaction" fire_sound = 'sound/weapons/rifleshot.ogg' max_shells = 5 - caliber = "a762" + caliber = "7.62mm" origin_tech = list(TECH_COMBAT = 1)// Old as shit rifle doesn't have very good tech. ammo_type = /obj/item/ammo_casing/a762 load_method = SINGLE_CASING|SPEEDLOADER @@ -60,7 +60,7 @@ icon_state = "leveraction" fire_sound = 'sound/weapons/rifleshot.ogg' max_shells = 5 - caliber = "a762" + caliber = "7.62mm" origin_tech = list(TECH_COMBAT = 1)// Old as shit rifle doesn't have very good tech. ammo_type = /obj/item/ammo_casing/a762 load_method = SINGLE_CASING|SPEEDLOADER diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index 8c64b297d1c..c998e152f14 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -62,7 +62,7 @@ var/container_type = /obj/item/weapon/reagent_containers/glass/beaker var/list/starting_chems = null -/obj/item/weapon/gun/projectile/dartgun/dartgun/New() +/obj/item/weapon/gun/projectile/dartgun/New() //VOREStation Edit - Think this was a typo ..() if(starting_chems) for(var/chem in starting_chems) diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index fd46803c68a..ba5f4f147d0 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -2,8 +2,8 @@ var/unique_reskin name = ".45 pistol" desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds." - magazine_type = /obj/item/ammo_magazine/c45m - allowed_magazines = list(/obj/item/ammo_magazine/c45m) + magazine_type = /obj/item/ammo_magazine/m45 + allowed_magazines = list(/obj/item/ammo_magazine/m45) icon_state = "colt" caliber = ".45" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) @@ -12,7 +12,7 @@ /obj/item/weapon/gun/projectile/colt/detective desc = "A Martian recreation of an old Terran pistol. Uses .45 rounds." - magazine_type = /obj/item/ammo_magazine/c45m/rubber + magazine_type = /obj/item/ammo_magazine/m45/rubber /obj/item/weapon/gun/projectile/colt/detective/update_icon() if(ammo_magazine) @@ -71,7 +71,7 @@ name = ".45 pistol" desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. Found pretty much everywhere humans are. Uses .45 rounds." icon_state = "secguncomp" - magazine_type = /obj/item/ammo_magazine/c45m/rubber + magazine_type = /obj/item/ammo_magazine/m45/rubber caliber = ".45" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/semiauto.ogg' @@ -86,7 +86,7 @@ /obj/item/weapon/gun/projectile/sec/flash name = ".45 signal pistol" - magazine_type = /obj/item/ammo_magazine/c45m/flash + magazine_type = /obj/item/ammo_magazine/m45/flash /obj/item/weapon/gun/projectile/sec/wood desc = "The NT Mk58 is a cheap, ubiquitous sidearm, produced by a NanoTrasen subsidiary. This one has a sweet wooden grip. Uses .45 rounds." @@ -111,8 +111,8 @@ recoil = 0 origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/c45m - allowed_magazines = list(/obj/item/ammo_magazine/c45m) + magazine_type = /obj/item/ammo_magazine/m45 + allowed_magazines = list(/obj/item/ammo_magazine/m45) /obj/item/weapon/gun/projectile/deagle name = "desert eagle" @@ -120,11 +120,11 @@ icon_state = "deagle" item_state = "deagle" force = 14.0 - caliber = ".50" + caliber = ".50AE" load_method = MAGAZINE fire_sound = 'sound/weapons/deagle.ogg' - magazine_type = /obj/item/ammo_magazine/a50 - allowed_magazines = list(/obj/item/ammo_magazine/a50) + magazine_type = /obj/item/ammo_magazine/m50 + allowed_magazines = list(/obj/item/ammo_magazine/m50) /obj/item/weapon/gun/projectile/deagle/update_icon() ..() @@ -168,13 +168,13 @@ desc = "Speak softly, and carry a big gun. Fires rare .75 caliber self-propelled exploding bolts--because fuck you and everything around you." icon_state = "gyropistol" max_shells = 8 - caliber = "75" + caliber = ".75" fire_sound = 'sound/weapons/rpg.ogg' origin_tech = list(TECH_COMBAT = 3) ammo_type = "/obj/item/ammo_casing/a75" load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/a75 - allowed_magazines = list(/obj/item/ammo_magazine/a75) + magazine_type = /obj/item/ammo_magazine/m75 + allowed_magazines = list(/obj/item/ammo_magazine/m75) auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' @@ -196,12 +196,12 @@ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 2) fire_sound = 'sound/weapons/semiauto.ogg' load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/mc9mm - allowed_magazines = list(/obj/item/ammo_magazine/mc9mm) + magazine_type = /obj/item/ammo_magazine/m9mm + allowed_magazines = list(/obj/item/ammo_magazine/m9mm) /obj/item/weapon/gun/projectile/pistol/flash name = "holdout signal pistol" - magazine_type = /obj/item/ammo_magazine/mc9mm/flash + magazine_type = /obj/item/ammo_magazine/m9mm/flash /obj/item/weapon/gun/projectile/pistol/attack_hand(mob/living/user as mob) if(user.get_inactive_hand() == src) @@ -256,17 +256,17 @@ var/global/list/ammo_types = list( /obj/item/ammo_casing/a357 = ".357", - /obj/item/ammo_casing/c9mmf = "9mm", - /obj/item/ammo_casing/c45f = ".45", + /obj/item/ammo_casing/a9mmf = "9mm", + /obj/item/ammo_casing/a45f = ".45", /obj/item/ammo_casing/a10mm = "10mm", - /obj/item/ammo_casing/shotgun = "12 gauge", - /obj/item/ammo_casing/shotgun = "12 gauge", - /obj/item/ammo_casing/shotgun/pellet = "12 gauge", - /obj/item/ammo_casing/shotgun/pellet = "12 gauge", - /obj/item/ammo_casing/shotgun/pellet = "12 gauge", - /obj/item/ammo_casing/shotgun/beanbag = "12 gauge", - /obj/item/ammo_casing/shotgun/stunshell = "12 gauge", - /obj/item/ammo_casing/shotgun/flash = "12 gauge", + /obj/item/ammo_casing/a12g = "12 gauge", + /obj/item/ammo_casing/a12g = "12 gauge", + /obj/item/ammo_casing/a12g/pellet = "12 gauge", + /obj/item/ammo_casing/a12g/pellet = "12 gauge", + /obj/item/ammo_casing/a12g/pellet = "12 gauge", + /obj/item/ammo_casing/a12g/beanbag = "12 gauge", + /obj/item/ammo_casing/a12g/stunshell = "12 gauge", + /obj/item/ammo_casing/a12g/flash = "12 gauge", /obj/item/ammo_casing/a762 = "7.62mm", /obj/item/ammo_casing/a556 = "5.56mm" ) @@ -299,8 +299,8 @@ caliber = "9mm" load_method = MAGAZINE fire_sound = 'sound/weapons/semiauto.ogg' - magazine_type = /obj/item/ammo_magazine/mc9mm - allowed_magazines = list(/obj/item/ammo_magazine/mc9mm) + magazine_type = /obj/item/ammo_magazine/m9mm + allowed_magazines = list(/obj/item/ammo_magazine/m9mm) /obj/item/weapon/gun/projectile/luger/update_icon() ..() diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index e7d31c0226f..3886450fcf2 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -43,10 +43,10 @@ name = "revolver" desc = "A cheap Martian knock-off of a Smith & Wesson Model 10. Uses .38-Special rounds." icon_state = "detective" - caliber = "38" + caliber = ".38" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' - ammo_type = /obj/item/ammo_casing/c38 + ammo_type = /obj/item/ammo_casing/a38 /obj/item/weapon/gun/projectile/revolver/detective/verb/rename_gun() set name = "Name Gun" @@ -71,13 +71,13 @@ name = "Deckard .38" desc = "A custom-built revolver, based off the semi-popular Detective Special model." icon_state = "deckard-empty" - caliber = "38" + caliber = ".38" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' - ammo_type = /obj/item/ammo_casing/c38 + ammo_type = /obj/item/ammo_casing/a38 /obj/item/weapon/gun/projectile/revolver/deckard/emp - ammo_type = /obj/item/ammo_casing/c38/emp + ammo_type = /obj/item/ammo_casing/a38/emp /obj/item/weapon/gun/projectile/revolver/deckard/update_icon() @@ -107,13 +107,13 @@ name = "\"The Judge\"" desc = "A revolving hand-shotgun by Cybersun Industries that packs the power of a 12 guage in the palm of your hand (if you don't break your wrist). Uses 12 shotgun rounds." icon_state = "judge" - caliber = "shotgun" + caliber = "12g" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 4) max_shells = 5 fire_sound = 'sound/weapons/shotgun.ogg' recoil = 2 // ow my fucking hand accuracy = -1 // smooth bore + short barrel = shit accuracy - ammo_type = /obj/item/ammo_casing/shotgun + ammo_type = /obj/item/ammo_casing/a12g // ToDo: Remove accuracy debuf in exchange for slightly injuring your hand every time you fire it. /obj/item/weapon/gun/projectile/revolver/lemat @@ -124,11 +124,11 @@ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) handle_casings = CYCLE_CASINGS max_shells = 9 - caliber = "38" - ammo_type = /obj/item/ammo_casing/c38 + caliber = ".38" + ammo_type = /obj/item/ammo_casing/a38 var/secondary_max_shells = 1 - var/secondary_caliber = "shotgun" - var/secondary_ammo_type = /obj/item/ammo_casing/shotgun + var/secondary_caliber = "12g" + var/secondary_ammo_type = /obj/item/ammo_casing/a12g var/flipped_firing = 0 var/list/secondary_loaded = list() var/list/tertiary_loaded = list() diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 84ad0bc4269..bc14bb94256 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -8,10 +8,10 @@ force = 10 flags = CONDUCT slot_flags = SLOT_BACK - caliber = "shotgun" + caliber = "12g" origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2) load_method = SINGLE_CASING - ammo_type = /obj/item/ammo_casing/shotgun/beanbag + ammo_type = /obj/item/ammo_casing/a12g/beanbag handle_casings = HOLD_CASINGS fire_sound = 'sound/weapons/shotgun.ogg' var/recentpump = 0 // to prevent spammage @@ -48,7 +48,7 @@ item_state = "cshotgun" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2) max_shells = 7 //match the ammo box capacity, also it can hold a round in the chamber anyways, for a total of 8. - ammo_type = /obj/item/ammo_casing/shotgun + ammo_type = /obj/item/ammo_casing/a12g /obj/item/weapon/gun/projectile/shotgun/doublebarrel name = "double-barreled shotgun" @@ -64,9 +64,9 @@ force = 10 flags = CONDUCT slot_flags = SLOT_BACK - caliber = "shotgun" + caliber = "12g" origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 1) - ammo_type = /obj/item/ammo_casing/shotgun/beanbag + ammo_type = /obj/item/ammo_casing/a12g/beanbag burst_delay = 0 firemodes = list( @@ -75,12 +75,12 @@ ) /obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet - ammo_type = /obj/item/ammo_casing/shotgun/pellet + ammo_type = /obj/item/ammo_casing/a12g/pellet /obj/item/weapon/gun/projectile/shotgun/doublebarrel/flare name = "signal shotgun" desc = "A double-barreled shotgun meant to fire signal flash shells." - ammo_type = /obj/item/ammo_casing/shotgun/flash + ammo_type = /obj/item/ammo_casing/a12g/flash /obj/item/weapon/gun/projectile/shotgun/doublebarrel/unload_ammo(user, allow_dump) ..(user, allow_dump=1) @@ -115,6 +115,6 @@ icon_state = "sawnshotgun" item_state = "sawnshotgun" slot_flags = SLOT_BELT|SLOT_HOLSTER - ammo_type = /obj/item/ammo_casing/shotgun/pellet + ammo_type = /obj/item/ammo_casing/a12g/pellet w_class = ITEMSIZE_NORMAL force = 5 diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index be280c2f643..9a16f68a4c0 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -80,7 +80,7 @@ slot_flags = SLOT_BACK // Needs a sprite. origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) recoil = 2 //extra kickback - caliber = "a762" + caliber = "7.62mm" load_method = MAGAZINE accuracy = -3 //shooting at the hip scoped_accuracy = 0 @@ -88,11 +88,11 @@ one_handed_penalty = 4 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. fire_sound = 'sound/weapons/SVD_shot.ogg' magazine_type = /obj/item/ammo_magazine/SVD - allowed_magazines = list(/obj/item/ammo_magazine/SVD, /obj/item/ammo_magazine/c762) + allowed_magazines = list(/obj/item/ammo_magazine/SVD, /obj/item/ammo_magazine/m762) /obj/item/weapon/gun/projectile/SVD/update_icon() ..() -// if(istype(ammo_magazine,/obj/item/ammo_magazine/c762) +// if(istype(ammo_magazine,/obj/item/ammo_magazine/m762) // icon_state = "SVD-bigmag" //No icon for this exists yet. if(ammo_magazine) icon_state = "SVD" diff --git a/code/modules/projectiles/guns/projectile/sniper_vr.dm b/code/modules/projectiles/guns/projectile/sniper_vr.dm index ecfe070ecaa..8ed8962319b 100644 --- a/code/modules/projectiles/guns/projectile/sniper_vr.dm +++ b/code/modules/projectiles/guns/projectile/sniper_vr.dm @@ -17,12 +17,12 @@ // requires_two_hands = 1 one_handed_penalty = 4 // The weapon itself is heavy, and the long barrel makes it hard to hold steady with just one hand. fire_sound = 'sound/weapons/SVD_shot.ogg' - magazine_type = /obj/item/ammo_magazine/s762 - allowed_magazines = list(/obj/item/ammo_magazine/s762, /obj/item/ammo_magazine/c762) + magazine_type = /obj/item/ammo_magazine/m762 + allowed_magazines = list(/obj/item/ammo_magazine/m762, /obj/item/ammo_magazine/m762) /obj/item/weapon/gun/projectile/SVD/update_icon() ..() -// if(istype(ammo_magazine,/obj/item/ammo_magazine/c762) +// if(istype(ammo_magazine,/obj/item/ammo_magazine/m762) // icon_state = "SVD-bigmag" //No icon for this exists yet. if(ammo_magazine) icon_state = "SVD" diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index 43f89b4ec7f..8fb02007b4b 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -62,16 +62,16 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/weapon/storage/box/emps, /obj/item/weapon/storage/box/flashbangs, /obj/item/weapon/gun/projectile/automatic/sts35, - /obj/item/ammo_magazine/c762/ap, - /obj/item/ammo_magazine/c762/ap, + /obj/item/ammo_magazine/m762/ap, + /obj/item/ammo_magazine/m762/ap, /obj/item/weapon/gun/projectile/colt, - /obj/item/ammo_magazine/c45m, + /obj/item/ammo_magazine/m45, /obj/item/weapon/material/hatchet/tacknife/combatknife) /datum/supply_drop_loot/heavy_warfare name = "Heavy Warfare" container = /obj/structure/largecrate -/datum/supply_drop_loot/armour/New() +/datum/supply_drop_loot/heavy_warfare/New() ..() contents = list( /obj/item/clothing/head/helmet/combat, @@ -83,8 +83,8 @@ var/global/list/datum/supply_drop_loot/supply_drop /obj/item/clothing/accessory/storage/black_drop_pouches, /obj/item/weapon/storage/backpack/dufflebag/sec, /obj/item/weapon/gun/projectile/automatic/carbine, - /obj/item/ammo_magazine/c762/ap, - /obj/item/ammo_magazine/c762, + /obj/item/ammo_magazine/m762/ap, + /obj/item/ammo_magazine/m762, /obj/item/weapon/shield/energy, /obj/item/weapon/grenade/frag, /obj/item/weapon/grenade/frag, @@ -99,7 +99,7 @@ var/global/list/datum/supply_drop_loot/supply_drop datum/supply_drop_loot/riot name = "Riot Gear" container = /obj/structure/largecrate -/datum/supply_drop_loot/armour/New() +/datum/supply_drop_loot/riot/New() ..() contents = list( /obj/item/clothing/head/helmet/riot, diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 49c1099184c..d6347113790 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -23,7 +23,7 @@ chemical_reagents_list[D.id] = D /datum/reagents/Destroy() - ..() + . = ..() if(chemistryProcess) chemistryProcess.active_holders -= src @@ -79,12 +79,6 @@ total_volume += R.volume return -/datum/reagents/proc/delete() - for(var/datum/reagent/R in reagent_list) - R.holder = null - if(my_atom) - my_atom.reagents = null - /datum/reagents/proc/handle_reactions() if(chemistryProcess) chemistryProcess.mark_for_update(src) diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 78b33ef36ee..ccf7c62ac1e 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -488,7 +488,7 @@ var/amount_to_take = max(0,min(stack.amount,round(remaining_volume/REAGENTS_PER_SHEET))) if(amount_to_take) stack.use(amount_to_take) - if(deleted(stack)) + if(QDELETED(stack)) holdingitems -= stack beaker.reagents.add_reagent(sheet_reagents[stack.type], (amount_to_take*REAGENTS_PER_SHEET)) continue diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 723db2ace77..f23e37f5167 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -118,8 +118,8 @@ return null /datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references - ..() holder = null + . = ..() /* DEPRECATED - TODO: REMOVE EVERYWHERE */ diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 88d059ed96b..0a208fd0a3f 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -34,10 +34,12 @@ data -= taste /datum/reagent/nutriment/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(!injectable) + /* if(!injectable) vorestation removal M.adjustToxLoss(0.1 * removed) return - affect_ingest(M, alien, removed) + affect_ingest(M, alien, removed) */ + if(injectable) //vorestation addition/replacement + affect_ingest(M, alien, removed) /datum/reagent/nutriment/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) switch(alien) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm index ddc0a5a4117..bebbb913250 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm @@ -15,4 +15,17 @@ if(M.eye_blurry) M.eye_blurry = max(M.eye_blurry - 8*removed, 0) if(M.jitteriness) - M.make_jittery(max(M.jitteriness - 8*removed,0)) \ No newline at end of file + M.make_jittery(max(M.jitteriness - 8*removed,0)) + +/datum/reagent/numbing_enzyme + name = "Numbing Enzyme" + id = "numbenzyme" + description = "Some sort of organic painkiller." + taste_description = "sourness" + reagent_state = LIQUID + color = "#800080" + metabolism = 0.02 + mrate_static = TRUE + +/datum/reagent/numbing_enzyme/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + M.add_chemical_effect(CE_PAINKILLER, 200) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 12540c2d049..b6c45475cc3 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -205,7 +205,7 @@ if(holder && holder.my_atom && ismob(holder.my_atom)) var/mob/M = holder.my_atom M.status_flags &= ~FAKEDEATH - ..() + return ..() /datum/reagent/toxin/fertilizer //Reagents used for plant fertilizers. name = "fertilizer" diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 16a1cb3b265..d585effc916 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -35,7 +35,7 @@ /obj/item/weapon/reagent_containers/borghypo/Destroy() processing_objects.Remove(src) - ..() + return ..() /obj/item/weapon/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg+ if(++charge_tick < recharge_time) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 86d5d58f65c..df8bd685aba 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -225,8 +225,8 @@ /obj/item/weapon/reagent_containers/food/snacks/Destroy() if(contents) for(var/atom/movable/something in contents) - something.loc = get_turf(src) - ..() + something.dropInto(loc) + . = ..() //////////////////////////////////////////////////////////////////////////////// /// FOOD END diff --git a/code/modules/reagents/reagent_containers/food/z_custom_food_vr.dm b/code/modules/reagents/reagent_containers/food/z_custom_food_vr.dm index 91a5f6848ef..7e3a8d5a356 100644 --- a/code/modules/reagents/reagent_containers/food/z_custom_food_vr.dm +++ b/code/modules/reagents/reagent_containers/food/z_custom_food_vr.dm @@ -121,7 +121,7 @@ var/global/ingredientLimit = 20 return new_name /obj/item/weapon/reagent_containers/food/snacks/customizable/Destroy() - for(. in ingredients) qdel(.) + qdel_null_list(ingredients) return ..() /obj/item/weapon/reagent_containers/food/snacks/customizable/proc/drawTopping() diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index bd670cc8bce..f84a6ff4075 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -249,7 +249,7 @@ user.drop_from_inventory(src) qdel(src) return - else if(istype(D, /obj/item/weapon/mop)) + else if(istype(D, /obj/item/weapon/mop) || istype(D, /obj/item/weapon/soap) || istype(D, /obj/item/weapon/reagent_containers/glass/rag)) //VOREStation Edit - "Allows soap and rags to be used on buckets" if(reagents.total_volume < 1) user << "\The [src] is empty!" else diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 427d08d141c..1c3151fee90 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -28,12 +28,6 @@ update_icon() return -/obj/item/weapon/reagent_containers/hypospray/do_surgery(mob/living/carbon/M, mob/living/user) - if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool - return ..() - attack(M, user) - return 1 - /obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M as mob, mob/user as mob) if(!reagents.total_volume) user << "[src] is empty." diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 69bdaf04128..d3307737b3d 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -19,13 +19,6 @@ if(!icon_state) icon_state = "pill[rand(1, 20)]" - -/obj/item/weapon/reagent_containers/pill/do_surgery(mob/M, mob/user) - if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool - return ..() - attack(M, user) //default surgery behaviour is just to scan as usual - return 1 - /obj/item/weapon/reagent_containers/pill/attack(mob/M as mob, mob/user as mob) if(M == user) if(istype(M, /mob/living/carbon/human)) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 63bb549645c..8aede2d0683 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -53,13 +53,6 @@ /obj/item/weapon/reagent_containers/syringe/attackby(obj/item/I as obj, mob/user as mob) return -/obj/item/weapon/reagent_containers/syringe/do_surgery(mob/living/carbon/M, mob/living/user) - if(user.a_intent == I_HURT) - return 0 - if(user.a_intent != I_HELP) //in case it is ever used as a surgery tool - return ..() - return 1 - /obj/item/weapon/reagent_containers/syringe/afterattack(obj/target, mob/user, proximity) if(!proximity || !target.reagents) return diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 49d251d311f..e84a9634460 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -227,7 +227,7 @@ src.add_fingerprint(user) if(bottle) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 20)) + if(do_after(user, 20) && bottle) 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 ) for(var/datum/reagent/R in reagents.reagent_list) @@ -262,7 +262,7 @@ if(!bottle && !cupholder) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You start taking the water-cooler apart." - if(do_after(user, 20)) + if(do_after(user, 20) && !bottle && !cupholder) user << "You take the water-cooler apart." new /obj/item/stack/material/plastic( src.loc, 4 ) qdel(src) @@ -274,7 +274,7 @@ if(anchored) var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = I user << "You start to screw the bottle onto the water-cooler." - if(do_after(user, 20)) + if(do_after(user, 20) && !bottle && anchored) bottle = 1 update_icon() user << "You screw the bottle onto the water-cooler!" @@ -286,7 +286,7 @@ user << "You need to wrench down the cooler first." else user << "There is already a bottle there!" - return + return 1 if(istype(I, /obj/item/stack/material/plastic)) if(!cupholder) @@ -295,7 +295,7 @@ src.add_fingerprint(user) user << "You start to attach a cup dispenser onto the water-cooler." playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20)) + if(do_after(user, 20) && !cupholder && anchored) if (P.use(1)) user << "You attach a cup dispenser onto the water-cooler." cupholder = 1 diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index be3cfa72a85..2e29fdcad39 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -18,11 +18,7 @@ unwrap() proc/unwrap() - if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 - wrapped.loc = (get_turf(src.loc)) - if(istype(wrapped, /obj/structure/closet)) - var/obj/structure/closet/O = wrapped - O.welded = 0 + // Destroy will drop our wrapped object on the turf, so let it. qdel(src) attackby(obj/item/W as obj, mob/user as mob) @@ -312,14 +308,15 @@ /obj/structure/bigDelivery/Destroy() if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 - wrapped.loc = (get_turf(loc)) + wrapped.forceMove(get_turf(src)) if(istype(wrapped, /obj/structure/closet)) var/obj/structure/closet/O = wrapped O.welded = 0 + wrapped = null var/turf/T = get_turf(src) for(var/atom/movable/AM in contents) - AM.loc = T - ..() + AM.forceMove(T) + return ..() /obj/item/device/destTagger name = "destination tagger" diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 49678c966ca..6f1add522af 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -545,7 +545,7 @@ other types of metals and chemistry for reagents). id = "ammo_9mm" req_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 3750, "silver" = 100) - build_path = /obj/item/ammo_magazine/c9mm + build_path = /obj/item/ammo_magazine/box/c9mm sort_string = "TAACA" /datum/design/item/weapon/stunshell @@ -553,7 +553,7 @@ other types of metals and chemistry for reagents). id = "stunshell" req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3) materials = list(DEFAULT_WALL_MATERIAL = 4000) - build_path = /obj/item/ammo_casing/shotgun/stunshell + build_path = /obj/item/ammo_casing/a12g/stunshell sort_string = "TAACB" /datum/design/item/weapon/chemsprayer diff --git a/code/modules/research/designs_vr.dm b/code/modules/research/designs_vr.dm index 07285cf921c..26ef3f619e5 100644 --- a/code/modules/research/designs_vr.dm +++ b/code/modules/research/designs_vr.dm @@ -29,6 +29,22 @@ build_path = /obj/item/weapon/gun/energy/sizegun sort_string = "TAAAB" +/datum/design/item/bluespace_jumpsuit + name = "Bluespace jumpsuit" + id = "bsjumpsuit" + req_tech = list(TECH_BLUESPACE = 2, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/clothing/under/bluespace + sort_string = "TAAAC" + +/datum/design/item/sleevemate + name = "SleeveMate 3200" + id = "sleevemate" + req_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 2, TECH_BIO = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) + build_path = /obj/item/device/sleevemate + sort_string = "TAAAD" + /datum/design/item/item/pressureinterlock name = "APP pressure interlock" id = "pressureinterlock" @@ -77,6 +93,14 @@ build_path = /obj/item/device/universal_translator/ear sort_string = "HABBB" +/datum/design/item/nif + name = "nanite implant framework" + id = "nif" + req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 8000, "uranium" = 6000, "diamond" = 6000) + build_path = /obj/item/device/nif + sort_string = "HABBC" + // Resleeving Circuitboards /datum/design/circuit/transhuman_clonepod diff --git a/code/modules/resleeving/_defines.dm b/code/modules/resleeving/_defines.dm deleted file mode 100644 index a3cf1fc6656..00000000000 --- a/code/modules/resleeving/_defines.dm +++ /dev/null @@ -1,3 +0,0 @@ -#define MR_NORMAL 0 -#define MR_UNSURE 1 -#define MR_DEAD 2 \ No newline at end of file diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm index 69131b0b10c..6fcef5739a3 100644 --- a/code/modules/resleeving/computers.dm +++ b/code/modules/resleeving/computers.dm @@ -12,7 +12,6 @@ var/menu = 1 //Which menu screen to display var/datum/transhuman/body_record/active_br = null var/datum/transhuman/mind_record/active_mr = null - var/datum/transhuman/infocore/TC //Easy debugging access var/organic_capable = 1 var/synthetic_capable = 1 var/obj/item/weapon/disk/transcore/disk @@ -20,11 +19,10 @@ /obj/machinery/computer/transhuman/resleeving/initialize() ..() updatemodules() - TC = transcore /obj/machinery/computer/transhuman/resleeving/Destroy() releasepods() - ..() + return ..() /obj/machinery/computer/transhuman/resleeving/proc/updatemodules() releasepods() @@ -72,7 +70,7 @@ P.connected = src P.name = "[initial(P.name)] #[pods.len]" user << "You connect [P] to [src]." - else if(istype(W, /obj/item/weapon/disk/transcore) && TC && !TC.core_dumped) + else if(istype(W, /obj/item/weapon/disk/transcore) && SStranscore && !SStranscore.core_dumped) user.unEquip(W) disk = W disk.forceMove(src) @@ -112,13 +110,13 @@ var/data[0] var/bodyrecords_list_ui[0] - for(var/N in TC.body_scans) - var/datum/transhuman/body_record/BR = TC.body_scans[N] + for(var/N in SStranscore.body_scans) + var/datum/transhuman/body_record/BR = SStranscore.body_scans[N] bodyrecords_list_ui[++bodyrecords_list_ui.len] = list("name" = N, "recref" = "\ref[BR]") var/mindrecords_list_ui[0] - for(var/N in TC.backed_up) - var/datum/transhuman/mind_record/MR = TC.backed_up[N] + for(var/N in SStranscore.backed_up) + var/datum/transhuman/mind_record/MR = SStranscore.backed_up[N] mindrecords_list_ui[++mindrecords_list_ui.len] = list("name" = N, "recref" = "\ref[MR]") var/pods_list_ui[0] @@ -197,7 +195,7 @@ data["spodsLen"] = spods.len data["sleeversLen"] = sleevers.len data["temp"] = temp - data["coredumped"] = transcore.core_dumped + data["coredumped"] = SStranscore.core_dumped data["emergency"] = disk ? 1 : 0 ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -238,7 +236,7 @@ else if (href_list["coredump"]) if(disk) - transcore.core_dump(disk) + SStranscore.core_dump(disk) sleep(5) visible_message("\The [src] spits out \the [disk].") disk.forceMove(get_turf(src)) diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm index 3cf8d22cee5..c05668b9f95 100644 --- a/code/modules/resleeving/designer.dm +++ b/code/modules/resleeving/designer.dm @@ -15,19 +15,17 @@ var/icon/preview_icon = null // Mannequins are somewhat expensive to create, so cache it var/mob/living/carbon/human/dummy/mannequin/mannequin = null - var/datum/transhuman/infocore/TC //Easy debugging access var/obj/item/weapon/disk/body_record/disk = null /obj/machinery/computer/transhuman/designer/initialize() ..() - TC = transcore /obj/machinery/computer/transhuman/designer/Destroy() active_br = null preview_icon = null mannequin = null disk = null - ..() + return ..() /obj/machinery/computer/transhuman/designer/dismantle() if(disk) @@ -63,8 +61,8 @@ if(menu == "2") var/bodyrecords_list_ui[0] - for(var/N in TC.body_scans) - var/datum/transhuman/body_record/BR = TC.body_scans[N] + for(var/N in SStranscore.body_scans) + var/datum/transhuman/body_record/BR = SStranscore.body_scans[N] bodyrecords_list_ui[++bodyrecords_list_ui.len] = list("name" = N, "recref" = "\ref[BR]") if(bodyrecords_list_ui.len) data["bodyrecords"] = bodyrecords_list_ui @@ -241,8 +239,8 @@ return preview_icon /obj/machinery/computer/transhuman/designer/proc/update_preview_mob(var/mob/living/carbon/human/H) - ASSERT(!deleted(H)) - ASSERT(!deleted(active_br)) + ASSERT(!QDELETED(H)) + ASSERT(!QDELETED(active_br)) //log_debug("designer.update_preview_mob([H]) active_br = \ref[active_br]") //Get the DNA and generate a new mob var/datum/dna2/record/R = active_br.mydna diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm index d5e2dfac6a1..389673cfa59 100644 --- a/code/modules/resleeving/implant.dm +++ b/code/modules/resleeving/implant.dm @@ -32,8 +32,8 @@ if(other_imp && other_imp.imp_in == H) qdel(other_imp) //implant fight - if(H.mind) //One out here just in case they are dead - transcore.m_backup(H.mind) + if(H.mind && H.stat < DEAD) //One right now, on implanting. + SStranscore.m_backup(H.mind) last_attempt = world.time backup() @@ -49,7 +49,8 @@ BITSET(H.hud_updateflag, BACKUP_HUD) //Okay we've got a mind at least if(H == imp_in && H.mind && H.stat < DEAD) - transcore.m_backup(H.mind) + SStranscore.m_backup(H.mind,H.nif) + persist_nif_data(H) spawn(attempt_delay) backup() diff --git a/code/modules/resleeving/infocore.dm b/code/modules/resleeving/infocore_records.dm similarity index 59% rename from code/modules/resleeving/infocore.dm rename to code/modules/resleeving/infocore_records.dm index e03e3291a9b..b4b0ed36d24 100644 --- a/code/modules/resleeving/infocore.dm +++ b/code/modules/resleeving/infocore_records.dm @@ -6,97 +6,6 @@ /mob/living/carbon/human/var/resleeve_lock /mob/living/carbon/human/var/original_player -var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore - -//Mind-backup database -/datum/transhuman/infocore - var/overdue_time = 15 MINUTES - var/process_time = 1 MINUTE - var/core_dumped = 0 - - var/datum/transhuman/mind_record/list/backed_up = list() - var/datum/transhuman/mind_record/list/has_left = list() - var/datum/transhuman/body_record/list/body_scans = list() - -/datum/transhuman/infocore/New() - process() - -/datum/transhuman/infocore/proc/process() - if(core_dumped) return - for(var/N in backed_up) - var/datum/transhuman/mind_record/curr_MR = backed_up[N] - if(!curr_MR) - log_debug("Tried to process [N] in transcore w/o a record!") - continue - - var/since_backup = world.time - curr_MR.last_update - if(since_backup < overdue_time) - curr_MR.dead_state = MR_NORMAL - else - if(curr_MR.dead_state != MR_DEAD) //First time switching to dead - notify(N) - curr_MR.dead_state = MR_DEAD - - spawn(process_time) - process() - -/datum/transhuman/infocore/proc/m_backup(var/datum/mind/mind) - ASSERT(mind) - if(!mind.name || core_dumped) - return 0 - - var/datum/transhuman/mind_record/MR - - if(mind.name in backed_up) - MR = backed_up[mind.name] - MR.last_update = world.time - else - MR = new(mind, mind.current, 1) - - return 1 - -/datum/transhuman/infocore/proc/notify(var/name) - ASSERT(name) - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) - a.autosay("[name] is past-due for a mind backup. This will be the only notification.", "TransCore Oversight", "Medical") - qdel(a) - -/datum/transhuman/infocore/proc/add_backup(var/datum/transhuman/mind_record/MR) - ASSERT(MR) - backed_up[MR.mindname] = MR - backed_up = sortAssoc(backed_up) - log_debug("Added [MR.mindname] to transcore DB.") - -/datum/transhuman/infocore/proc/stop_backup(var/datum/transhuman/mind_record/MR) - ASSERT(MR) - has_left[MR.mindname] = MR - backed_up.Remove("[MR.mindname]") - MR.cryo_at = world.time - log_debug("Put [MR.mindname] in transcore suspended DB.") - -/datum/transhuman/infocore/proc/add_body(var/datum/transhuman/body_record/BR) - ASSERT(BR) - body_scans[BR.mydna.name] = BR - body_scans = sortAssoc(body_scans) - log_debug("Added [BR.mydna.name] to transcore body DB.") - -/datum/transhuman/infocore/proc/remove_body(var/datum/transhuman/body_record/BR) - ASSERT(BR) - body_scans.Remove("[BR.mydna.name]") - log_debug("Removed [BR.mydna.name] from transcore body DB.") - -/datum/transhuman/infocore/proc/core_dump(var/obj/item/weapon/disk/transcore/disk) - ASSERT(disk) - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) - a.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Command") - a.autosay("An emergency core dump has been initiated!", "TransCore Oversight", "Medical") - qdel(a) - - disk.stored += backed_up - backed_up.Cut() - core_dumped = 1 - return disk.stored.len - /////// Mind-backup record /////// /datum/transhuman/mind_record //User visible @@ -108,17 +17,22 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore //Backend var/ckey = "" - var/id_gender + var/id_gender = MALE var/datum/mind/mind_ref - var/cryo_at - var/languages - var/mind_oocnotes + var/cryo_at = 0 + var/languages = list() + var/mind_oocnotes = "" -/datum/transhuman/mind_record/New(var/datum/mind/mind,var/mob/living/carbon/human/M,var/obj/item/weapon/implant/backup/imp,var/add_to_db = 1) - ASSERT(mind && M && imp) + var/nif_path + var/nif_durability + var/list/nif_software - if(!istype(M)) - return //Only works with humanoids. + var/one_time = FALSE + +/datum/transhuman/mind_record/New(var/datum/mind/mind, var/mob/living/carbon/human/M, var/add_to_db = TRUE, var/one_time = FALSE) + ASSERT(mind) + + src.one_time = one_time //The mind! mind_ref = mind @@ -128,14 +42,15 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore cryo_at = 0 //Mental stuff the game doesn't keep mentally - id_gender = M.identifying_gender - languages = M.languages.Copy() - mind_oocnotes = M.ooc_notes + if(istype(M)) + id_gender = M.identifying_gender + languages = M.languages.Copy() + mind_oocnotes = M.ooc_notes last_update = world.time if(add_to_db) - transcore.add_backup(src) + SStranscore.add_backup(src) /////// Body Record /////// /datum/transhuman/body_record @@ -169,10 +84,10 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore mind_ref = null limb_data.Cut() organ_data.Cut() - ..() + return QDEL_HINT_HARDDEL // For now at least there is no easy way to clear references to this in machines etc. /datum/transhuman/body_record/proc/init_from_mob(var/mob/living/carbon/human/M, var/add_to_db = 0, var/ckeylock = 0) - ASSERT(!deleted(M)) + ASSERT(!QDELETED(M)) ASSERT(istype(M)) //Person OOCly doesn't want people impersonating them @@ -249,7 +164,7 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore organ_data[org] = I.robotic if(add_to_db) - transcore.add_body(src) + SStranscore.add_body(src) /** @@ -259,7 +174,7 @@ var/datum/transhuman/infocore/transcore = new/datum/transhuman/infocore * or anything like that! This is the computer science concept of "cloning" a data structure! */ /datum/transhuman/body_record/proc/init_from_br(var/datum/transhuman/body_record/orig) - ASSERT(!deleted(orig)) + ASSERT(!QDELETED(orig)) ASSERT(istype(orig)) src.mydna = new () src.mydna.dna = orig.mydna.dna.Clone() diff --git a/code/modules/resleeving/infomorph.dm b/code/modules/resleeving/infomorph.dm index 4378468ff77..182e05768f2 100644 --- a/code/modules/resleeving/infomorph.dm +++ b/code/modules/resleeving/infomorph.dm @@ -403,9 +403,9 @@ var/list/infomorph_emotions = list( close_up() //Resleeving 'cryo' - if(mind && (mind.name in transcore.backed_up)) - var/datum/transhuman/mind_record/MR = transcore.backed_up[mind.name] - transcore.stop_backup(MR) + if(mind && (mind.name in SStranscore.backed_up)) + var/datum/transhuman/mind_record/MR = SStranscore.backed_up[mind.name] + SStranscore.stop_backup(MR) card.removePersonality() clear_client() @@ -603,7 +603,7 @@ var/global/list/default_infomorph_software = list() //Only every so often if(air_master.current_cycle%30 == 1) - transcore.m_backup(mind) + SStranscore.m_backup(mind) if(health <= 0) death(null,"gives one shrill beep before falling lifeless.") diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index abab41e929a..c36f32f109a 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -503,6 +503,16 @@ occupant.identifying_gender = MR.id_gender occupant.ooc_notes = MR.mind_oocnotes occupant.apply_vore_prefs() //Cheap hack for now to give them SOME bellies. + if(MR.one_time) + var/how_long = round((world.time - MR.last_update)/10/60) + to_chat(occupant,"Your mind backup was a 'one-time' backup. \ + You will not be able to remember anything since the backup, [how_long] minutes ago.") + + //Re-supply a NIF if one was backed up with them. + if(MR.nif_path) + var/obj/item/device/nif/nif = new MR.nif_path(occupant,MR.nif_durability) + for(var/path in MR.nif_software) + new path(nif) // If it was a custom sleeve (not owned by anyone), update namification sequences if(!occupant.original_player) diff --git a/code/modules/resleeving/sleevecard.dm b/code/modules/resleeving/sleevecard.dm index b766c65e667..46143e7b728 100644 --- a/code/modules/resleeving/sleevecard.dm +++ b/code/modules/resleeving/sleevecard.dm @@ -16,7 +16,6 @@ var/obj/item/device/radio/sleevecard/radio var/mob/living/silicon/infomorph/infomorph - var/datum/mind/sleeved var/current_emotion = 1 matter = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 4000) @@ -36,7 +35,9 @@ /obj/item/device/sleevecard/Destroy() if(!isnull(infomorph)) infomorph.death(0) - ..() + infomorph = null + qdel_null(radio) + return ..() /obj/item/device/sleevecard/attack_self(mob/user) add_fingerprint(user) diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 48721314294..d7ce2063b25 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -55,7 +55,7 @@ check_failure() set_opacity(1) - spawn(20) if(!deleted(src)) set_opacity(0) + spawn(20) if(!QDELETED(src)) set_opacity(0) ..() @@ -64,7 +64,7 @@ ..() check_failure() set_opacity(1) - spawn(20) if(!deleted(src)) set_opacity(0) + spawn(20) if(!QDELETED(src)) set_opacity(0) /obj/machinery/shield/ex_act(severity) switch(severity) @@ -114,7 +114,7 @@ //The shield becomes dense to absorb the blow.. purely asthetic. set_opacity(1) - spawn(20) if(!deleted(src)) set_opacity(0) + spawn(20) if(!QDELETED(src)) set_opacity(0) ..() return diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 59f2f02ab65..5dc6af651d3 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -32,13 +32,12 @@ my_gen.field.Remove(src) my_gen = null var/turf/current_loc = get_turf(src) - spawn(1) // Updates neightbors after we're gone. - for(var/direction in cardinal) - var/turf/T = get_step(current_loc, direction) - if(T) - for(var/obj/effect/energy_field/F in T) - F.update_icon() - ..() + . = ..() + for(var/direction in cardinal) + var/turf/T = get_step(current_loc, direction) + if(T) + for(var/obj/effect/energy_field/F in T) + F.update_icon() /obj/effect/energy_field/ex_act(var/severity) adjust_strength(-(4 - severity) * 4) diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 1b50407be55..4592140d0d2 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -38,10 +38,8 @@ ..() /obj/machinery/shield_gen/Destroy() - for(var/obj/effect/energy_field/D in field) - field.Remove(D) - D.loc = null - ..() + qdel_null_list(field) + return ..() /obj/machinery/shield_gen/emag_act(var/remaining_charges, var/mob/user) if(prob(75)) diff --git a/code/modules/shuttles/_defines.dm b/code/modules/shuttles/_defines.dm new file mode 100644 index 00000000000..ad8c39466b4 --- /dev/null +++ b/code/modules/shuttles/_defines.dm @@ -0,0 +1,4 @@ +#define SHUTTLE_FLAGS_NONE 0 +#define SHUTTLE_FLAGS_PROCESS 1 +#define SHUTTLE_FLAGS_SUPPLY 2 +#define SHUTTLE_FLAGS_ALL (~SHUTTLE_FLAGS_NONE) \ No newline at end of file diff --git a/code/modules/shuttles/crashes.dm b/code/modules/shuttles/crashes.dm index 0e190c53990..eaf7e06019e 100644 --- a/code/modules/shuttles/crashes.dm +++ b/code/modules/shuttles/crashes.dm @@ -6,6 +6,12 @@ var/list/crash_areas = null var/crash_message = "Oops. The shuttle blew up." // Announcement made when shuttle crashes +/datum/shuttle/New() + if(crash_areas) + for(var/i in 1 to crash_areas.len) + crash_areas[i] = locate(crash_areas[i]) + ..() + // Return 0 to let the jump continue, 1 to abort the jump. // Default implementation checks if the shuttle should crash and if so crashes it. /datum/shuttle/proc/process_longjump(var/area/origin, var/area/intended_destination, var/direction) diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index fd6aabc4a23..b832e94dbd5 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -1,16 +1,24 @@ /datum/shuttle/ferry/escape_pod var/datum/computer/file/embedded_program/docking/simple/escape_pod/arming_controller + category = /datum/shuttle/ferry/escape_pod + +/datum/shuttle/ferry/escape_pod/New() + move_time = move_time + rand(-30, 60) + if(name in emergency_shuttle.escape_pods) + CRASH("An escape pod with the name '[name]' has already been defined.") + emergency_shuttle.escape_pods[name] = src + ..() /datum/shuttle/ferry/escape_pod/init_docking_controllers() ..() arming_controller = locate(dock_target_station) if(!istype(arming_controller)) - world << "warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!" - + warning("warning: escape pod with station dock tag [dock_target_station] could not find it's dock target!") + if(docking_controller) var/obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/controller_master = docking_controller.master if(!istype(controller_master)) - world << "warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!" + warning("warning: escape pod with docking tag [docking_controller_tag] could not find it's controller master!") else controller_master.pod = src @@ -29,7 +37,7 @@ /datum/shuttle/ferry/escape_pod/can_cancel() return 0 - + //This controller goes on the escape pod itself /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod name = "escape pod controller" @@ -58,7 +66,7 @@ /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod/Topic(href, href_list) if(..()) return 1 - + if("manual_arm") pod.arming_controller.arm() if("force_launch") @@ -87,7 +95,7 @@ if (istype(docking_program, /datum/computer/file/embedded_program/docking/simple/escape_pod)) var/datum/computer/file/embedded_program/docking/simple/escape_pod/P = docking_program armed = P.armed - + data = list( "docking_status" = docking_program.get_docking_status(), "override_enabled" = docking_program.override_enabled, diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 589f3b698cc..746dc256a62 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -4,6 +4,7 @@ //shuttle moving state defines are in setup.dm /datum/shuttle + var/name = "" var/warmup_time = 0 var/moving_status = SHUTTLE_IDLE @@ -12,6 +13,28 @@ var/arrive_time = 0 //the time at which the shuttle arrives when long jumping + var/flags = SHUTTLE_FLAGS_PROCESS + var/category = /datum/shuttle + +/datum/shuttle/New() + ..() + if(src.name in shuttle_controller.shuttles) + CRASH("A shuttle with the name '[name]' is already defined.") + shuttle_controller.shuttles[src.name] = src + if(flags & SHUTTLE_FLAGS_PROCESS) + shuttle_controller.process_shuttles += src + if(flags & SHUTTLE_FLAGS_SUPPLY) + if(supply_controller.shuttle) + CRASH("A supply shuttle is already defined.") + supply_controller.shuttle = src + +/datum/shuttle/Destroy() + shuttle_controller.shuttles -= src.name + shuttle_controller.process_shuttles -= src + if(supply_controller.shuttle == src) + supply_controller.shuttle = null + . = ..() + /datum/shuttle/proc/init_docking_controllers() if(docking_controller_tag) docking_controller = locate(docking_controller_tag) diff --git a/code/modules/shuttles/shuttle_emergency.dm b/code/modules/shuttles/shuttle_emergency.dm index beea1781b43..347243ae5cf 100644 --- a/code/modules/shuttles/shuttle_emergency.dm +++ b/code/modules/shuttles/shuttle_emergency.dm @@ -1,5 +1,11 @@ /datum/shuttle/ferry/emergency - //pass + category = /datum/shuttle/ferry/emergency + +/datum/shuttle/ferry/emergency/New() + if(emergency_shuttle.shuttle) + CRASH("An emergency shuttle has already been defined.") + emergency_shuttle.shuttle = src + ..() /datum/shuttle/ferry/emergency/arrived() if (istype(in_use, /obj/machinery/computer/shuttle_control/emergency)) diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm index 0a288a1ba9a..d0763577357 100644 --- a/code/modules/shuttles/shuttle_ferry.dm +++ b/code/modules/shuttles/shuttle_ferry.dm @@ -11,13 +11,21 @@ var/move_time = 0 //the time spent in the transition area var/transit_direction = null //needed for area/move_contents_to() to properly handle shuttle corners - not exactly sure how it works. - var/area_station - var/area_offsite + var/area/area_station + var/area/area_offsite //TODO: change location to a string and use a mapping for area and dock targets. var/dock_target_station var/dock_target_offsite var/last_dock_attempt_time = 0 + category = /datum/shuttle/ferry + +/datum/shuttle/ferry/New() + area_offsite = locate(area_offsite) + area_station = locate(area_station) + if(area_transition) + area_transition = locate(area_transition) + ..() /datum/shuttle/ferry/short_jump(var/area/origin,var/area/destination) if(isnull(location)) diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm index 434bb37f42b..d9cc121f790 100644 --- a/code/modules/shuttles/shuttle_specops.dm +++ b/code/modules/shuttles/shuttle_specops.dm @@ -13,16 +13,17 @@ var/docking_controller_tag_offsite var/datum/computer/file/embedded_program/docking/docking_controller_station var/datum/computer/file/embedded_program/docking/docking_controller_offsite + category = /datum/shuttle/ferry/multidock /datum/shuttle/ferry/multidock/init_docking_controllers() if(docking_controller_tag_station) docking_controller_station = locate(docking_controller_tag_station) if(!istype(docking_controller_station)) - world << "warning: shuttle with docking tag [docking_controller_station] could not find it's controller!" + warning("warning: shuttle with docking tag [docking_controller_station] could not find it's controller!") if(docking_controller_tag_offsite) docking_controller_offsite = locate(docking_controller_tag_offsite) if(!istype(docking_controller_offsite)) - world << "warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!" + warning("warning: shuttle with docking tag [docking_controller_offsite] could not find it's controller!") if (!location) docking_controller = docking_controller_station else @@ -43,6 +44,7 @@ var/reset_time = 0 //the world.time at which the shuttle will be ready to move again. var/launch_prep = 0 var/cancel_countdown = 0 + category = /datum/shuttle/ferry/multidock/specops /datum/shuttle/ferry/multidock/specops/New() ..() diff --git a/code/modules/shuttles/shuttle_supply.dm b/code/modules/shuttles/shuttle_supply.dm index c4122434e76..9a6b7f33801 100644 --- a/code/modules/shuttles/shuttle_supply.dm +++ b/code/modules/shuttles/shuttle_supply.dm @@ -2,11 +2,12 @@ var/away_location = 1 //the location to hide at while pretending to be in-transit var/late_chance = 80 var/max_late_time = 300 + category = /datum/shuttle/ferry/supply /datum/shuttle/ferry/supply/short_jump(var/area/origin,var/area/destination) if(moving_status != SHUTTLE_IDLE) return - + if(isnull(location)) return @@ -18,21 +19,21 @@ //it would be cool to play a sound here moving_status = SHUTTLE_WARMUP spawn(warmup_time*10) - if (moving_status == SHUTTLE_IDLE) + if (moving_status == SHUTTLE_IDLE) return //someone cancelled the launch - + if (at_station() && forbidden_atoms_check()) //cancel the launch because of forbidden atoms. announce over supply channel? moving_status = SHUTTLE_IDLE return - + if (!at_station()) //at centcom supply_controller.buy() - + //We pretend it's a long_jump by making the shuttle stay at centcom for the "in-transit" period. var/area/away_area = get_location_area(away_location) moving_status = SHUTTLE_INTRANSIT - + //If we are at the away_area then we are just pretending to move, otherwise actually do the move if (origin != away_area) move(origin, away_area) @@ -46,11 +47,11 @@ //late if (prob(late_chance)) sleep(rand(0,max_late_time)) - + move(away_area, destination) - + moving_status = SHUTTLE_IDLE - + if (!at_station()) //at centcom supply_controller.sell() @@ -58,7 +59,7 @@ /datum/shuttle/ferry/supply/proc/forbidden_atoms_check() if (!at_station()) return 0 //if badmins want to send mobs or a nuke on the supply shuttle from centcom we don't care - + return supply_controller.forbidden_atoms_check(get_location_area()) /datum/shuttle/ferry/supply/proc/at_station() diff --git a/code/modules/shuttles/shuttles_multi.dm b/code/modules/shuttles/shuttles_multi.dm index 15d8a65d56c..7d0d7c1df24 100644 --- a/code/modules/shuttles/shuttles_multi.dm +++ b/code/modules/shuttles/shuttles_multi.dm @@ -1,6 +1,7 @@ //This is a holder for things like the Skipjack and Nuke shuttle. /datum/shuttle/multi_shuttle + flags = SHUTTLE_FLAGS_NONE var/cloaked = 1 var/at_origin = 1 var/returned_home = 0 @@ -23,7 +24,13 @@ var/area/origin var/return_warning = 0 var/legit = 0 //VOREStation Add - Whether or not a shuttle is a legit NT shuttle. + category = /datum/shuttle/multi_shuttle + /datum/shuttle/multi_shuttle/New() + origin = locate(origin) + interim = locate(interim) + for(var/destination in destinations) + destinations[destination] = locate(destinations[destination]) ..() /datum/shuttle/multi_shuttle/init_docking_controllers() @@ -36,7 +43,7 @@ var/datum/computer/file/embedded_program/docking/C = locate(controller_tag) if(!istype(C)) - world << "warning: shuttle with docking tag [controller_tag] could not find it's controller!" + warning("warning: shuttle with docking tag [controller_tag] could not find it's controller!") else destination_dock_controllers[destination] = C diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index 88da3ad8420..df5d625a2e8 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -23,8 +23,11 @@ #define DAMAGE_RATE_LIMIT 3 //damage rate cap at power = 300, scales linearly with power -//These would be what you would get at point blank, decreases with distance -#define DETONATION_RADS 200 +// Base variants are applied to everyone on the same Z level +// Range variants are applied on per-range basis: numbers here are on point blank, it scales with the map size (assumes square shaped Z levels) +#define DETONATION_RADS 20 +#define DETONATION_HALLUCINATION_BASE 300 +#define DETONATION_HALLUCINATION_RANGE 300 #define DETONATION_HALLUCINATION 600 @@ -95,6 +98,11 @@ anchored = 1 grav_pulling = 1 exploded = 1 + var/turf/TS = get_turf(src) // The turf supermatter is on. SM being in a locker, mecha, or other container shouldn't block it's effects that way. + if(!TS) + return + for(var/z in GetConnectedZlevels(TS.z)) + radiation_repository.z_radiate(locate(1, 1, z), DETONATION_RADS, 1) for(var/mob/living/mob in living_mob_list) var/turf/T = get_turf(mob) if(T && (loc.z == T.z)) @@ -102,8 +110,6 @@ //Hilariously enough, running into a closet should make you get hit the hardest. var/mob/living/carbon/human/H = mob H.hallucination += max(50, min(300, DETONATION_HALLUCINATION * sqrt(1 / (get_dist(mob, src) + 1)) ) ) - var/rads = DETONATION_RADS * sqrt( 1 / (get_dist(mob, src) + 1) ) - mob.apply_effect(rads, IRRADIATE) spawn(pull_time) explosion(get_turf(src), explosion_power, explosion_power * 2, explosion_power * 3, explosion_power * 4, 1) qdel(src) @@ -252,12 +258,15 @@ if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) // VOREStation Edit - Only mesons can protect you! l.hallucination = max(0, min(200, l.hallucination + power * config_hallucination_power * sqrt( 1 / max(1,get_dist(l, src)) ) ) ) +/* //adjusted range so that a power of 170 (pretty high) results in 9 tiles, roughly the distance from the core to the engine monitoring room. //note that the rads given at the maximum range is a constant 0.2 - as power increases the maximum range merely increases. for(var/mob/living/l in range(src, round(sqrt(power / 2)))) var/radius = max(get_dist(l, src), 1) var/rads = (power / 10) * ( 1 / (radius**2) ) l.apply_effect(rads, IRRADIATE) +*/ + radiation_repository.radiate(src, power * 1.5) //Better close those shutters! power -= (power/DECAY_FACTOR)**3 //energy losses due to radiation @@ -371,9 +380,8 @@ "The unearthly ringing subsides and you notice you have new radiation burns.", 2) else l.show_message("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns.", 2) - var/rads = 500 * sqrt( 1 / (get_dist(l, src) + 1) ) - l.apply_effect(rads, IRRADIATE) - + var/rads = 500 + radiation_repository.radiate(src, rads) /obj/machinery/power/supermatter/proc/supermatter_pull() //following is adapted from singulo code diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 3e49482c75f..5b264890496 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -13,22 +13,22 @@ return affected && affected.open == (affected.encased ? 3 : 2) && !(affected.status & ORGAN_BLEEDING) proc/get_max_wclass(var/obj/item/organ/external/affected) - switch (affected.name) - if ("head") - return 1 - if ("upper body") - return 3 - if ("lower body") - return 2 + switch (affected.organ_tag) + if (BP_HEAD) + return ITEMSIZE_TINY + if (BP_TORSO) + return ITEMSIZE_NORMAL + if (BP_GROIN) + return ITEMSIZE_SMALL return 0 proc/get_cavity(var/obj/item/organ/external/affected) - switch (affected.name) - if ("head") + switch (affected.organ_tag) + if (BP_HEAD) return "cranial" - if ("upper body") + if (BP_TORSO) return "thoracic" - if ("lower body") + if (BP_GROIN) return "abdominal" return "" @@ -136,6 +136,7 @@ user.drop_item() affected.implants += tool tool.loc = affected + if(istype(tool,/obj/item/device/nif)){var/obj/item/device/nif/N = tool;N.implant(target)} //VOREStation Add - NIF support affected.cavity = 0 ////////////////////////////////////////////////////////////////// @@ -207,6 +208,7 @@ var/obj/item/weapon/implant/imp = obj imp.imp_in = null imp.implanted = 0 + else if(istype(tool,/obj/item/device/nif)){var/obj/item/device/nif/N = tool;N.unimplant(target)} //VOREStation Add - NIF support else user.visible_message("\blue [user] removes \the [tool] from [target]'s [affected.name].", \ "\blue There's something inside [target]'s [affected.name], but you just missed it this time." ) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index 38b919823fa..19007addae9 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -1,5 +1,8 @@ /* SURGERY STEPS */ +/obj/ + var/surgery_odds = 0 // Used for tables/etc which can have surgery done of them. + /datum/surgery_step var/priority = 0 //steps with higher priority would be attempted first @@ -111,13 +114,28 @@ return 1 M.op_stage.in_progress += zone S.begin_step(user, M, zone, src) //start on it - //We had proper tools! (or RNG smiled.) and user did not move or change hands. - if(prob(S.tool_quality(src)) && do_mob(user, M, rand(S.min_duration, S.max_duration))) - S.end_step(user, M, zone, src) //finish successfully - else if ((src in user.contents) && user.Adjacent(M)) //or - S.fail_step(user, M, zone, src) //malpractice~ - else // This failing silently was a pain. - user << "You must remain close to your patient to conduct surgery." + var/success = TRUE + + // Bad tools make it less likely to succeed. + if(!prob(S.tool_quality(src))) + success = FALSE + + // Bad or no surface may mean failure as well. + var/obj/surface = M.get_surgery_surface() + if(!surface || !prob(surface.surgery_odds)) + success = FALSE + + // Not staying still fails you too. + if(success) + if(!do_mob(user, M, rand(S.min_duration, S.max_duration))) + success = FALSE + to_chat(user, "You must remain close to your patient to conduct surgery.") + + if(success) + S.end_step(user, M, zone, src) + else + S.fail_step(user, M, zone, src) + M.op_stage.in_progress -= zone // Clear the in-progress flag. if (ishuman(M)) var/mob/living/carbon/human/H = M diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 9348799a994..bf48f3540bd 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -10,6 +10,7 @@ var/list/table_icon_cache = list() climbable = 1 layer = 2.8 throwpass = 1 + surgery_odds = 66 var/flipped = 0 var/maxhealth = 10 var/health = 10 @@ -80,7 +81,7 @@ var/list/table_icon_cache = list() update_connections(1) // Update tables around us to ignore us (material=null forces no connections) for(var/obj/structure/table/T in oview(src, 1)) T.update_icon() - ..() + . = ..() /obj/structure/table/examine(mob/user) . = ..() diff --git a/code/modules/tables/update_triggers.dm b/code/modules/tables/update_triggers.dm index a90e3eeb8a2..b7c087f9c0f 100644 --- a/code/modules/tables/update_triggers.dm +++ b/code/modules/tables/update_triggers.dm @@ -6,12 +6,10 @@ /obj/structure/window/Destroy() var/oldloc = loc - loc=null + . = ..() for(var/obj/structure/table/T in view(oldloc, 1)) T.update_connections() T.update_icon() - loc=oldloc - ..() /obj/structure/window/Move() var/oldloc = loc diff --git a/code/modules/telesci/gps_advanced.dm b/code/modules/telesci/gps_advanced.dm index 7953b674d35..bd41cdf5348 100644 --- a/code/modules/telesci/gps_advanced.dm +++ b/code/modules/telesci/gps_advanced.dm @@ -19,9 +19,9 @@ var/global/list/GPS_list = list() name = "global positioning system ([gpstag])" overlays += "working" -/obj/item/device/gps/advanced/Del() +/obj/item/device/gps/advanced/Destroy() GPS_list.Remove(src) - ..() + . = ..() /obj/item/device/gps/advanced/emp_act(severity) emped = 1 diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 52356d04e19..1cda4165034 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -471,6 +471,13 @@ desc = "" icon_state = "succubus-black" +/datum/sprite_accessory/tail/doublekitsune + name = "double kitsune tail, colorable" + desc = "" + icon_state = "doublekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/tail/succubus_color name = "succubus, colorable (+wings)" desc = "" @@ -518,11 +525,19 @@ icon_state = "molenar-kitsune" ckeys_allowed = list("molenar") +/datum/sprite_accessory/tail/harpywings + name = "harpy wings, colorable" + desc = "" + icon_state = "harpywings" + do_colouration = 1 + show_species_tail = 1 + color_blend_mode = ICON_MULTIPLY + /datum/sprite_accessory/tail/liquidfirefly_gazer name = "gazer eyestalks (Liquidfirefly)" desc = "" icon_state = "liquidfirefly-eyestalks" - ckeys_allowed = list("liquidfirefly") + ckeys_allowed = list("liquidfirefly","seiga") /datum/sprite_accessory/tail/miria_fluffdragon name = "fluffdragon wings+tail (Miria Masters)" @@ -563,7 +578,13 @@ /datum/sprite_accessory/tail/rosey name = "tritail kitsune tails (Rosey)" desc = "" - icon_state = "rosey" + icon_state = "rosey_three" + ckeys_allowed = list("joey4298") + +/datum/sprite_accessory/tail/rosey2 + name = "pentatail kitsune tails (Rosey)" //I predict seven tails next. ~CK + desc = "" + icon_state = "rosey_five" ckeys_allowed = list("joey4298") /datum/sprite_accessory/tail/scree @@ -878,4 +899,11 @@ /datum/sprite_accessory/tail/taur/wolf/serdy name = "CyberSerdy (silencedmp5a5)" icon_state = "serdy_s" - ckeys_allowed = list("silencedmp5a5") \ No newline at end of file + ckeys_allowed = list("silencedmp5a5") + +//liquidfirefly: Ariana Scol +/datum/sprite_accessory/tail/taur/centipede + name = "Centipede (liquidfirefly)" + icon_state = "ariana_s" + ckeys_allowed = list("liquidfirefly") + do_colouration = 0 diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm index 902f6183c84..b62229bf6a8 100644 --- a/code/modules/vore/eating/belly_vr.dm +++ b/code/modules/vore/eating/belly_vr.dm @@ -142,15 +142,15 @@ var/mob/living/OW = owner if(ML.absorbed) ML.absorbed = 0 - ML.reagents = new/datum/reagents(1000,M) //Human reagent datums hold 1000 - if(OW.reagents && istype(OW.reagents,/datum/reagents)) //Does the pred have a reagents list? - var/datum/reagents/OR = owner.reagents + if(ishuman(M) && ishuman(OW)) + var/mob/living/carbon/human/Prey = M + var/mob/living/carbon/human/Pred = OW + // TODO - If we ever find a way to share reagent containers, un-share them here var/absorbed_count = 2 //Prey that we were, plus the pred gets a portion for(var/mob/living/P in internal_contents) if(P.absorbed) absorbed_count++ - - OR.trans_to(ML,OR.total_volume / absorbed_count) + Pred.bloodstr.trans_to(Prey, Pred.reagents.total_volume / absorbed_count) var/datum/belly/B = check_belly(owner) if(B) @@ -183,6 +183,8 @@ var/raw_message = pick(examine_messages) formatted_message = replacetext(raw_message,"%belly",lowertext(name)) + formatted_message = replacetext(formatted_message,"%pred",owner) + formatted_message = replacetext(formatted_message,"%prey",english_list(internal_contents)) return("[formatted_message]
") @@ -271,11 +273,12 @@ _handle_digested_item(W,M) //Reagent transfer - if(M.reagents && istype(M.reagents,/datum/reagents)) - var/mob/living/OW = owner - if(OW.reagents && istype(OW.reagents,/datum/reagents)) //Does the pred have a reagents list to give to? - var/datum/reagents/RL = M.reagents - RL.trans_to(owner,RL.total_volume*0.5) + if(ishuman(M) && ishuman(owner)) + var/mob/living/carbon/human/Pred = owner + var/mob/living/carbon/human/Prey = M + Prey.bloodstr.trans_to_holder(Pred.bloodstr, Prey.bloodstr.total_volume, 0.5, TRUE) // Copy=TRUE because we're deleted anyway + Prey.ingested.trans_to_holder(Pred.bloodstr, Prey.ingested.total_volume, 0.5, TRUE) // Therefore don't bother spending cpu + Prey.touching.trans_to_holder(Pred.bloodstr, Prey.touching.total_volume, 0.5, TRUE) // On updating the prey's reagents // Delete the digested mob qdel(M) @@ -323,16 +326,17 @@ M.absorbed = 1 M << "[owner]'s [name] absorbs your body, making you part of them." owner << "Your [name] absorbs [M]'s body, making them part of you." - var/mob/living/OW = owner - //Reagent sharing for absorbed with pred - if(OW.reagents && istype(OW.reagents,/datum/reagents)) //Does the pred have a reagent list? - if(M.reagents && istype(M.reagents,/datum/reagents)) //Does the prey have a reagent list? - var/datum/reagents/OR = owner.reagents - var/datum/reagents/PR = M.reagents - PR.trans_to(owner,PR.total_volume) - M.reagents = OR - del(PR) + if(ishuman(M) && ishuman(owner)) + var/mob/living/carbon/human/Prey = M + var/mob/living/carbon/human/Pred = owner + //Reagent sharing for absorbed with pred - Copy so both pred and prey have these reagents. + Prey.bloodstr.trans_to_holder(Pred.bloodstr, Prey.bloodstr.total_volume, copy = TRUE) + Prey.ingested.trans_to_holder(Pred.bloodstr, Prey.ingested.total_volume, copy = TRUE) + Prey.touching.trans_to_holder(Pred.bloodstr, Prey.touching.total_volume, copy = TRUE) + // TODO - Find a way to make the absorbed prey share the effects with the pred. + // Currently this is infeasible because reagent containers are designed to have a single my_atom, and we get + // problems when A absorbs B, and then C absorbs A, resulting in B holding onto an invalid reagent container. //This is probably already the case, but for sub-prey, it won't be. M.forceMove(owner) diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 0836ef18918..2a14eb0a895 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -22,7 +22,7 @@ return //Pretty boring, huh //////////////////////////// DM_DIGEST //////////////////////////// - if(digest_mode == DM_DIGEST) + if(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB) if(prob(50)) //Was SO OFTEN. AAAA. var/churnsound = pick(digestion_sounds) @@ -60,6 +60,11 @@ owner.update_icons() continue + if(digest_mode == DM_DIGEST_NUMB && ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.bloodstr.get_reagent_amount("numbenzyme") < 5) + H.bloodstr.add_reagent("numbenzyme",10) + // Deal digestion damage (and feed the pred) if(!(M.status_flags & GODMODE)) M.adjustBruteLoss(digest_brute) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 686be7572d9..81dd22e43b4 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -12,14 +12,19 @@ var/reviving = 0 // Only used for creatures that have the xenochimera regen ability, so far. var/metabolism = 0.0015 var/vore_taste = null // What the character tastes like + var/no_vore = 0 // If the character/mob can vore. // // Hook for generic creation of stuff on new creatures // /hook/living_new/proc/vore_setup(mob/living/M) - M.verbs += /mob/living/proc/insidePanel M.verbs += /mob/living/proc/escapeOOC M.verbs += /mob/living/proc/lick + if(M.no_vore) //If the mob isn's supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. + M << "The creature that you are can not eat others." + return 1 + M.verbs += /mob/living/proc/insidePanel + M.appearance_flags |= PIXEL_SCALE //Tries to load prefs if a client is present otherwise gives freebie stomach @@ -273,8 +278,8 @@ // OOC Escape code for pref-breaking or AFK preds // /mob/living/proc/escapeOOC() - set name = "OOC escape" - set category = "Vore" + set name = "OOC Escape" + set category = "OOC" //You're in an animal! if(istype(src.loc,/mob/living/simple_animal)) @@ -424,9 +429,12 @@ // This is about 0.896m^3 of atmosphere /datum/gas_mixture/belly_air - volume = 1000 - gas = list( - "oxygen" = 21, - "nitrogen" = 79) - temperature = 293.150 - total_moles = 40 + volume = 1000 + temperature = 293.150 + total_moles = 40 + +/datum/gas_mixture/belly_air/New() + . = ..() + gas = list( + "oxygen" = 21, + "nitrogen" = 79) diff --git a/code/modules/vore/eating/silicon_vr.dm b/code/modules/vore/eating/silicon_vr.dm index d02bb1ace23..3cbb1c0e66f 100644 --- a/code/modules/vore/eating/silicon_vr.dm +++ b/code/modules/vore/eating/silicon_vr.dm @@ -11,6 +11,10 @@ color = HOLO_ORIGINAL_COLOR //This is the blue from icons.dm that it was before. desc = "A hologram representing an AI persona." +/obj/effect/overlay/aiholo/Destroy() + walk(src, 0) // Because we might have called walk_to, we must stop the walk loop or BYOND keeps an internal reference to us forever. + return ..() + /obj/effect/overlay/aiholo/proc/get_prey(var/mob/living/prey) if(bellied) return playsound('sound/effects/stealthoff.ogg',50,0) @@ -39,11 +43,11 @@ /obj/effect/overlay/aiholo/Destroy() drop_prey() - ..() + return ..() /mob/living/silicon/ai/verb/holo_nom() set name = "Hardlight Nom" - set category = "Vore" + set category = "AI Commands" set desc = "Wrap up a person in hardlight holograms." // Wrong state diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index 099ed49767d..72c131f6133 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -8,7 +8,7 @@ // /mob/living/proc/animal_nom(var/mob/living/T in oview(1)) set name = "Animal Nom" - set category = "Vore" + set category = "IC" set desc = "Since you can't grab, you get a verb!" if (stat != CONSCIOUS) @@ -23,7 +23,7 @@ /mob/living/simple_animal/verb/toggle_digestion() set name = "Toggle Animal's Digestion" set desc = "Enables digestion on this mob for 20 minutes." - set category = "Vore" + set category = "OOC" set src in oview(1) var/mob/living/carbon/human/user = usr diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index e186b8ec841..b73e021eb34 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -10,7 +10,7 @@ /mob/living/proc/insidePanel() set name = "Vore Panel" - set category = "Vore" + set category = "IC" var/datum/vore_look/picker_holder = new() picker_holder.loop = picker_holder @@ -31,6 +31,11 @@ var/datum/browser/popup var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action. +/datum/vore_look/Destroy() + loop = null + selected = null + return QDEL_HINT_HARDDEL // TODO - Until I can better analyze how this weird thing works, lets be safe + /datum/vore_look/Topic(href,href_list[]) if (vp_interact(href, href_list)) popup.set_content(gen_ui(usr)) @@ -243,7 +248,7 @@ for(var/H in href_list) if(href_list["close"]) - del(src) // Cleanup + qdel(src) // Cleanup return if(href_list["show_int"]) @@ -451,6 +456,9 @@ if(href_list["b_mode"]) var/list/menu_list = selected.digest_modes if(istype(usr,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = usr + if(H.species.vore_numbing) + menu_list += DM_DIGEST_NUMB menu_list += selected.transform_modes if(selected.digest_modes.len == 1) // Don't do anything @@ -514,7 +522,7 @@ selected.set_messages(new_message,"smi") if("Examine Message (when full)") - var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging'). Do not use %pred or %prey in this type."+help,"Examine Message (when full)",selected.get_messages("em")) as message + var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",selected.get_messages("em")) as message if(new_message) selected.set_messages(new_message,"em") diff --git a/code/modules/vore/fluffstuff/custom_boxes_vr.dm b/code/modules/vore/fluffstuff/custom_boxes_vr.dm index a1ef6d8dd53..2a0275a01b6 100644 --- a/code/modules/vore/fluffstuff/custom_boxes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_boxes_vr.dm @@ -163,32 +163,30 @@ New() ..() //Might look like a lot... but all small items. - new /obj/item/weapon/reagent_containers/hypospray/vr/fluff/aronai(src) - new /obj/item/weapon/reagent_containers/glass/beaker/vial/vr/fluff/aro_st(src) - new /obj/item/weapon/reagent_containers/glass/beaker/vial/vr/fluff/aro_bt(src) - new /obj/item/weapon/reagent_containers/glass/beaker/vial/vr/fluff/aro_bu(src) - new /obj/item/weapon/reagent_containers/glass/beaker/vial/vr/fluff/aro_tx(src) //Centcom stuff and permit new /obj/item/weapon/card/id/centcom/fluff/aronai(src) new /obj/item/fluff/permit/aronai_kadigan(src) - new /obj/item/clothing/glasses/omnihud/med/fluff/aronai(src) //Gun and holster - new /obj/item/weapon/gun/energy/netgun(src) - new /obj/item/clothing/accessory/holster/leg(src) + new /obj/item/weapon/gun/projectile/nsfw(src) + new /obj/item/ammo_magazine/nsfw_mag(src) + new /obj/item/ammo_casing/nsfw_batt/stun(src) + new /obj/item/ammo_casing/nsfw_batt/stun(src) + new /obj/item/ammo_casing/nsfw_batt/net(src) + new /obj/item/clothing/accessory/holster(src) //Aerowing:Sebastian Aji /obj/item/weapon/storage/box/fluff/sebastian_aji name = "Sebastian's Lumoco Arms P3 Box" has_items = list( /obj/item/weapon/gun/projectile/pistol, - /obj/item/ammo_magazine/mc9mm/flash, - /obj/item/ammo_magazine/mc9mm/flash, + /obj/item/ammo_magazine/m9mm/flash, + /obj/item/ammo_magazine/m9mm/flash, /obj/item/fluff/permit/sebastian_aji) /obj/item/weapon/storage/box/fluff/briana_moore name = "Briana's Derringer Box" has_items = list( - /obj/item/weapon/gun/projectile/derringer, + /obj/item/weapon/gun/projectile/derringer/fluff/briana, /obj/item/fluff/permit/briana_moore) diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index f163b8b4b07..4fcaeee5301 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -1221,6 +1221,25 @@ Departamental Swimsuits, for general use icon_state = "batter" item_state = "batter_mob" +/obj/item/clothing/suit/storage/hooded/wintercoat/jessie + name = "Handmade Winter Suit" + desc = "A durable, but somewhat ragged lower portion of a snow suit fitted for a wolftaur." + icon = 'icons/mob/taursuits_vr.dmi' + icon_override = 'icons/mob/taursuits_vr.dmi' + icon_state = "jessiecoat" + +/obj/item/clothing/suit/storage/hooded/wintercoat/jessie/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) + if(..()) + if(istype(H) && istype(H.tail_style, /datum/sprite_accessory/tail/taur/wolf)) + if(icon_state == "jessiecoat") + return ..() + icon_override = 'icons/mob/taursuits_vr.dmi' + icon_state = "jessiecoat" + pixel_x = -16 + return ..() + else + to_chat(H, "You need to have a wolf-taur half to wear this.") + return 0 //samanthafyre:Kateryna Petrovitch /obj/item/clothing/suit/armor/vest/wolftaur/kate diff --git a/code/modules/vore/fluffstuff/custom_guns_vr.dm b/code/modules/vore/fluffstuff/custom_guns_vr.dm index 3d723790973..7b0c810ce61 100644 --- a/code/modules/vore/fluffstuff/custom_guns_vr.dm +++ b/code/modules/vore/fluffstuff/custom_guns_vr.dm @@ -67,7 +67,7 @@ item_state = "haloshotgun_i" item_icons = null - ammo_type = /obj/item/ammo_casing/shotgun + ammo_type = /obj/item/ammo_casing/a12g max_shells = 12 // jertheace : Jeremiah 'Ace' Acacius @@ -75,7 +75,7 @@ name = "Ace's M45D Tactical Shotgun" // D-model holds half as many shells as the normal version so as not to be OP as shit. Better than shotgun, worse than combat shotgun. desc = "Owned by the respected (or feared?) veteran Captain of VORE Station. Inscribed on the barrel are the words \"Speak softly, and carry a big stick.\" It has a folding stock so it can fit into bags." w_class = ITEMSIZE_NORMAL // Because collapsable stock so it fits in backpacks. - ammo_type = /obj/item/ammo_casing/shotgun/stunshell + ammo_type = /obj/item/ammo_casing/a12g/stunshell max_shells = 6 // bwoincognito:Tasald Corlethian @@ -146,7 +146,7 @@ icon_state = "jury" item_state = "gun" accuracy = 0 // Because I know you're not an idiot who needs to be nerfed. -Ace - ammo_type = /obj/item/ammo_casing/shotgun/beanbag + ammo_type = /obj/item/ammo_casing/a12g/beanbag // Dhaeleena : Dhaeleena M'iar /obj/item/weapon/gun/projectile/revolver/mateba/fluff/dhael @@ -166,8 +166,14 @@ icon_state = "model10" fire_sound = 'sound/weapons/deagle.ogg' origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) - ammo_type = /obj/item/ammo_casing/c38r //Rubber rounds. + ammo_type = /obj/item/ammo_casing/a38r //Rubber rounds. +// LuminescentRing : Briana Moore +/obj/item/weapon/gun/projectile/derringer/fluff/briana + name = "second-hand derringer" + desc = "It's a palm sized gun. One of the few things that won't break an angel's wrists." + caliber = "10mm" + ammo_type = /obj/item/ammo_casing/a10mm // For general use /obj/item/weapon/gun/projectile/automatic/stg @@ -180,8 +186,8 @@ max_shells = 30 caliber = "kurz" origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 2, TECH_ILLEGAL = 6) - magazine_type = /obj/item/ammo_magazine/stg - allowed_magazines = list(/obj/item/ammo_magazine/stg) + magazine_type = /obj/item/ammo_magazine/mtg + allowed_magazines = list(/obj/item/ammo_magazine/mtg) load_method = MAGAZINE /obj/item/weapon/gun/projectile/automatic/stg/update_icon(var/ignore_inhands) @@ -238,8 +244,8 @@ origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2) slot_flags = SLOT_BELT load_method = MAGAZINE - magazine_type = /obj/item/ammo_magazine/mc9mml - allowed_magazines = list(/obj/item/ammo_magazine/mc9mm, /obj/item/ammo_magazine/mc9mml) + magazine_type = /obj/item/ammo_magazine/m9mml + allowed_magazines = list(/obj/item/ammo_magazine/m9mm, /obj/item/ammo_magazine/m9mml) firemodes = list( list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), @@ -248,7 +254,7 @@ /obj/item/weapon/gun/projectile/automatic/pdw/update_icon(var/ignore_inhands) ..() - if(istype(ammo_magazine,/obj/item/ammo_magazine/mc9mm)) + if(istype(ammo_magazine,/obj/item/ammo_magazine/m9mm)) icon_state = "pdw-short" else icon_state = (ammo_magazine)? "pdw" : "pdw-empty" @@ -279,8 +285,8 @@ auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' hitsound = null caliber = "s762" - magazine_type = /obj/item/ammo_magazine/s762 - allowed_magazines = list(/obj/item/ammo_magazine/s762) + magazine_type = /obj/item/ammo_magazine/m762 + allowed_magazines = list(/obj/item/ammo_magazine/m762) /obj/item/weapon/gun/projectile/automatic/fluff/crestrose/attack_self(mob/user as mob) on = !on @@ -379,7 +385,7 @@ /obj/item/weapon/gun/projectile/automatic/carbine/fluff/g44/update_icon(var/ignore_inhands) ..() - // TODO - Fix this for spriting different size magazines + // TODO - Fix this for spriting different size magazines icon_state = (ammo_magazine)? "g44" : "g44-empty" item_state = (ammo_magazine)? "bullpup" : "bullpup-empty" if(!ignore_inhands) update_held_icon() @@ -430,123 +436,7 @@ name = "\improper MEUSOC .45" desc = "Some serious drywall work, coming up!" -//-----------------------KHI Common---------------------------------- -// // // Pistols -/obj/item/weapon/gun/projectile/khi/process_chambered() - if (!chambered) return - qdel(chambered) //Devours ammo rather than fires it. - -/obj/item/weapon/gun/projectile/khi/update_icon() - ..() - if(ammo_magazine) - icon_state = "[initial(icon_state)]" - else - icon_state = "[initial(icon_state)]-empty" - -// // // Automatics -/obj/item/weapon/gun/projectile/automatic/khi/process_chambered() - if (!chambered) return - qdel(chambered) //Devours ammo rather than fires it. - -/obj/item/weapon/gun/projectile/automatic/khi/update_icon() - ..() - if(ammo_magazine) - icon_state = "[initial(icon_state)]" - else - icon_state = "[initial(icon_state)]-empty" - -//-----------------------KHI Pistol---------------------------------- -/obj/item/weapon/gun/projectile/khi/pistol - name = "alien pistol" - desc = "This KHI handgun doesn't so much 'fire' .45 ammo as 'devour' it and make it's own proprietary ammunition." - icon = 'icons/obj/gun_vr.dmi' - icon_state = "khipistol" - item_state = "gun" // Placeholder - magazine_type = /obj/item/ammo_magazine/c45m/flash //Dun wanna KILL all the people. - allowed_magazines = list(/obj/item/ammo_magazine/c45m) - caliber = ".45" - handle_casings = CYCLE_CASINGS - origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5) - fire_sound = 'sound/weapons/semiauto.ogg' - load_method = MAGAZINE - dna_lock = 1 - -//-----------------------KHI PDW---------------------------------- -// For general use -/obj/item/weapon/gun/projectile/automatic/khi/pdw - name = "alien pdw" - desc = "The KHI personal defense mainstay. If KHI had any standards whatsoever, that is. Insert 9mm ammo for good times." - icon = 'icons/obj/gun_vr.dmi' - icon_state = "khipdw" - item_state = "c20r" // Placeholder - w_class = ITEMSIZE_NORMAL - caliber = "9mm" - origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 5) - slot_flags = SLOT_BELT - load_method = MAGAZINE - handle_casings = CYCLE_CASINGS - magazine_type = /obj/item/ammo_magazine/mc9mml - allowed_magazines = list(/obj/item/ammo_magazine/mc9mm, /obj/item/ammo_magazine/mc9mml) - dna_lock = 1 - - firemodes = list( - list(mode_name="semiauto", burst=1, fire_delay=0, move_delay=null, burst_accuracy=null, dispersion=null), - list(mode_name="3-round bursts", burst=3, fire_delay=null, move_delay=6, burst_accuracy=list(0,-1,-2), dispersion=list(0.0, 0.6, 0.6)) - ) - -//-----------------------KHI LIM Rifle---------------------------------- -//Unfinished -/obj/item/weapon/limrifle //Not even a subtype of gun because it behaves differently. - name = "lim rifle" - desc = "The KHI-101-R linear induction motor rifle can propel a small 2mm slug at extreme velocity through nearly any solid object. Whether it has the time to impart any force is another question entirely." - //icon = 'icons/obj/gun64_vr.dmi' - icon_state = "limrifle" - item_state = "gun" //Should probably be huge-r - //dna_lock = 1 - //safety_level = 1 - - var/charge_time = 5 SECONDS - var/charge_percent = 100 - -/obj/item/weapon/limrifle/New() - ..() - update_icon() - -/obj/item/weapon/limrifle/update_icon() - ..() - var/charge_icon = round(charge_percent,20) - icon_state = "[initial(icon_state)]_[charge_icon]" - -/obj/item/weapon/limrifle/proc/recharge() - charge_percent = 0 - update_icon() - - //////////////////// Energy Weapons //////////////////// -// -------------- Dominator ------------- -/obj/item/weapon/gun/energy/gun/fluff/dominator - name = "\improper MWPSB Dominator" - desc = "A MWPSB's Dominator from the Federation. Like the basic Energy Gun, this gun has two settings. It is used by the United Federation Public Safety Bureau's Criminal Investigation Division." - - icon = 'icons/vore/custom_guns_vr.dmi' - icon_state = "dominatorstun100" - - icon_override = 'icons/vore/custom_guns_vr.dmi' - item_state = null - item_icons = null - - fire_sound = 'sound/weapons/Taser.ogg' - projectile_type = /obj/item/projectile/beam/stun - - modifystate = "dominatorstun" - - dna_lock = 1 - - firemodes = list( - list(mode_name="stun", charge_cost=240,projectile_type=/obj/item/projectile/beam/stun, modifystate="dominatorstun", fire_sound='sound/weapons/Taser.ogg'), - list(mode_name="lethal", charge_cost=480,projectile_type=/obj/item/projectile/beam/dominator, modifystate="dominatorkill", fire_sound='sound/weapons/gauss_shoot.ogg'), - ) - // ------------ Energy Luger ------------ /obj/item/weapon/gun/energy/gun/eluger @@ -583,8 +473,8 @@ caliber = ".44" ammo_type = /obj/item/ammo_casing/a44/rubber - magazine_type = /obj/item/ammo_magazine/a44/rubber - allowed_magazines = list(/obj/item/ammo_magazine/a44,/obj/item/ammo_magazine/a44/rubber) + magazine_type = /obj/item/ammo_magazine/m44/rubber + allowed_magazines = list(/obj/item/ammo_magazine/m44,/obj/item/ammo_magazine/m44/rubber) load_method = MAGAZINE auto_eject = 1 auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg' @@ -610,8 +500,8 @@ caliber = ".32" ammo_type = /obj/item/ammo_casing/a32 - magazine_type = /obj/item/ammo_magazine/a32 - allowed_magazines = list(/obj/item/ammo_magazine/a32) + magazine_type = /obj/item/ammo_magazine/m32 + allowed_magazines = list(/obj/item/ammo_magazine/m32) load_method = MAGAZINE fire_delay = 0.6 accuracy = 1 @@ -639,8 +529,8 @@ caliber = ".32" ammo_type = /obj/item/ammo_casing/a32 - magazine_type = /obj/item/ammo_magazine/a32 - allowed_magazines = list(/obj/item/ammo_magazine/a32) + magazine_type = /obj/item/ammo_magazine/m32 + allowed_magazines = list(/obj/item/ammo_magazine/m32) fire_delay = 1.2 load_method = MAGAZINE accuracy = 2 @@ -699,9 +589,9 @@ slot_flags = SLOT_BELT caliber = "9mm" - ammo_type = /obj/item/ammo_casing/c9mm - magazine_type = /obj/item/ammo_magazine/c9mm - allowed_magazines = list(/obj/item/ammo_magazine/c9mm) + ammo_type = /obj/item/ammo_casing/a9mm + magazine_type = /obj/item/ammo_magazine/m9mm + allowed_magazines = list(/obj/item/ammo_magazine/m9mm) load_method = MAGAZINE multi_aim = 1 burst_delay = 2 @@ -763,101 +653,12 @@ overlays.Cut() update_mode() -//RD 'gun' -/obj/item/weapon/bluespace_harpoon - name = "bluespace harpoon" - desc = "For climbing on bluespace mountains!" - - icon = 'icons/obj/gun_vr.dmi' - icon_state = "harpoon-2" - - w_class = ITEMSIZE_NORMAL - - throw_speed = 4 - throw_range = 20 - - origin_tech = list(TECH_BLUESPACE = 5) - - var/mode = 1 // 1 mode - teleport you to turf 0 mode teleport turf to you - var/last_fire = 0 - var/transforming = 0 - -/obj/item/weapon/bluespace_harpoon/afterattack(atom/A, mob/user as mob) - var/current_fire = world.time - if(!user || !A || user.machine) - return - if(transforming) - to_chat(user,"You can't fire while \the [src] transforming!") - return - if(!(current_fire - last_fire >= 20 SECONDS)) - to_chat(user,"\The [src] is recharging...") - return - - last_fire = current_fire - playsound(user, 'sound/weapons/wave.ogg', 60, 1) - - user.visible_message("[user] fires \the [src]!","You fire \the [src]!") - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(4, 1, A) - s.start() - s = new /datum/effect/effect/system/spark_spread - s.set_up(4, 1, user) - s.start() - - var/turf/FromTurf = mode ? get_turf(user) : get_turf(A) - var/turf/ToTurf = mode ? get_turf(A) : get_turf(user) - - for(var/obj/O in FromTurf) - if(O.anchored) continue - if(prob(5)) - O.forceMove(pick(trange(24,user))) - else - O.forceMove(ToTurf) - - for(var/mob/living/M in FromTurf) - if(prob(5)) - M.forceMove(pick(trange(24,user))) - else - M.forceMove(ToTurf) - -/obj/item/weapon/bluespace_harpoon/attack_self(mob/living/user as mob) - return chande_fire_mode(user) - -/obj/item/weapon/bluespace_harpoon/verb/chande_fire_mode(mob/user as mob) - set name = "Change fire mode" - set category = "Object" - set src in oview(1) - if(transforming) return - mode = !mode - transforming = 1 - to_chat(user,"You change \the [src]'s mode to [mode ? "transmiting" : "receiving"].") - update_icon() - -/obj/item/weapon/bluespace_harpoon/update_icon() - if(transforming) - switch(mode) - if(0) - flick("harpoon-2-change", src) - icon_state = "harpoon-1" - if(1) - flick("harpoon-1-change",src) - icon_state = "harpoon-2" - transforming = 0 - //////////////////// Custom Ammo //////////////////// //---------------- Beams ---------------- /obj/item/projectile/beam/eluger name = "laser beam" icon_state = "emitter" -/obj/item/projectile/beam/dominator - name = "dominator lethal beam" - icon_state = "xray" - muzzle_type = /obj/effect/projectile/xray/muzzle - tracer_type = /obj/effect/projectile/xray/tracer - impact_type = /obj/effect/projectile/xray/impact - /obj/item/projectile/beam/stun/kin21 name = "kinh21 stun beam" icon_state = "omnilaser" @@ -866,7 +667,7 @@ impact_type = /obj/effect/projectile/laser_omni/impact //--------------- StG-60 ---------------- -/obj/item/ammo_magazine/stg +/obj/item/ammo_magazine/mtg name = "box mag (7.92x33mm Kurz)" icon = 'icons/obj/ammo_vr.dmi' icon_state = "stg_30rnd" @@ -876,12 +677,12 @@ mag_type = MAGAZINE /obj/item/ammo_casing/stg - desc = "A 7.92×33mm Kurz casing." + desc = "A 7.92 33mm Kurz casing." icon_state = "rifle-casing" caliber = "kurz" projectile_type = /obj/item/projectile/bullet/rifle/a762 -/obj/item/ammo_magazine/stg/empty +/obj/item/ammo_magazine/mtg/empty initial_ammo = 0 //------------- Battlerifle ------------- @@ -909,7 +710,7 @@ initial_ammo = 0 //---------------- PDW ------------------ -/obj/item/ammo_magazine/mc9mml +/obj/item/ammo_magazine/m9mml name = "\improper SMG magazine (9mm)" icon = 'icons/obj/ammo_vr.dmi' icon_state = "smg" @@ -917,31 +718,31 @@ mag_type = MAGAZINE matter = list(DEFAULT_WALL_MATERIAL = 1800) caliber = "9mm" - ammo_type = /obj/item/ammo_casing/c9mm + ammo_type = /obj/item/ammo_casing/a9mm max_ammo = 30 multiple_sprites = 1 -/obj/item/ammo_magazine/mc9mml/empty +/obj/item/ammo_magazine/m9mml/empty initial_ammo = 0 -/obj/item/ammo_magazine/mc9mml/ap +/obj/item/ammo_magazine/m9mml/ap name = "\improper SMG magazine (9mm armor-piercing)" - ammo_type = /obj/item/ammo_casing/c9mm/ap + ammo_type = /obj/item/ammo_casing/a9mm/ap -/obj/item/ammo_magazine/mc9mml/flash +/obj/item/ammo_magazine/m9mml/flash name = "\improper SMG magazine (9mm flash)" - ammo_type = /obj/item/ammo_casing/c9mmf + ammo_type = /obj/item/ammo_casing/a9mmf -/obj/item/ammo_magazine/mc9mml/rubber +/obj/item/ammo_magazine/m9mml/rubber name = "\improper SMG magazine (9mm rubber)" - ammo_type = /obj/item/ammo_casing/c9mmr + ammo_type = /obj/item/ammo_casing/a9mmr -/obj/item/ammo_magazine/mc9mml/practice +/obj/item/ammo_magazine/m9mml/practice name = "\improper SMG magazine (9mm practice)" - ammo_type = /obj/item/ammo_casing/c9mmp + ammo_type = /obj/item/ammo_casing/a9mmp //.357 special ammo -/obj/item/ammo_magazine/a357/stun +/obj/item/ammo_magazine/m357/stun name = "speedloader (.357 stun)" desc = "A speedloader for .357 revolvers." icon = 'icons/obj/ammo_vr.dmi' @@ -957,7 +758,7 @@ icon_state = "stun357" projectile_type = /obj/item/projectile/energy/electrode/stunshot/strong -/obj/item/ammo_magazine/a357/rubber +/obj/item/ammo_magazine/m357/rubber name = "speedloader (.357 rubber)" desc = "A speedloader for .357 revolvers." icon = 'icons/obj/ammo_vr.dmi' @@ -973,7 +774,7 @@ icon_state = "rubber357" projectile_type = /obj/item/projectile/bullet/pistol/rubber/strong -/obj/item/ammo_magazine/a357/flash +/obj/item/ammo_magazine/m357/flash name = "speedloader (.357 flash)" desc = "A speedloader for .357 revolvers." icon = 'icons/obj/ammo_vr.dmi' @@ -995,7 +796,7 @@ caliber = ".32" projectile_type = /obj/item/projectile/bullet/pistol -/obj/item/ammo_magazine/a32 +/obj/item/ammo_magazine/m32 icon_state = "a762" caliber = ".32" ammo_type = /obj/item/ammo_casing/a32 @@ -1016,7 +817,7 @@ desc = "A .44 rubber bullet casing." projectile_type = /obj/item/projectile/bullet/pistol/rubber/strong -/obj/item/ammo_magazine/a44 +/obj/item/ammo_magazine/m44 desc = "A magazine for .44 ammo." icon = 'icons/obj/ammo_vr.dmi' icon_state = "44lethal" @@ -1026,17 +827,17 @@ max_ammo = 8 mag_type = MAGAZINE -/obj/item/ammo_magazine/a44/rubber +/obj/item/ammo_magazine/m44/rubber desc = "A magazine for .44 less-than-lethal ammo." icon_state = "44rubber" ammo_type = /obj/item/ammo_casing/a44/rubber //.44 speedloaders -/obj/item/ammo_magazine/a44sl +/obj/item/ammo_magazine/m44sl name = "speedloader (.44)" desc = "A speedloader for .44 revolvers." icon = 'icons/obj/ammo_vr.dmi' - icon_state = "357" + icon_state = "s357" caliber = ".44" matter = list(DEFAULT_WALL_MATERIAL = 1260) ammo_type = /obj/item/ammo_casing/a44 @@ -1044,7 +845,7 @@ multiple_sprites = 1 mag_type = SPEEDLOADER -/obj/item/ammo_magazine/a44sl/rubber +/obj/item/ammo_magazine/m44sl/rubber name = "speedloader (.44 rubber)" icon_state = "r357" ammo_type = /obj/item/ammo_casing/a44/rubber diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 942baaf2382..fb901f5d650 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -259,6 +259,16 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie item_state = "flag_advent_mob" +//Vorrakul: Kaitlyn Fiasco +/obj/item/toy/plushie/mouse/fluff + name = "Mouse Plushie" + desc = "A plushie of a delightful mouse! What was once considered a vile rodent is now your very best friend." + slot_flags = SLOT_HEAD + icon_state = "mouse_brown" + item_state = "mouse_brown_head" + icon = 'icons/vore/custom_items_vr.dmi' + icon_override = 'icons/vore/custom_items_vr.dmi' + //zodiacshadow: ? /obj/item/device/radio/headset/fluff/zodiacshadow name = "Nehi's 'phones" @@ -311,7 +321,7 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie O.icon_state = new_icon // Changes the icon without changing the access. playsound(user.loc, 'sound/items/polaroid2.ogg', 100, 1) user.visible_message(" [user] reprints their ID.") - del(src) + qdel(src) else if(O.icon_state == new_icon) user << "[O] already has been reprinted." return @@ -326,9 +336,12 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie var/configured = 0 attack_self(mob/user as mob) - if(configured == 1) return ..() + if(configured) + return ..() user.set_id_info(src) + if(user.mind && user.mind.initial_account) + associated_account_number = user.mind.initial_account.account_number configured = 1 user << "Card settings set." @@ -480,7 +493,7 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie Destroy() //Waitwaitwait if(state == 1) process() //Nownownow - ..() //Okfine + return ..() //Okfine process() check_owner() @@ -601,10 +614,13 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie var/configured = 0 attack_self(mob/user as mob) - if(configured == 1) return ..() + if(configured) + return ..() assignment = user.job user.set_id_info(src) + if(user.mind && user.mind.initial_account) + associated_account_number = user.mind.initial_account.account_number configured = 1 user << "Card settings set." @@ -639,19 +655,12 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie emote_descriptor = list("squeezes milk", "tugs on Tempest's breasts, milking them") self_emote_descriptor = list("squeeze") random_emote = list("moos quietly") - assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_tempest + verb_name = "Milk" + verb_desc = "Grab Tempest's nipples and milk them into a container! May cause blushing and groaning." /obj/item/weapon/implanter/reagent_generator/tempest implant_type = /obj/item/weapon/implant/reagent_generator/tempest -/mob/living/carbon/human/proc/use_reagent_implant_tempest() - set name = "Milk" - set desc = "Grab Tempest's nipples and milk them into a container! May cause blushing and groaning." - set category = "Object" - set src in view(1) - - do_reagent_implant(usr) - //Hottokeeki: Belle Day /obj/item/weapon/implant/reagent_generator/belle @@ -663,20 +672,12 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie emote_descriptor = list("squeezes milk", "tugs on Belle's breasts/udders, milking them", "extracts milk") self_emote_descriptor = list("squeeze", "extract") random_emote = list("moos", "mrours", "groans softly") - assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_belle + verb_name = "Milk" + verb_desc = "Obtain Belle's milk and put it into a container! May cause blushing and groaning, or arousal." /obj/item/weapon/implanter/reagent_generator/belle implant_type = /obj/item/weapon/implant/reagent_generator/belle -/mob/living/carbon/human/proc/use_reagent_implant_belle() - set name = "Milk" - set desc = "Obtain Belle's milk and put it into a container! May cause blushing and groaning, or arousal." - set category = "Object" - set src in view(1) - - do_reagent_implant(usr) - - //Vorrarkul: Theodora Lindt /obj/item/weapon/implant/reagent_generator/vorrarkul generated_reagent = "chocolate_milk" @@ -687,18 +688,156 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie emote_descriptor = list("squeezes chocolate milk from Theodora", "tugs on Theodora's nipples, milking them", "kneads Theodora's breasts, milking them") self_emote_descriptor = list("squeeze", "knead") random_emote = list("moans softly", "gives an involuntary squeal") - assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_vorrarkul + verb_name = "Milk" + verb_desc = "Grab Theodora's breasts and extract delicious chocolate milk from them!" /obj/item/weapon/implanter/reagent_generator/vorrarkul implant_type = /obj/item/weapon/implant/reagent_generator/vorrarkul -/mob/living/carbon/human/proc/use_reagent_implant_vorrarkul() - set name = "Milk" - set desc = "Grab Theodora's breasts and extract delicious chocolate milk from them!" +//SpoopyLizz: Roiz Lizden +//I made this! Woo! +//implant +//-------------------- +/obj/item/weapon/implant/reagent_generator/roiz + name = "egg laying implant" + desc = "This is an implant that allows the user to lay eggs." + generated_reagent = "egg" + usable_volume = 500 + transfer_amount = 50 + + empty_message = list("Your lower belly feels smooth and empty. Sorry, we're out of eggs!", "The reduced pressure in your lower belly tells you there are no more eggs.") + full_message = list("Your lower belly looks swollen with irregular bumps, and it feels heavy.", "Your lower abdomen feels really heavy, making it a bit hard to walk.") + emote_descriptor = list("an egg right out of Roiz's lower belly!", "into Roiz' belly firmly, forcing him to lay an egg!", "Roiz really tight, who promptly lays an egg!") + var/verb_descriptor = list("squeezes", "pushes", "hugs") + var/self_verb_descriptor = list("squeeze", "push", "hug") + var/short_emote_descriptor = list("lays", "forces out", "pushes out") + self_emote_descriptor = list("lay", "force out", "push out") + random_emote = list("hisses softly with a blush on his face", "yelps in embarrassment", "grunts a little") + assigned_proc = /mob/living/carbon/human/proc/use_reagent_implant_roiz + +/obj/item/weapon/implant/reagent_generator/roiz/implanted(mob/living/carbon/source) + processing_objects += src + to_chat(source, "You implant [source] with \the [src].") + source.verbs |= assigned_proc + return 1 + +/obj/item/weapon/implanter/reagent_generator/roiz + implant_type = /obj/item/weapon/implant/reagent_generator/roiz + +/mob/living/carbon/human/proc/use_reagent_implant_roiz() + set name = "Lay Egg" + set desc = "Force Roiz to lay an egg by squeezing into his lower body! This makes the lizard extremely embarrassed, and it looks funny." set category = "Object" set src in view(1) - do_reagent_implant(usr) + //do_reagent_implant(usr) + if(!isliving(usr) || !usr.canClick()) + return + + if(usr.incapacitated() || usr.stat > CONSCIOUS) + return + + var/obj/item/weapon/implant/reagent_generator/roiz/rimplant + for(var/I in src.contents) + if(istype(I, /obj/item/weapon/implant/reagent_generator)) + rimplant = I + break + if (rimplant) + if(rimplant.reagents.total_volume <= rimplant.transfer_amount) + to_chat(src, "[pick(rimplant.empty_message)]") + return + + new /obj/item/weapon/reagent_containers/food/snacks/egg/roiz(get_turf(src)) + + var/index = rand(0,3) + + if (usr != src) + var/emote = rimplant.emote_descriptor[index] + var/verb_desc = rimplant.verb_descriptor[index] + var/self_verb_desc = rimplant.self_verb_descriptor[index] + usr.visible_message("[usr] [verb_desc] [emote]", + "You [self_verb_desc] [emote]") + else + src.visible_message("[src] [pick(rimplant.short_emote_descriptor)] an egg.", + "You [pick(rimplant.self_emote_descriptor)] an egg.") + if(prob(15)) + src.visible_message("[src] [pick(rimplant.random_emote)].") // M-mlem. + + rimplant.reagents.remove_reagent(rimplant.generated_reagent, rimplant.transfer_amount) + +//Egg item +//------------- +/obj/item/weapon/reagent_containers/food/snacks/egg/roiz + name = "lizard egg" + desc = "It's a large lizard egg." + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "egg_roiz" + filling_color = "#FDFFD1" + volume = 12 + +/obj/item/weapon/reagent_containers/food/snacks/egg/roiz/New() + ..() + reagents.add_reagent("egg", 9) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/egg/roiz/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype( W, /obj/item/weapon/pen/crayon )) + var/obj/item/weapon/pen/crayon/C = W + var/clr = C.colourName + + if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) + to_chat(user,"The egg refuses to take on this color!") + return + + to_chat(user,"You color \the [src] [clr]") + icon_state = "egg_roiz_[clr]" + desc = "It's a large lizard egg. It has been colored [clr]!" + if (clr == "rainbow") + var/number = rand(1,4) + icon_state = icon_state + num2text(number, 0) + else + ..() + +/obj/item/weapon/reagent_containers/food/snacks/friedegg/roiz + name = "fried lizard egg" + desc = "A large, fried lizard egg, with a touch of salt and pepper. It looks rather chewy." + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "friedegg" + volume = 12 + +/obj/item/weapon/reagent_containers/food/snacks/friedegg/roiz/New() + ..() + reagents.add_reagent("protein", 9) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/boiledegg/roiz + name = "boiled lizard egg" + desc = "A hard boiled lizard egg. Be careful, a lizard detective may hatch!" + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "egg_roiz" + volume = 12 + +/obj/item/weapon/reagent_containers/food/snacks/boiledegg/roiz/New() + ..() + reagents.add_reagent("protein", 6) + bitesize = 2 + +/obj/item/weapon/reagent_containers/food/snacks/chocolateegg/roiz + name = "chocolate lizard egg" + desc = "Such huge, sweet, fattening food. You feel gluttonous just looking at it." + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "chocolateegg_roiz" + filling_color = "#7D5F46" + nutriment_amt = 3 + nutriment_desc = list("chocolate" = 5) + volume = 18 + +/obj/item/weapon/reagent_containers/food/snacks/chocolateegg/roiz/New() + ..() + reagents.add_reagent("sugar", 6) + reagents.add_reagent("coco", 6) + reagents.add_reagent("milk", 2) + bitesize = 2 //PontifexMinimus: Lucius/Lucia Null /obj/item/weapon/fluff/dragor_dot @@ -746,6 +885,8 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie title = user.job assignment = title user.set_id_info(src) + if(user.mind && user.mind.initial_account) + associated_account_number = user.mind.initial_account.account_number var/tempname = pick(title_strings) name = tempname + " ([title])" configured = 1 @@ -761,6 +902,14 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie accessset = 1 ..() +//verkister: Cameron Eggbert - Science goggles that ACTUALLY do nothing. +/obj/item/clothing/glasses/science_proper + name = "Aesthetic Science Goggles" + desc = "The goggles really do nothing this time!" + icon_state = "purple" + item_state_slots = list(slot_r_hand_str = "glasses", slot_l_hand_str = "glasses") + item_flags = AIRTIGHT + //The perfect adminboos device? /obj/item/device/perfect_tele name = "personal translocator" @@ -791,9 +940,13 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie spk.attach(src) /obj/item/device/perfect_tele/Destroy() + // Must clear the beacon's backpointer or we won't GC. Someday maybe do something nicer even. + for(var/obj/item/device/perfect_tele_beacon/B in beacons) + B.tele_hand = null beacons.Cut() - qdel(spk) - ..() + qdel_null(power_source) + qdel_null(spk) + return ..() /obj/item/device/perfect_tele/update_icon() if(!power_source) @@ -916,6 +1069,11 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie to_chat(user,"\The [src] doesn't have a current valid destination set!") return + //No, you can't teleport if there's a jammer. + if(is_jammed(src) || is_jammed(destination)) + to_chat(user,"\The [src] refuses to teleport you, due to strong interference!") + return + //No, you can't port to or from away missions. Stupidly complicated check. var/turf/uT = get_turf(user) var/turf/dT = get_turf(destination) @@ -1041,7 +1199,7 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie /obj/item/device/perfect_tele_beacon/Destroy() tele_name = null tele_hand = null - ..() + return ..() /obj/item/device/perfect_tele_beacon/attack_hand(mob/user) if((user.ckey != creator) && !(user.ckey in warned_users)) @@ -1071,3 +1229,30 @@ obj/item/weapon/material/hatchet/tacknife/combatknife/fluff/katarina/handle_shie B.internal_contents |= src user.visible_message("[user] eats a telebeacon!","You eat the the beacon!") playsound(user, B.vore_sound, 70, 1) + +//InterroLouis: Ruda Lizden +/obj/item/clothing/accessory/badge/holo/detective/ruda + name = "Hisstective's Badge" + desc = "This is Ruda Lizden's personal Detective's badge. The polish is dull, as if it's simply been huffed upon and wiped against a coat. Labeled 'Hisstective.'" + icon = 'icons/vore/custom_items_vr.dmi' + icon_state = "hisstective_badge" + //slot_flags = SLOT_TIE | SLOT_BELT + +/obj/item/clothing/accessory/badge/holo/detective/ruda/attack(mob/living/carbon/human/M, mob/living/user) + if(isliving(user)) + user.visible_message("[user] invades [M]'s personal space, thrusting [src] into their face with an insistent huff.","You invade [M]'s personal space, thrusting [src] into their face with an insistent huff.") + user.do_attack_animation(M) + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam + +/obj/item/clothing/accessory/badge/holo/detective/ruda/attack_self(mob/user as mob) + + if(!stored_name) + user << "You huff along the front of your badge, then rub your sleeve on it to polish it up." + set_name(user.real_name) + return + + if(isliving(user)) + if(stored_name) + user.visible_message("[user] displays their [src.name].\nIt reads: [stored_name], [badge_string].","You display your [src.name].\nIt reads: [stored_name], [badge_string].") + else + user.visible_message("[user] displays their [src.name].\nIt reads: [badge_string].","You display your [src.name]. It reads: [badge_string].") \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/custom_permits_vr.dm b/code/modules/vore/fluffstuff/custom_permits_vr.dm index 0576eced52a..97625e85ca9 100644 --- a/code/modules/vore/fluffstuff/custom_permits_vr.dm +++ b/code/modules/vore/fluffstuff/custom_permits_vr.dm @@ -77,7 +77,7 @@ DOB: 12/Jul/2530 | HEIGHT: 188cm | SEX: Male The individual named above is licensed by the Nanotrasen Department of Civil Protection - to carry one KIN (foreign) personal defense weapon, non-lethal only. + to carry one KHI (foreign) personal defense weapon, non-lethal only. This license expires on 16/Feb/2562 and must be renewed by CentCom prior to this date."} // joanrisu:Joan Risu diff --git a/code/modules/vore/fluffstuff/guns/bsharpoon.dm b/code/modules/vore/fluffstuff/guns/bsharpoon.dm new file mode 100644 index 00000000000..0c684e202fd --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/bsharpoon.dm @@ -0,0 +1,90 @@ +//RD 'gun' +/obj/item/weapon/bluespace_harpoon + name = "bluespace harpoon" + desc = "For climbing on bluespace mountains!" + + icon = 'icons/obj/gun_vr.dmi' + icon_state = "harpoon-2" + + w_class = ITEMSIZE_NORMAL + + throw_speed = 4 + throw_range = 20 + + origin_tech = list(TECH_BLUESPACE = 5) + + var/mode = 1 // 1 mode - teleport you to turf 0 mode teleport turf to you + var/last_fire = 0 + var/transforming = 0 + +/obj/item/weapon/bluespace_harpoon/afterattack(atom/A, mob/user as mob) + var/current_fire = world.time + if(!user || !A) + return + if(transforming) + to_chat(user,"You can't fire while \the [src] transforming!") + return + if(!(current_fire - last_fire >= 30 SECONDS)) + to_chat(user,"\The [src] is recharging...") + return + if(is_jammed(A) || is_jammed(user)) + to_chat(user,"\The [src] shot fizzles due to interference!") + last_fire = current_fire + playsound(user, 'sound/weapons/wave.ogg', 60, 1) + return + var/turf/T = get_turf(A) + if(!T || T.check_density()) + to_chat(user,"That's a little too solid to harpoon into!") + return + + last_fire = current_fire + playsound(user, 'sound/weapons/wave.ogg', 60, 1) + + user.visible_message("[user] fires \the [src]!","You fire \the [src]!") + + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(4, 1, A) + s.start() + s = new /datum/effect/effect/system/spark_spread + s.set_up(4, 1, user) + s.start() + + var/turf/FromTurf = mode ? get_turf(user) : get_turf(A) + var/turf/ToTurf = mode ? get_turf(A) : get_turf(user) + + for(var/obj/O in FromTurf) + if(O.anchored) continue + if(prob(5)) + O.forceMove(pick(trange(24,user))) + else + O.forceMove(ToTurf) + + for(var/mob/living/M in FromTurf) + if(prob(5)) + M.forceMove(pick(trange(24,user))) + else + M.forceMove(ToTurf) + +/obj/item/weapon/bluespace_harpoon/attack_self(mob/living/user as mob) + return chande_fire_mode(user) + +/obj/item/weapon/bluespace_harpoon/verb/chande_fire_mode(mob/user as mob) + set name = "Change fire mode" + set category = "Object" + set src in oview(1) + if(transforming) return + mode = !mode + transforming = 1 + to_chat(user,"You change \the [src]'s mode to [mode ? "transmiting" : "receiving"].") + update_icon() + +/obj/item/weapon/bluespace_harpoon/update_icon() + if(transforming) + switch(mode) + if(0) + flick("harpoon-2-change", src) + icon_state = "harpoon-1" + if(1) + flick("harpoon-1-change",src) + icon_state = "harpoon-2" + transforming = 0 diff --git a/code/modules/vore/fluffstuff/guns/dominator.dm b/code/modules/vore/fluffstuff/guns/dominator.dm new file mode 100644 index 00000000000..b5c0acadcb0 --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/dominator.dm @@ -0,0 +1,31 @@ +// -------------- Dominator ------------- +/obj/item/weapon/gun/energy/gun/fluff/dominator + name = "\improper MWPSB Dominator" + desc = "A MWPSB's Dominator from the Federation. Like the basic Energy Gun, this gun has two settings. It is used by the United Federation Public Safety Bureau's Criminal Investigation Division." + + icon = 'icons/vore/custom_guns_vr.dmi' + icon_state = "dominatorstun100" + + icon_override = 'icons/vore/custom_guns_vr.dmi' + item_state = null + item_icons = null + + fire_sound = 'sound/weapons/Taser.ogg' + projectile_type = /obj/item/projectile/beam/stun + + modifystate = "dominatorstun" + + dna_lock = 1 + + firemodes = list( + list(mode_name="stun", charge_cost=240,projectile_type=/obj/item/projectile/beam/stun, modifystate="dominatorstun", fire_sound='sound/weapons/Taser.ogg'), + list(mode_name="lethal", charge_cost=480,projectile_type=/obj/item/projectile/beam/dominator, modifystate="dominatorkill", fire_sound='sound/weapons/gauss_shoot.ogg'), + ) + +// Dominator Ammo +/obj/item/projectile/beam/dominator + name = "dominator lethal beam" + icon_state = "xray" + muzzle_type = /obj/effect/projectile/xray/muzzle + tracer_type = /obj/effect/projectile/xray/tracer + impact_type = /obj/effect/projectile/xray/impact \ No newline at end of file diff --git a/code/modules/vore/fluffstuff/guns/nsfw.dm b/code/modules/vore/fluffstuff/guns/nsfw.dm new file mode 100644 index 00000000000..7ef25c4e224 --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/nsfw.dm @@ -0,0 +1,383 @@ +// -------------- NSFW ------------- +/obj/item/weapon/gun/projectile/nsfw + name = "KHI-102b \'NSFW\'" + desc = "Variety is the spice of life! The 'Nanotech Selectable-Fire Weapon' is an unholy hybrid of an ammo-driven \ + energy weapon that allows the user to mix and match their own fire modes. Up to three combinations of \ + energy beams can be configured at once. Ammo not included." + + description_info = "This gun is an energy weapon that uses interchangable microbatteries in a magazine. Each battery is a different beam type, and up to three can be loaded in the magazine. Each battery usually provides four discharges of that beam type, and multiple from the same type may be loaded to increase the number of shots for that type." + description_fluff = "The Kitsuhana 'Nanotech Selectable Fire Weapon' allows one to customize their loadout in the field, or before deploying, to achieve various results in a weapon they are already familiar with wielding." + description_antag = "" + + icon = 'icons/vore/custom_guns_vr.dmi' + icon_state = "nsfw" + + icon_override = 'icons/vore/custom_guns_vr.dmi' + item_state = "gun" + + caliber = "nsfw" + + origin_tech = list(TECH_COMBAT = 7, TECH_MATERIAL = 6, TECH_MAGNETS = 4) + + fire_sound = 'sound/weapons/Taser.ogg' + + load_method = MAGAZINE //Nyeh heh hehhh. + magazine_type = null + allowed_magazines = list(/obj/item/ammo_magazine/nsfw_mag) + handle_casings = HOLD_CASINGS //Don't eject batteries! + recoil = 0 + var/charge_left = 0 + var/max_charge = 0 + charge_sections = 5 + +/obj/item/weapon/gun/projectile/nsfw/consume_next_projectile() + if(chambered && ammo_magazine) + var/obj/item/ammo_casing/nsfw_batt/batt = chambered + if(batt.shots_left) + return new chambered.projectile_type() + else + for(var/B in ammo_magazine.stored_ammo) + var/obj/item/ammo_casing/nsfw_batt/other_batt = B + if(istype(other_batt,chambered.type) && other_batt.shots_left) + switch_to(other_batt) + return new chambered.projectile_type() + break + + return null + +/obj/item/weapon/gun/projectile/nsfw/proc/update_charge() + charge_left = 0 + max_charge = 0 + + if(!chambered) + return + + var/obj/item/ammo_casing/nsfw_batt/batt = chambered + + charge_left = batt.shots_left + max_charge = initial(batt.shots_left) + if(ammo_magazine) //Crawl to find more + for(var/B in ammo_magazine.stored_ammo) + var/obj/item/ammo_casing/nsfw_batt/bullet = B + if(istype(bullet,batt.type)) + charge_left += bullet.shots_left + max_charge += initial(bullet.shots_left) + +/obj/item/weapon/gun/projectile/nsfw/proc/switch_to(obj/item/ammo_casing/nsfw_batt/new_batt) + if(ishuman(loc)) + if(chambered && new_batt.type == chambered.type) + to_chat(loc,"\The [src] is now using the next [new_batt.type_name] power cell.") + else + to_chat(loc,"\The [src] is now firing [new_batt.type_name].") + + chambered = new_batt + update_charge() + update_icon() + +/obj/item/weapon/gun/projectile/nsfw/attack_self(mob/user) + if(!chambered) + return + + var/list/stored_ammo = ammo_magazine.stored_ammo + + if(stored_ammo.len == 1) + return //silly you. + + //Find an ammotype that ISN'T the same, or exhaust the list and don't change. + var/our_slot = stored_ammo.Find(chambered) + var/index = our_slot + 1 + var/obj/item/ammo_casing/nsfw_batt/new_choice + + while((index != our_slot) && !new_choice) + if(index > stored_ammo.len) + index = 1 + var/obj/item/ammo_casing/nsfw_batt/next_batt = stored_ammo[index] + if(!istype(next_batt,chambered.type)) + new_choice = next_batt + index++ + + if(new_choice) + switch_to(new_choice) +/* +/obj/item/weapon/gun/projectile/nsfw/special_check(mob/user) + if(!chambered) + return + + var/obj/item/ammo_casing/nsfw_batt/batt = chambered + if(!batt.shots_left) + return FALSE + + return TRUE +*/ +/obj/item/weapon/gun/projectile/nsfw/load_ammo(var/obj/item/A, mob/user) + . = ..() + if(ammo_magazine && ammo_magazine.stored_ammo.len) + switch_to(ammo_magazine.stored_ammo[1]) + +/obj/item/weapon/gun/projectile/nsfw/unload_ammo(mob/user, var/allow_dump=1) + chambered = null + return ..() + +/obj/item/weapon/gun/projectile/nsfw/update_icon() + var/mutable_appearance/ma = new(src) + update_charge() + + if(!chambered) + ma.overlays = list() + appearance = ma + return + + var/obj/item/ammo_casing/nsfw_batt/batt = chambered + var/batt_color = batt.type_color //Used many times + var/list/newverlays = list() + + //Mode bar + var/mutable_appearance/mode_bar = mutable_appearance(icon, "[initial(icon_state)]_type") + mode_bar.color = batt_color + newverlays += mode_bar + + //Barrel color + var/mutable_appearance/barrel_color = mutable_appearance(icon, "[initial(icon_state)]_barrel") + barrel_color.alpha = 150 + barrel_color.color = batt_color + newverlays += barrel_color + + //Charge bar + var/ratio = Ceiling((charge_left / max_charge) * charge_sections) + for(var/i = 0, i < ratio, i++) + var/mutable_appearance/charge_bar = mutable_appearance(icon, "[initial(icon_state)]_charge") + charge_bar.pixel_x = i + charge_bar.color = batt_color + newverlays += charge_bar + + ma.overlays = newverlays + if(ma.overlays.len != newverlays.len) //PANIC! + del(ma) + spawn(5) + update_icon() + return + + appearance = ma + +// The Magazine // +/obj/item/ammo_magazine/nsfw_mag + name = "microbattery magazine" + desc = "A microbattery holder for the \'NSFW\'" + + description_info = "This magazine holds NSFW microbatteries to power the NSFW handgun. Up to three can be loaded at once, and each provides four shots of their respective energy type. Loading multiple of the same type will provide additional shots of that type. The batteries can be recharged in a normal recharger." + + icon = 'icons/obj/ammo_vr.dmi' + icon_state = "nsfw_mag" + caliber = "nsfw" + matter = list(DEFAULT_WALL_MATERIAL = 1680, "glass" = 2000) + ammo_type = /obj/item/ammo_casing/nsfw_batt + initial_ammo = 0 + max_ammo = 3 + mag_type = MAGAZINE + + var/list/modes + +/obj/item/ammo_magazine/nsfw_mag/New() + ..() + modes = list() + +/obj/item/ammo_magazine/nsfw_mag/update_icon() + var/mutable_appearance/ma = new(src) + + if(!stored_ammo.len) + ma.overlays = list() + appearance = ma + return //Why bother + + var/x_offset = 5 + var/list/newverlays = list() + + var/current = 0 + for(var/B in stored_ammo) + var/obj/item/ammo_casing/nsfw_batt/batt = B + var/mutable_appearance/cap = mutable_appearance(icon,"[initial(icon_state)]_cap") + cap.color = batt.type_color + cap.pixel_x = current * x_offset //Caps don't need a pixel_y offset + newverlays += cap + + if(batt.shots_left) + var/ratio = Ceiling((batt.shots_left / initial(batt.shots_left)) * 4) //4 is how many lights we have a sprite for + var/mutable_appearance/charge = mutable_appearance(icon,"[initial(icon_state)]_charge-[ratio]") + charge.color = "#29EAF4" //Could use battery color but eh. + charge.pixel_x = current * x_offset + newverlays += charge + + current++ //Increment for offsets + + ma.overlays = newverlays + if(ma.overlays.len != newverlays.len) //PANIC! + del(ma) + spawn(5) + update_icon() + return + + appearance = ma + +// The Casing // +/obj/item/ammo_casing/nsfw_batt + name = "\'NSFW\' microbattery - LETHAL" + desc = "A miniature battery for an energy weapon." + icon = 'icons/obj/ammo_vr.dmi' + icon_state = "nsfw_batt" + flags = CONDUCT + slot_flags = SLOT_BELT | SLOT_EARS + throwforce = 1 + w_class = ITEMSIZE_TINY + + leaves_residue = 0 + caliber = "nsfw" + var/shots_left = 4 + var/type_color = "#bf3d3d" + var/type_name = "LETHAL" + projectile_type = /obj/item/projectile/beam + +/obj/item/ammo_casing/nsfw_batt/New() + pixel_x = rand(-10, 10) + pixel_y = rand(-10, 10) + update_icon() + +/obj/item/ammo_casing/nsfw_batt/update_icon() + var/mutable_appearance/ma = new(src) + ma.overlays.Cut() + + var/mutable_appearance/ends = mutable_appearance(icon,"[initial(icon_state)]_ends") + ends.color = type_color + ma.overlays += ends + + appearance = ma + +/obj/item/ammo_casing/nsfw_batt/expend() + shots_left-- + +// Specific batteries // +/obj/item/ammo_casing/nsfw_batt/stun + name = "\'NSFW\' microbattery - STUN" + type_color = "#0f81bc" + type_name = "STUN" + projectile_type = /obj/item/projectile/beam/stun/blue + +/obj/item/ammo_casing/nsfw_batt/net + name = "\'NSFW\' microbattery - NET" + type_color = "#43f136" + type_name = "NET" + projectile_type = /obj/item/projectile/beam/energy_net + +/obj/item/ammo_casing/nsfw_batt/xray + name = "\'NSFW\' microbattery - XRAY" + type_color = "#32c025" + type_name = "XRAY" + projectile_type = /obj/item/projectile/beam/xray + +/obj/item/ammo_casing/nsfw_batt/shotstun + name = "\'NSFW\' microbattery - SCATTERSTUN" + type_color = "#88ffff" + type_name = "SCATTERSTUN" + projectile_type = /obj/item/projectile/bullet/pellet/e_shot_stun + +/obj/item/projectile/bullet/pellet/e_shot_stun + icon_state = "spell" + damage = 2 + agony = 20 + pellets = 6 //number of pellets + range_step = 2 //projectile will lose a fragment each time it travels this distance. Can be a non-integer. + base_spread = 90 //lower means the pellets spread more across body parts. If zero then this is considered a shrapnel explosion instead of a shrapnel cone + spread_step = 10 + embed_chance = 0 + sharp = 0 + check_armour = "melee" + +/obj/item/ammo_casing/nsfw_batt/ion + name = "\'NSFW\' microbattery - ION" + type_color = "#d084d6" + type_name = "ION" + projectile_type = /obj/item/projectile/ion/small + +/obj/item/ammo_casing/nsfw_batt/stripper + name = "\'NSFW\' microbattery - STRIPPER" + type_color = "#fc8d0f" + type_name = "STRIPPER" + projectile_type = /obj/item/projectile/bullet/stripper + +/obj/item/projectile/bullet/stripper + icon_state = "magicm" + nodamage = 1 + agony = 5 + embed_chance = 0 + sharp = 0 + check_armour = "melee" + +/obj/item/projectile/bullet/stripper/on_hit(var/atom/stripped) + if(ishuman(stripped)) + var/mob/living/carbon/human/H = stripped + if(H.wear_suit) + H.unEquip(H.wear_suit) + if(H.w_uniform) + H.unEquip(H.w_uniform) + if(H.back) + H.unEquip(H.back) + if(H.shoes) + H.unEquip(H.shoes) + if(H.gloves) + H.unEquip(H.gloves) + //Hats can stay! Most other things fall off with removing these. + ..() + +/obj/item/ammo_casing/nsfw_batt/final + name = "\'NSFW\' microbattery - FINAL OPTION" + type_color = "#fcfc0f" + type_name = "FINAL OPTION" //Doesn't look good in yellow in chat + projectile_type = /obj/item/projectile/beam/final_option + +/obj/item/projectile/beam/final_option + name = "final option beam" + icon_state = "omnilaser" + nodamage = 1 + agony = 5 + damage_type = HALLOSS + light_color = "#00CC33" + + muzzle_type = /obj/effect/projectile/laser_omni/muzzle + tracer_type = /obj/effect/projectile/laser_omni/tracer + impact_type = /obj/effect/projectile/laser_omni/impact + +/obj/item/projectile/beam/final_option/on_hit(var/atom/impacted) + if(isliving(impacted)) + var/mob/living/L = impacted + if(L.mind) + var/nif + if(ishuman(L)) + var/mob/living/carbon/human/H = L + nif = H.nif + SStranscore.m_backup(L.mind,nif,one_time = TRUE) + L.gib() + + ..() + +/obj/item/ammo_casing/nsfw_batt/shrink + name = "\'NSFW\' microbattery - SHRINK" + type_color = "#910ffc" + type_name = "SHRINK" + projectile_type = /obj/item/projectile/beam/shrinklaser + +/obj/item/ammo_casing/nsfw_batt/grow + name = "\'NSFW\' microbattery - GROW" + type_color = "#fc0fdc" + type_name = "GROW" + projectile_type = /obj/item/projectile/beam/growlaser + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack + name = "\improper KHI-102b \'NSFW\' gun kit" + desc = "A storage case for a multi-purpose handgun. Variety hour!" + max_w_class = ITEMSIZE_NORMAL + +/obj/item/weapon/storage/secure/briefcase/nsfw_pack/New() + ..() + new /obj/item/weapon/gun/projectile/nsfw(src) + new /obj/item/ammo_magazine/nsfw_mag(src) + for(var/path in typesof(/obj/item/ammo_casing/nsfw_batt)) + new path(src) diff --git a/code/modules/vore/fluffstuff/guns/protector.dm b/code/modules/vore/fluffstuff/guns/protector.dm new file mode 100644 index 00000000000..173c00b637c --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/protector.dm @@ -0,0 +1,118 @@ +// -------------- Protector ------------- +/obj/item/weapon/gun/energy/protector + name = "\improper KHI-98a \'Protector\'" + desc = "The KHI-98a is the first firearm custom-designed for Nanotrasen by KHI. It features a powerful stun mode, and \ + an alert-level-locked lethal mode, only usable on code blue and higher. It also features an integrated flashlight!" + + description_info = "This gun can only be fired in lethal mode while on higher security alert levels. It is legal for sec to carry for this reason, since it cannot be used for lethal force until SOP allows it, in essence." + description_fluff = "The first 'commission' from a Kitsuhana citizen for NanoTrasen, this gun has a wireless connection to the computer's datacore to ensure it can't be used without authorization from heads of staff who have raised the alert level. Until then, *click*!" + description_antag = "The gun can be emagged to remove the lethal security level restriction, allowing it to be fired on lethal mode at all times." + + icon = 'icons/vore/custom_guns_vr.dmi' + icon_state = "prot" + + icon_override = 'icons/vore/custom_guns_vr.dmi' + item_state = "gun" + + fire_sound = 'sound/weapons/Taser.ogg' + projectile_type = /obj/item/projectile/beam/stun + + modifystate = "stun" + + origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) + + charge_sections = 3 //For the icon + ammo_x_offset = 2 + ammo_y_offset = 0 + can_flashlight = TRUE + light_state = "prot_light" + flight_x_offset = 0 + flight_y_offset = 0 + + firemodes = list( + list(mode_name="stun", projectile_type=/obj/item/projectile/beam/stun/protector, modifystate="stun", fire_sound='sound/weapons/Taser.ogg'), + list(mode_name="lethal", projectile_type=/obj/item/projectile/beam, modifystate="kill", fire_sound='sound/weapons/gauss_shoot.ogg'), + ) + + var/emagged = FALSE + +/obj/item/weapon/gun/energy/protector/special_check(mob/user) + if(!emagged && mode_name == "lethal" && get_security_level() == "green") + to_chat(user,"The trigger refuses to depress while on the lethal setting under security level green!") + return FALSE + + return ..() + + +/obj/item/weapon/gun/energy/protector/emag_act(var/remaining_charges,var/mob/user) + ..() + if(!emagged) + emagged = TRUE + to_chat(user,"You disable the alert level locking mechanism on \the [src]!") + + return TRUE + +//Update icons from /tg/, so fancy! Use this more! +/obj/item/weapon/gun/energy/protector/update_icon() + overlays.Cut() + var/ratio = 0 + + /* Don't have one for this gun + var/itemState = null + if(!initial(item_state)) + itemState = icon_state + */ + + var/iconState = "[icon_state]_charge" + if (modifystate) + overlays += "[icon_state]_[modifystate]" + iconState += "_[modifystate]" + /* Don't have one for this gun + if(itemState) + itemState += "[modifystate]" + */ + if(power_supply) + ratio = Ceiling((power_supply.charge / power_supply.maxcharge) * charge_sections) + + if(power_supply.charge < charge_cost) + overlays += "[icon_state]_empty" + else + if(!shaded_charge) + var/mutable_appearance/charge_overlay = mutable_appearance(icon, iconState) + for(var/i = ratio, i >= 1, i--) + charge_overlay.pixel_x = ammo_x_offset * (i - 1) + overlays += charge_overlay + else + overlays += "[icon_state]_[modifystate][ratio]" + + if(can_flashlight & gun_light) + var/mutable_appearance/flashlight_overlay = mutable_appearance(icon, light_state) + flashlight_overlay.pixel_x = flight_x_offset + flashlight_overlay.pixel_y = flight_y_offset + overlays += flashlight_overlay + + /* Don't have one for this gun + if(itemState) + itemState += "[ratio]" + item_state = itemState + */ + + +// Protector beams +/obj/item/projectile/beam/stun/protector + name = "protector stun beam" + icon_state = "omnilaser" //A little more cyan + light_color = "#00C6FF" + agony = 50 //Normal is 40 when this was set + muzzle_type = /obj/effect/projectile/laser_omni/muzzle + tracer_type = /obj/effect/projectile/laser_omni/tracer + impact_type = /obj/effect/projectile/laser_omni/impact + +//R&D Design +/datum/design/item/weapon/protector + desc = "The 'Protector' is an advanced energy gun that cannot be fired in lethal mode on low security alert levels, but features DNA locking and a powerful stun." + id = "protector" + req_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 3, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 4000, "glass" = 2000, "silver" = 1000) + build_path = /obj/item/weapon/gun/energy/protector + sort_string = "TAADA" diff --git a/code/modules/vore/fluffstuff/guns/pummeler.dm b/code/modules/vore/fluffstuff/guns/pummeler.dm new file mode 100644 index 00000000000..b12ce223e8c --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/pummeler.dm @@ -0,0 +1,57 @@ +// -------------- Pummeler ------------- +/obj/item/weapon/gun/energy/pummeler + name = "\improper PML9 \'Pummeler\'" + desc = "For when you want to get that pesky marketing guy out of your face ASAP. The pummeler fires one HUGE \ + sonic blast in the direction of fire, throwing the target away from you at high speed. Now you can REALLY \ + turn up the bass to max." + + description_info = "This gun punts people away and has a chance of knocking them down briefly. It may also throw them over railings in the process!" + description_fluff = "" + description_antag = "" + + icon = 'icons/vore/custom_guns_vr.dmi' + icon_state = "pum" + + icon_override = 'icons/vore/custom_guns_vr.dmi' + item_state = "gun" + + fire_sound = 'sound/effects/basscannon.ogg' + projectile_type = /obj/item/projectile/pummel + + charge_cost = 600 + + origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 5) + + slot_flags = SLOT_BELT|SLOT_BACK + w_class = ITEMSIZE_LARGE + +//Projectile +/obj/item/projectile/pummel + name = "sonic blast" + icon_state = "sound" + damage = 5 + damage_type = BRUTE + check_armour = "melee" + embed_chance = 0 + vacuum_traversal = 0 + kill_count = 6 //Scary name, but just deletes the projectile after this range + +/obj/item/projectile/pummel/on_hit(var/atom/movable/target, var/blocked = 0) + if(isliving(target)) + var/mob/living/L = target + var/throwdir = get_dir(firer,L) + if(prob(40) && !blocked) + L.Stun(1) + L.Confuse(1) + L.throw_at(get_edge_target_turf(L, throwdir), rand(3,6), 10) + + return 1 + +//R&D Design +/datum/design/item/weapon/pummeler + desc = "With the 'Pummeler', punt anyone you don't like out of the room!" + id = "pummeler" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 5) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 3000, "uranium" = 1000) + build_path = /obj/item/weapon/gun/energy/pummeler + sort_string = "TAADC" diff --git a/code/modules/vore/fluffstuff/guns/sickshot.dm b/code/modules/vore/fluffstuff/guns/sickshot.dm new file mode 100644 index 00000000000..8733e4aadfd --- /dev/null +++ b/code/modules/vore/fluffstuff/guns/sickshot.dm @@ -0,0 +1,55 @@ +// -------------- Sickshot ------------- +/obj/item/weapon/gun/energy/sickshot + name = "\improper MPA6 \'Sickshot\'" + desc = "Need to stun someone? Don't mind having to clean up the mess afterwards? The Sickshot is the answer to your prayers. \ + Using a short-range concentrated blast of disruptive sound, the Sickshot will nauseate and confuse the target for several seconds. NOTE: Not suitable \ + for use in vacuum, or on animals. May cause contraction and release of various 'things' from various 'orifices'." + + description_info = "This gun causes nausea in targets, stunning them briefly and causing vomiting. It will also cause them to vomit up prey, sometimes. Repeated shots may help in that case." + description_fluff = "" + description_antag = "" + + icon = 'icons/vore/custom_guns_vr.dmi' + icon_state = "sickshot" + + icon_override = 'icons/vore/custom_guns_vr.dmi' + item_state = "gun" + + fire_sound = 'sound/weapons/eluger.ogg' + projectile_type = /obj/item/projectile/sickshot + + charge_cost = 600 + + origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 2) + +//Projectile +/obj/item/projectile/sickshot + name = "sickshot pulse" + icon_state = "sound" + damage = 5 + armor_penetration = 30 + damage_type = BURN + check_armour = "melee" + embed_chance = 0 + vacuum_traversal = 0 + kill_count = 5 //Scary name, but just deletes the projectile after this range + +/obj/item/projectile/sickshot/on_hit(var/atom/movable/target, var/blocked = 0) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + H.vomit() + H.Confuse(2) + if(prob(20)) + for(var/X in H.vore_organs) + var/datum/belly/B = H.vore_organs[X] + B.release_all_contents() + return 1 + +//R&D Design +/datum/design/item/weapon/sickshot + desc = "A 'Sickshot' is a 4-shot energy revolver that causes nausea and confusion." + id = "sickshot" + req_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_MAGNET = 2) + materials = list(DEFAULT_WALL_MATERIAL = 3000, "glass" = 2000) + build_path = /obj/item/weapon/gun/energy/sickshot + sort_string = "TAADB" diff --git a/code/modules/vore/persist/persist_vr.dm b/code/modules/vore/persist/persist_vr.dm index a6ff22d4e4a..40b44218d25 100644 --- a/code/modules/vore/persist/persist_vr.dm +++ b/code/modules/vore/persist/persist_vr.dm @@ -15,7 +15,7 @@ // Handle people leaving due to round ending. /hook/roundend/proc/persist_locations() - for(var/mob/Player in player_list) + for(var/mob/Player in human_mob_list) if(!Player.mind || isnewplayer(Player)) continue // No mind we can do nothing, new players we care not for else if(Player.stat == DEAD) @@ -35,6 +35,34 @@ persist_interround_data(Player, /datum/spawnpoint/cryo) return 1 +/** + * Prep for save: returns a preferences object if we're ready and allowed to save this mob. + */ +/proc/prep_for_persist(var/mob/persister) + if(!istype(persister)) + crash_with("prep_for_persist given non-mob [persister]") + return + + // Find out of this mob is a proper mob! + if (persister.mind && persister.mind.loaded_from_ckey) + // Okay this mob has a real loaded-from-savefile mind in it! + var/datum/preferences/prefs = preferences_datums[persister.mind.loaded_from_ckey] + if(!prefs) + WARNING("mind [persister.mind] was loaded from ckey [persister.mind.loaded_from_ckey] but no prefs datum found") + return + + // Okay, lets do a few checks to see if we should really save tho! + if(!prefs.load_character(persister.mind.loaded_from_slot)) + WARNING("mind [persister.mind] was loaded from slot [persister.mind.loaded_from_slot] but loading prefs failed.") + return // Failed to load character + + // For now as a safety measure we will only save if the name matches. + if(prefs.real_name != persister.real_name) + log_debug("Skipping persist for [persister] becuase [persister.real_name] != [prefs.real_name]") + return + + return prefs + /** * Called when mob despawns early (via cryopod)! */ @@ -45,44 +73,39 @@ return 1 /proc/persist_interround_data(var/mob/occupant, var/datum/spawnpoint/new_spawn_point_type) - ASSERT(istype(occupant)) + if(!istype(occupant)) + crash_with("persist_interround_data given non-mob [occupant]") + return - // Find out of this mob is a proper mob! - if (occupant.mind && occupant.mind.loaded_from_ckey) - // Okay this mob has a real loaded-from-savefile mind in it! - var/datum/preferences/prefs = preferences_datums[occupant.mind.loaded_from_ckey] - if(!prefs) - WARNING("mind [occupant.mind] was loaded from ckey [occupant.mind.loaded_from_ckey] but no prefs datum found") - return + var/datum/preferences/prefs = prep_for_persist(occupant) + if(!prefs) + WARNING("persist_interround_data failed to prep [occupant] for persisting") + return - // Okay, lets do a few checks to see if we should really save tho! - if(!prefs.load_character(occupant.mind.loaded_from_slot)) - WARNING("mind [occupant.mind] was loaded from slot [occupant.mind.loaded_from_slot] but loading prefs failed.") - return // Failed to load character + //This one doesn't rely on persistence prefs + if(ishuman(occupant) && occupant.stat != DEAD) + persist_nif_data(occupant, prefs) - // For now as a safety measure we will only save if the name matches. - if(prefs.real_name != occupant.real_name) - log_debug("Skipping persist for [occupant] becuase [occupant.real_name] != [prefs.real_name]") - return + if(!prefs.persistence_settings) + return // Persistence disabled by preference settings - if(!prefs.persistence_settings) - return // Persistence disabled by preference settings + // Okay we can start saving the data + if(new_spawn_point_type && prefs.persistence_settings & PERSIST_SPAWN) + prefs.spawnpoint = initial(new_spawn_point_type.display_name) + if(ishuman(occupant) && occupant.stat != DEAD) + var/mob/living/carbon/human/H = occupant + testing("About to try saving stuff from [H] to [prefs] (\ref[prefs])") + if(prefs.persistence_settings & PERSIST_ORGANS) + apply_organs_to_prefs(H, prefs) + if(prefs.persistence_settings & PERSIST_MARKINGS) + apply_markings_to_prefs(H, prefs) + if(prefs.persistence_settings & PERSIST_WEIGHT) + resolve_excess_nutrition(H) + prefs.weight_vr = H.weight + if(prefs.persistence_settings & PERSIST_SIZE) + prefs.size_multiplier = H.size_multiplier - // Okay we can start saving the data - if(new_spawn_point_type && prefs.persistence_settings & PERSIST_SPAWN) - prefs.spawnpoint = initial(new_spawn_point_type.display_name) - if(ishuman(occupant) && occupant.stat != DEAD) - var/mob/living/carbon/human/H = occupant - testing("About to try saving stuff from [H] to [prefs] (\ref[prefs])") - if(prefs.persistence_settings & PERSIST_ORGANS) - apply_organs_to_prefs(H, prefs) - if(prefs.persistence_settings & PERSIST_MARKINGS) - apply_markings_to_prefs(H, prefs) - if(prefs.persistence_settings & PERSIST_WEIGHT) - resolve_excess_nutrition(H) - prefs.weight_vr = H.weight - prefs.save_character() - return + prefs.save_character() // Saves mob's current coloration state to prefs // This basically needs to be the reverse of /datum/category_item/player_setup_item/general/body/copy_to_mob() ~Leshana @@ -194,3 +217,43 @@ // Weight Loss! var/loss = (MAX_NUTRITION_TO_LOSE - C.nutrition) * weight_per_nutrition * C.weight_loss/100 C.weight = max(MIN_MOB_WEIGHT, C.weight - loss) + +/** +* Persist any NIF data that needs to be persisted. It's stored in a list to make it more malleable +* towards future shenanigans such as upgradable NIFs or different types or things of that nature, +* without invoking the need for a bunch of different save file variables. +*/ +/proc/persist_nif_data(var/mob/living/carbon/human/H,var/datum/preferences/prefs) + if(!istype(H)) + crash_with("persist_nif_data given a nonhuman: [H]") + return + + if(!prefs) + prefs = prep_for_persist(H) + + if(!prefs) + WARNING("persist_nif_data failed to prep [H] for persisting") + return + + var/obj/item/device/nif/nif = H.nif + + //If they have one, and if it's not installing without an owner, because + //Someone who joins and immediately leaves again (wrong job choice, maybe) + //should keep it even though it was probably doing the quick-calibrate, and their + //owner will have been pre-set during the constructor. + if(nif && !(nif.stat == NIF_INSTALLING && !nif.owner)) + prefs.nif_path = nif.type + prefs.nif_durability = nif.durability + prefs.nif_savedata = nif.save_data.Copy() + else + prefs.nif_path = null + prefs.nif_durability = null + prefs.nif_savedata = null + + var/datum/category_group/player_setup_category/vore_cat = prefs.player_setup.categories_by_name["VORE"] + var/datum/category_item/player_setup_item/vore/nif/nif_prefs = vore_cat.items_by_name["NIF Data"] + + var/savefile/S = new /savefile(prefs.path) + if(!S) WARNING ("Couldn't load NIF save savefile? [prefs.real_name]") + S.cd = "/character[prefs.default_slot]" + nif_prefs.save_character(S) diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index ea7387a94a4..09d034af739 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -34,4 +34,4 @@ var/turf/here = get_turf(src) for(var/atom/movable/A in src) A.forceMove(here) - ..() \ No newline at end of file + return ..() \ No newline at end of file diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index d496fb46fbd..58d5d2df244 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -61,6 +61,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 /mob/living/proc/resize(var/new_size, var/animate = TRUE) if(size_multiplier == new_size) return 1 + ASSERT(new_size >= RESIZE_TINY && new_size <= RESIZE_HUGE) if(animate) var/matrix/resize = matrix() // Defines the matrix to change the player's size resize.Scale(new_size) //Change the size of the matrix @@ -79,13 +80,15 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 /mob/living/carbon/human/dummy/mannequin/resize(var/new_size) size_multiplier = new_size +/* Removed due to too many 'magic' characters having resizing 100% of the time. + Replaced with bluespace jumpsuit, and mass altering NIFSoft. /** * Verb proc for a command that lets players change their size OOCly. * Ace was here! Redid this a little so we'd use math for shrinking characters. This is the old code. */ /mob/living/proc/set_size() set name = "Set Character Size" - set category = "Vore" + set category = "OOC" var/nagmessage = "DO NOT ABUSE THESE COMMANDS. They are not here for you to play with. \ We were originally going to remove them but kept them for popular demand. \ Do not abuse their existence outside of ERP scenes where they apply, \ @@ -104,6 +107,8 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2 /hook/living_new/proc/resize_setup(mob/living/H) H.verbs += /mob/living/proc/set_size return 1 +*/ + /** * Attempt to scoop up this mob up into H's hands, if the size difference is large enough. diff --git a/code/modules/xenoarcheaology/anomaly_container.dm b/code/modules/xenoarcheaology/anomaly_container.dm new file mode 100644 index 00000000000..616b04b10d9 --- /dev/null +++ b/code/modules/xenoarcheaology/anomaly_container.dm @@ -0,0 +1,43 @@ +/obj/structure/anomaly_container + name = "anomaly container" + desc = "Used to safely contain and move anomalies." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "anomaly_container" + density = 1 + + var/obj/machinery/artifact/contained + +/obj/structure/anomaly_container/initialize() + ..() + + var/obj/machinery/artifact/A = locate() in loc + if(A) + contain(A) + +/obj/structure/anomaly_container/attack_hand(var/mob/user) + release() + +/obj/structure/anomaly_container/attack_robot(var/mob/user) + if(Adjacent(user)) + release() + +/obj/structure/anomaly_container/proc/contain(var/obj/machinery/artifact/artifact) + if(contained) + return + contained = artifact + artifact.forceMove(src) + underlays += image(artifact) + desc = "Used to safely contain and move anomalies. \The [contained] is kept inside." + +/obj/structure/anomaly_container/proc/release() + if(!contained) + return + contained.dropInto(src) + contained = null + underlays.Cut() + desc = initial(desc) + +/obj/machinery/artifact/MouseDrop(var/obj/structure/anomaly_container/over_object) + if(istype(over_object) && Adjacent(over_object) && CanMouseDrop(over_object, usr)) + Bumped(usr) + over_object.contain(src) \ No newline at end of file diff --git a/code/modules/xenoarcheaology/artifacts/replicator.dm b/code/modules/xenoarcheaology/artifacts/replicator.dm index ef00d5db1be..2e3f9e88745 100644 --- a/code/modules/xenoarcheaology/artifacts/replicator.dm +++ b/code/modules/xenoarcheaology/artifacts/replicator.dm @@ -63,7 +63,7 @@ /obj/item/weapon/wrench, /obj/item/weapon/screwdriver, /obj/item/weapon/grenade/chem_grenade/cleaner, - /obj/item/weapon/grenade/chem_grenade/metalfoam) // Vorestation edit for vore mimic. + /obj/item/weapon/grenade/chem_grenade/metalfoam) var/quantity = rand(5, 15) for(var/i=0, i gas_data.overlay_limit[g]) - if(!graphic_add) - graphic_add = list() - graphic_add += gas_data.tile_overlay[g] + LAZYADD(graphic_add, gas_data.tile_overlay[g]) . = 0 //Apply changes - if(graphic_add && graphic_add.len) - graphic += graphic_add + if(LAZYLEN(graphic_add)) + LAZYADD(graphic, graphic_add) . = 1 - if(graphic_remove && graphic_remove.len) - graphic -= graphic_remove + if(LAZYLEN(graphic_remove)) + LAZYREMOVE(graphic, graphic_remove) . = 1 diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index f05514ce74e..605cf8fcac6 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -45,6 +45,7 @@ var/total_unit_tests = 0 sleep(1) ticker.current_state = GAME_STATE_SETTING_UP + Master.SetRunLevel(RUNLEVEL_SETUP) log_unit_test("Round has been started. Waiting 10 seconds to start tests.") sleep(100) diff --git a/code/unit_tests/unit_test_vr.dm b/code/unit_tests/unit_test_vr.dm new file mode 100644 index 00000000000..ea4023d7b24 --- /dev/null +++ b/code/unit_tests/unit_test_vr.dm @@ -0,0 +1,26 @@ +// +// VOREStation extensions to unit test framework. +// + +/datum/unit_test + var/static/default_mobloc = null + +/datum/unit_test/proc/create_test_mob(var/turf/mobloc = null, var/mobtype = /mob/living/carbon/human, var/with_mind = FALSE) + if(isnull(mobloc)) + if(!default_mobloc) + for(var/turf/simulated/floor/tiled/T in world) + var/pressure = T.zone.air.return_pressure() + if(90 < pressure && pressure < 120) // Find a turf between 90 and 120 + default_mobloc = T + break + mobloc = default_mobloc + if(!mobloc) + fail("Unable to find a location to create test mob") + return 0 + + var/mob/living/carbon/human/H = new mobtype(mobloc) + + if(with_mind) + H.mind_initialize("TestKey[rand(0,10000)]") + + return H diff --git a/code/unit_tests/vore_tests_vr.dm b/code/unit_tests/vore_tests_vr.dm new file mode 100644 index 00000000000..e50c50b2fac --- /dev/null +++ b/code/unit_tests/vore_tests_vr.dm @@ -0,0 +1,51 @@ +/datum/unit_test/belly_nonsuffocation + name = "MOB: human mob does not suffocate in a belly" + var/startLifeTick + var/startOxyloss + var/endOxyloss + var/mob/living/carbon/human/pred + var/mob/living/carbon/human/prey + async = 1 + +/datum/unit_test/belly_nonsuffocation/start_test() + pred = create_test_mob() + if(!istype(pred)) + return 0 + prey = create_test_mob(pred.loc) + if(!istype(prey)) + return 0 + + return 1 + +/datum/unit_test/belly_nonsuffocation/check_result() + // Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn()) + if(!pred.vore_organs || !pred.vore_organs.len) + return 0 + // Now that pred belly exists, we can eat the prey. + if(prey.loc != pred) + if(!pred.vore_selected) + fail("[pred] has no vore_selected.") + return 1 + var/datum/belly/TB = pred.vore_organs[pred.vore_selected] + TB.nom_mob(prey) + if(prey.loc != pred) + fail("[TB].nom_mob([prey]) did not put prey inside [pred]") + return 1 + // Okay, we succeeded in eating them, now lets wait a bit + startLifeTick = pred.life_tick + startOxyloss = prey.getOxyLoss() + return 0 + + if(pred.life_tick < (startLifeTick + 10)) + return 0 // Wait for them to breathe a few times + + // Alright lets check it! + endOxyloss = prey.getOxyLoss() + if(startOxyloss < endOxyloss) + fail("Prey takes oxygen damage in a pred's belly! (Before: [startOxyloss]; after: [endOxyloss])") + else + pass("Prey is not taking oxygen damage in pred's belly. (Before: [startOxyloss]; after: [endOxyloss])") + + qdel(prey) + qdel(pred) + return 1 diff --git a/code/world.dm b/code/world.dm index 6ab8733b7f8..41be4fc4671 100644 --- a/code/world.dm +++ b/code/world.dm @@ -26,7 +26,8 @@ var/global/datum/global_init/init = new () qdel(src) //we're done /datum/global_init/Destroy() - return 1 + global.init = null + return 2 // QDEL_HINT_IWILLGC /world mob = /mob/new_player @@ -70,8 +71,6 @@ var/global/datum/global_init/init = new () #if UNIT_TEST log_unit_test("Unit Tests Enabled. This will destroy the world when testing is complete.") log_unit_test("If you did not intend to enable this please check code/__defines/unit_testing.dm") -#else - sleep_offline = 1 #endif // Set up roundstart seed list. @@ -119,6 +118,7 @@ var/global/datum/global_init/init = new () processScheduler = new master_controller = new /datum/controller/game_controller() + Master.Initialize(10, FALSE) spawn(1) processScheduler.deferSetupFor(/datum/controller/process/ticker) processScheduler.setup() @@ -436,6 +436,7 @@ var/world_topic_spam_protect_time = world.timeofday */ processScheduler.stop() + Master.Shutdown() //run SS shutdowns for(var/client/C in clients) if(config.server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite diff --git a/config/alienwhitelist.txt b/config/alienwhitelist.txt index a82c759df97..350797ee2a5 100644 --- a/config/alienwhitelist.txt +++ b/config/alienwhitelist.txt @@ -3,8 +3,10 @@ zekesturm - Xenomorph Hybrid bothnevarbackwards - Diona jemli - Gutterband xioen - Xenomorph Hybrid +xioen - Diona sepulchre - Vox sepulchre - Daemon +sepulchre - Xenomorph Hybrid zammyman215 - Vox hawkerthegreat - Vox 1r1s - Daemon @@ -13,6 +15,7 @@ natje - Xenochimera zalvine - Enochian rikaru19xjenkins - Xenochimera rikaru19xjenkins - Xenomorph Hybrid +rixunie - Diona seiga - Vox benemuel - Enochian benemuel - Daemon @@ -20,4 +23,6 @@ vorrarkul - Enochian vorrarkul - Daemon pontifexminimus - Enochian pontifexminimus - Daemon -silvertalismen - Xenochimera \ No newline at end of file +silvertalismen - Xenochimera +silverTalismen - Diona +cameron653 - Xenomorph Hybrid diff --git a/config/custom_items.txt b/config/custom_items.txt index cb7a912a5bb..5ebc8ba763d 100644 --- a/config/custom_items.txt +++ b/config/custom_items.txt @@ -62,6 +62,14 @@ item_name: centcom medical uniform item_desc: A medical uniform straight from Central Command. } +{ +ckey: arokha +character_name: Aronai Kadigan +item_path: /obj/item/clothing/suit/storage/service/expeditionary/medical/command +item_name: centcom medical jacket +item_desc: A medical jacket straight from Central Command. +} + { ckey: arokha character_name: Aronai Kadigan @@ -181,6 +189,12 @@ character_name: Serkii Miishy item_path: /obj/item/clothing/under/skirt/fluff/serkii } +{ +ckey: epiccharger +character_name: Jessie Mare +item_path: /obj/item/clothing/suit/storage/hooded/wintercoat/jessie +} + { ckey: epigraphzero character_name: Verd Woodrow @@ -211,6 +225,12 @@ item_path: /obj/item/weapon/implanter/reagent_generator/belle # ######## I CKEYS +{ +ckey: interrolouis +character_name: Ruda Lizden +item_path:/obj/item/clothing/accessory/badge/holo/detective/ruda +} + { ckey: ivymoomoo character_name: Ivy Baladeva @@ -539,6 +559,12 @@ character_name: Fortune Bloise item_path: /obj/item/weapon/storage/backpack/satchel/fluff/swat43bag } +{ +ckey: SpoopyLizz +character_name: Roiz Lizden +item_path: /obj/item/weapon/implanter/reagent_generator/roiz +} + # ######## T CKEYS { ckey: tonyvld @@ -549,6 +575,16 @@ item_path: /obj/item/clothing/head/fluff/runac # ######## U CKEYS # ######## V CKEYS { +ckey: verkister +character_name: Cameron Eggbert +item_path: /obj/item/clothing/glasses/science_proper +} +{ +ckey: verkister +character_name: Cameron Eggbert +item_path: /obj/item/weapon/disk/limb/eggnerdltd +} +{ ckey: virgo113 character_name: Verin Raharra item_path: /obj/item/clothing/suit/storage/hazardvest/fluff/verin @@ -589,6 +625,12 @@ character_name: Theodora Lindt item_path: /obj/item/weapon/implanter/reagent_generator/vorrarkul } +{ +ckey: vorrarkul +character_name: Kaitlyn Fiasco +item_path: /obj/item/toy/plushie/mouse/fluff +} + { ckey: Viveret character_name: Keturah diff --git a/config/example/config.txt b/config/example/config.txt index 7c7e3971556..e344634847c 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -36,6 +36,9 @@ JOBS_HAVE_MINIMAL_ACCESS Configure how fast explosion strength diminishes when travelling up/down z levels. All explosion distances are multiplied by this each time they go up/down z-levels. #MULTI_Z_EXPLOSION_SCALAR 0.5 +# Radiation weakens with distance from the source; stop calculating when the strength falls below this value. Lower values mean radiation reaches smaller (with increasingly trivial damage) at the cost of more CPU usage. Max range = DISTANCE^2 * POWER / RADIATION_LOWER_LIMIT +# RADIATION_LOWER_LIMIT 0.35 + ## log OOC channel LOG_OOC diff --git a/config/jobwhitelist.txt b/config/jobwhitelist.txt index 01412a104a3..628f17d8992 100644 --- a/config/jobwhitelist.txt +++ b/config/jobwhitelist.txt @@ -1,3 +1,4 @@ # Job whitelist in format ckey - jobname # Like arokha - clown seiga - mime +silvertalismen - clown \ No newline at end of file diff --git a/html/changelogs/Leshana-Radiation.yml b/html/changelogs/Leshana-Radiation.yml new file mode 100644 index 00000000000..d4d9c3589d7 --- /dev/null +++ b/html/changelogs/Leshana-Radiation.yml @@ -0,0 +1,5 @@ +author: Leshana +delete-after: True +changes: + - tweak: "Optimized the unified radiation system. Made the radiation cutoff level configurable." + - bugfix: "Standing still won't save you from radiation storms." diff --git a/html/changelogs/Leshana-smol-fixes.yml b/html/changelogs/Leshana-smol-fixes.yml new file mode 100644 index 00000000000..9d972dec1ab --- /dev/null +++ b/html/changelogs/Leshana-smol-fixes.yml @@ -0,0 +1,4 @@ +author: Leshana +delete-after: True +changes: + - bugfix: "Bedsheets can be put into washing machines again." diff --git a/html/changelogs/MagmaRam - Health Regen.yml b/html/changelogs/MagmaRam - Health Regen.yml new file mode 100644 index 00000000000..c0cab4f13fe --- /dev/null +++ b/html/changelogs/MagmaRam - Health Regen.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: MagmaRam + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +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: + - tweak: "Nerfed health regeneration, especially on bruises." diff --git a/html/changelogs/chao-chainsawsinmyeyes.yml b/html/changelogs/chao-chainsawsinmyeyes.yml new file mode 100644 index 00000000000..be5cc127896 --- /dev/null +++ b/html/changelogs/chao-chainsawsinmyeyes.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Chaoko99 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +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: + - tweak: "Added some shading to the trashpile sprrites. diff --git a/html/changelogs/chaoko99-mapmergepy.yml b/html/changelogs/chaoko99-mapmergepy.yml new file mode 100644 index 00000000000..32e38564aaf --- /dev/null +++ b/html/changelogs/chaoko99-mapmergepy.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: chaoko99 + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +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 mapmerge PY to the \tools directory of the Vorestation repository." + diff --git a/html/changelogs/cirra-Radiation.yml b/html/changelogs/cirra-Radiation.yml new file mode 100644 index 00000000000..53038532cde --- /dev/null +++ b/html/changelogs/cirra-Radiation.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Cirra + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +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 unified radiation system. Radiation is lessened by obstacles, and distance." + - rscadd: "Added a geiger counter for measuring radiation levels, which can be found in certain vending machines and radiation closets." diff --git a/icons/mob/dogborg_vr.dmi b/icons/mob/dogborg_vr.dmi index d76f46466c1..436987eb546 100644 Binary files a/icons/mob/dogborg_vr.dmi and b/icons/mob/dogborg_vr.dmi differ diff --git a/icons/mob/human_races/cyberlimbs/_fluff_vr/rahboop.dmi b/icons/mob/human_races/cyberlimbs/_fluff_vr/rahboop.dmi new file mode 100644 index 00000000000..ea30fe3b1a5 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/_fluff_vr/rahboop.dmi differ diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi index 86e4810f899..414f695db40 100644 Binary files a/icons/mob/human_races/markings_vr.dmi and b/icons/mob/human_races/markings_vr.dmi differ diff --git a/icons/mob/human_races/r_xenochimera.dmi b/icons/mob/human_races/r_xenochimera.dmi index 32f7874a04b..0707a77007f 100644 Binary files a/icons/mob/human_races/r_xenochimera.dmi and b/icons/mob/human_races/r_xenochimera.dmi differ diff --git a/icons/mob/robots.dmi b/icons/mob/robots.dmi index 2b3dfe51d82..e742bdc8040 100644 Binary files a/icons/mob/robots.dmi and b/icons/mob/robots.dmi differ diff --git a/icons/mob/screen1_robot_vr.dmi b/icons/mob/screen1_robot_vr.dmi index 306e957c716..a5c81953950 100644 Binary files a/icons/mob/screen1_robot_vr.dmi and b/icons/mob/screen1_robot_vr.dmi differ diff --git a/icons/mob/taursuits_vr.dmi b/icons/mob/taursuits_vr.dmi index afeb27a7c99..5fbf4739e96 100644 Binary files a/icons/mob/taursuits_vr.dmi and b/icons/mob/taursuits_vr.dmi differ diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi index 1282e081193..b6b1d6e41f1 100644 Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi index 7e474e8249c..805a2c37523 100644 Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ diff --git a/icons/mob/vore64x32.dmi b/icons/mob/vore64x32.dmi new file mode 100644 index 00000000000..05e81137665 Binary files /dev/null and b/icons/mob/vore64x32.dmi differ diff --git a/icons/mob/widerobot_vr.dmi b/icons/mob/widerobot_vr.dmi index f5b2d886f96..5fddf295892 100644 Binary files a/icons/mob/widerobot_vr.dmi and b/icons/mob/widerobot_vr.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 0e0959705e4..dcdb20e070c 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/ammo_vr.dmi b/icons/obj/ammo_vr.dmi index 066d95333eb..fe871d3e66b 100644 Binary files a/icons/obj/ammo_vr.dmi and b/icons/obj/ammo_vr.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 336f8dfe9ca..1198dc03144 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/device_alt.dmi b/icons/obj/device_alt.dmi index fed11b212b2..9c4d2f6b7b3 100644 Binary files a/icons/obj/device_alt.dmi and b/icons/obj/device_alt.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index ba02b5a3246..75f5005aa57 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index 736308440d2..cb4d4042c60 100644 Binary files a/icons/obj/lighting.dmi and b/icons/obj/lighting.dmi differ diff --git a/icons/obj/machines/doorbell_vr.dmi b/icons/obj/machines/doorbell_vr.dmi new file mode 100644 index 00000000000..5dae8ace887 Binary files /dev/null and b/icons/obj/machines/doorbell_vr.dmi differ diff --git a/icons/obj/tank_vr.dmi b/icons/obj/tank_vr.dmi index e5337751671..9e765a0dc18 100644 Binary files a/icons/obj/tank_vr.dmi and b/icons/obj/tank_vr.dmi differ diff --git a/icons/obj/trash_piles.dmi b/icons/obj/trash_piles.dmi new file mode 100644 index 00000000000..a8eea0b14ed Binary files /dev/null and b/icons/obj/trash_piles.dmi differ diff --git a/icons/obj/vending_vr.dmi b/icons/obj/vending_vr.dmi index 1feb5f36c55..e7f1f48d323 100644 Binary files a/icons/obj/vending_vr.dmi and b/icons/obj/vending_vr.dmi differ diff --git a/icons/obj/xenoarchaeology.dmi b/icons/obj/xenoarchaeology.dmi index a074f17c3f9..24ebc6ef6cb 100644 Binary files a/icons/obj/xenoarchaeology.dmi and b/icons/obj/xenoarchaeology.dmi differ diff --git a/icons/vore/custom_guns_vr.dmi b/icons/vore/custom_guns_vr.dmi index 4c2f3ac8136..c8698849580 100644 Binary files a/icons/vore/custom_guns_vr.dmi and b/icons/vore/custom_guns_vr.dmi differ diff --git a/icons/vore/custom_items_vr.dmi b/icons/vore/custom_items_vr.dmi index 1b1653f8c6c..591caa89161 100644 Binary files a/icons/vore/custom_items_vr.dmi and b/icons/vore/custom_items_vr.dmi differ diff --git a/maps/RandomZLevels/carpfarm.dmm b/maps/RandomZLevels/carpfarm.dmm index 612ac1f7e39..8d32d655b9f 100644 --- a/maps/RandomZLevels/carpfarm.dmm +++ b/maps/RandomZLevels/carpfarm.dmm @@ -80,7 +80,7 @@ "bB" = (/obj/machinery/vending/cigarette{prices = list()},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/awaymission/carpfarm/base) "bC" = (/obj/machinery/vending/dinnerware,/obj/machinery/light{dir = 1},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/awaymission/carpfarm/base) "bD" = (/obj/structure/closet/crate/secure/weapon,/obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/awaymission/carpfarm/base) -"bE" = (/obj/structure/closet/crate/secure/weapon,/obj/item/ammo_magazine/clip/a762,/obj/item/ammo_magazine/clip/a762,/obj/item/ammo_magazine/clip/a762,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/awaymission/carpfarm/base) +"bE" = (/obj/structure/closet/crate/secure/weapon,/obj/item/ammo_magazine/clip/c762,/obj/item/ammo_magazine/clip/c762,/obj/item/ammo_magazine/clip/c762,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/awaymission/carpfarm/base) "bF" = (/obj/structure/dispenser/oxygen,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/awaymission/carpfarm/base) "bG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/awaymission/carpfarm/base) "bH" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/carpfarm/base) diff --git a/maps/RandomZLevels/labyrinth.dm b/maps/RandomZLevels/labyrinth.dm index 2046bfc1da6..876f18911d5 100644 --- a/maps/RandomZLevels/labyrinth.dm +++ b/maps/RandomZLevels/labyrinth.dm @@ -90,7 +90,7 @@ /obj/machinery/door/airlock/vault/temple/New() if(prob(33)) new /obj/structure/falsewall/cultspecial(src.loc) - del(src) + qdel(src) if(prob(33)) safe = 0 if(prob(33)) diff --git a/maps/RandomZLevels/listeningpost.dmm b/maps/RandomZLevels/listeningpost.dmm index 287066256ea..5bd0a74608b 100644 --- a/maps/RandomZLevels/listeningpost.dmm +++ b/maps/RandomZLevels/listeningpost.dmm @@ -50,7 +50,7 @@ "aX" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/awaymission/listeningpost) "aY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/mineral,/area/mine/unexplored) "aZ" = (/obj/structure/disposalpipe/segment,/turf/simulated/mineral,/area/mine/unexplored) -"ba" = (/obj/structure/closet,/obj/item/weapon/gun/projectile/pistol,/obj/item/weapon/silencer,/obj/item/ammo_magazine/mc9mm,/obj/item/ammo_magazine/mc9mm,/obj/item/weapon/paper/listneningpost/reciept,/turf/simulated/floor/tiled,/area/awaymission/listeningpost) +"ba" = (/obj/structure/closet,/obj/item/weapon/gun/projectile/pistol,/obj/item/weapon/silencer,/obj/item/ammo_magazine/m9mm,/obj/item/ammo_magazine/m9mm,/obj/item/weapon/paper/listneningpost/reciept,/turf/simulated/floor/tiled,/area/awaymission/listeningpost) "bb" = (/obj/structure/filingcabinet,/obj/item/weapon/paper/listneningpost/mission,/obj/item/weapon/paper/listneningpost/year2558/april,/obj/item/weapon/paper/listneningpost/year2558/may,/obj/item/weapon/paper/listneningpost/year2558/june,/obj/item/weapon/paper/listneningpost/year2558/july,/obj/item/weapon/paper/listneningpost/year2558/august,/obj/item/weapon/paper/listneningpost/year2558/september,/obj/item/weapon/paper/listneningpost/year2558/october,/obj/item/weapon/paper/listneningpost/year2558/november,/obj/item/weapon/paper/listneningpost/year2558/december,/obj/item/weapon/paper/listneningpost/year2559/january,/obj/item/weapon/paper/listneningpost/year2559/february,/obj/item/weapon/paper/listneningpost/year2559/march,/obj/item/weapon/paper/listneningpost/year2559/april,/obj/item/weapon/paper/listneningpost/year2559/may,/obj/item/weapon/paper/listneningpost/year2559/june,/obj/item/weapon/paper/listneningpost/year2559/july,/obj/item/weapon/paper/listneningpost/year2559/august,/obj/item/weapon/paper/listneningpost/year2559/september,/obj/item/weapon/paper/listneningpost/year2559/october,/obj/item/weapon/paper/listneningpost/year2559/november,/obj/item/weapon/paper/listneningpost/year2559/december,/obj/item/weapon/paper/listneningpost/year2560/january,/obj/item/weapon/paper/listneningpost/year2560/february,/obj/item/weapon/paper/listneningpost/year2560/march,/obj/item/weapon/paper/listneningpost/year2560/april,/turf/simulated/floor/tiled,/area/awaymission/listeningpost) "bc" = (/obj/effect/landmark/loot_spawn{live_cargo = 0; name = "loot spawner (no live cargo)"},/turf/simulated/floor/tiled,/area/awaymission/listeningpost) "bd" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled,/area/awaymission/listeningpost) diff --git a/maps/RandomZLevels/snowfield.dmm b/maps/RandomZLevels/snowfield.dmm index ddff964834e..6c13854f490 100644 --- a/maps/RandomZLevels/snowfield.dmm +++ b/maps/RandomZLevels/snowfield.dmm @@ -204,7 +204,7 @@ "dV" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/floor/tiled/neutral,/area/awaymission/snowfield/base) "dW" = (/obj/machinery/door/airlock/highsecurity{locked = 1; name = "Secure Armoury Section"; req_access = list(150)},/turf/simulated/floor/tiled/dark,/area/awaymission/snowfield/base) "dX" = (/obj/structure/closet,/obj/item/clothing/under/soviet,/obj/item/clothing/shoes/boots/jackboots,/obj/item/clothing/head/ushanka,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/turf/simulated/floor/tiled/dark,/area/awaymission/snowfield/base) -"dY" = (/obj/structure/closet/crate/secure/gear,/obj/item/ammo_magazine/clip/a762,/obj/item/ammo_magazine/clip/a762,/obj/item/ammo_magazine/clip/a762,/obj/item/ammo_magazine/clip/a762,/obj/item/ammo_magazine/clip/a762,/turf/simulated/floor/tiled/dark,/area/awaymission/snowfield/base) +"dY" = (/obj/structure/closet/crate/secure/gear,/obj/item/ammo_magazine/clip/c762,/obj/item/ammo_magazine/clip/c762,/obj/item/ammo_magazine/clip/c762,/obj/item/ammo_magazine/clip/c762,/obj/item/ammo_magazine/clip/c762,/turf/simulated/floor/tiled/dark,/area/awaymission/snowfield/base) "dZ" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/closet/crate,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/turf/simulated/floor/tiled/neutral,/area/awaymission/snowfield/base) "ea" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/obj/structure/closet/crate/internals,/turf/simulated/floor/tiled/neutral,/area/awaymission/snowfield/base) "eb" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/suit/hgpirate,/obj/item/clothing/head/hgpiratecap,/obj/structure/closet/crate/secure/gear,/turf/simulated/floor/tiled/neutral,/area/awaymission/snowfield/base) diff --git a/maps/RandomZLevels/stationCollision.dm b/maps/RandomZLevels/stationCollision.dm index b5325c76d83..551611b8f42 100644 --- a/maps/RandomZLevels/stationCollision.dm +++ b/maps/RandomZLevels/stationCollision.dm @@ -54,7 +54,7 @@ B.item_state = "melted" new /obj/item/weapon/paper/sc_safehint_paper_bible(B) new /obj/item/weapon/pen(B) - del(src) + qdel(src) /* * Guns - I'm making these specifically so that I dont spawn a pile of fully loaded weapons on the map. @@ -189,7 +189,7 @@ var/sc_safecode5 = "[rand(0,9)]" else if(istype(A,/obj/)) var/obj/O = A O.ex_act(1.0) - if(O) del(O) + if(O) qdel(O) else if(isturf(A)) var/turf/T = A if(T.intact) diff --git a/maps/RandomZLevels/zresearchlabs.dmm b/maps/RandomZLevels/zresearchlabs.dmm index bf373d621e9..90faea3d06b 100644 --- a/maps/RandomZLevels/zresearchlabs.dmm +++ b/maps/RandomZLevels/zresearchlabs.dmm @@ -287,7 +287,7 @@ "fA" = (/obj/machinery/chem_dispenser,/turf/simulated/floor{icon_state = "white"},/area/awaymission/labs/militarydivision) "fB" = (/obj/machinery/chem_master,/turf/simulated/floor{icon_state = "white"},/area/awaymission/labs/militarydivision) "fC" = (/obj/machinery/sleep_console,/obj/machinery/camera{c_tag = "North Solars"; dir = 8; network = "Tcomsat"},/turf/simulated/floor{icon_state = "white"},/area/awaymission/labs/militarydivision) -"fD" = (/obj/machinery/power/apc{dir = 8; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/obj/structure/closet/crate/secure/weapon,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/item/ammo_magazine/c45,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/labs/militarydivision) +"fD" = (/obj/machinery/power/apc{dir = 8; environ = 0; equipment = 0; lighting = 0; locked = 0; name = "Worn-out APC"; pixel_x = -24; pixel_y = 0},/obj/structure/closet/crate/secure/weapon,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/item/ammo_magazine/m45,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/labs/militarydivision) "fE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/labs/militarydivision) "fF" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 2},/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/labs/militarydivision) "fG" = (/obj/machinery/door_control{id = "miningdorm2"; name = "Gateway Door Control"; normaldoorcontrol = 1; pixel_x = 25; pixel_y = 0; req_access_txt = "0"; specialfunctions = 4},/obj/structure/table/reinforced,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/labs/militarydivision) @@ -302,7 +302,7 @@ "fP" = (/obj/effect/landmark/corpse/doctor{mobname = "Amando Cruz"; name = "Amando Cruz"},/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor{icon_state = "white"},/area/awaymission/labs/militarydivision) "fQ" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/awaymission/labs/militarydivision) "fR" = (/obj/structure/table/reinforced,/obj/item/weapon/paper{icon_state = "paper_words"; info = "As per your request, Director, I have documented my findings on the odd mutation growing from Commander Karl's arm. First of all, in this state he cannot go on any kind of missions. The alien flesh is incredibly painful to him and he can barely hold a rifle properly, no less fit into a tight hardsuit. Early analysis of the tissue shows a DNA structure unlike anything I've seen in my fourty-some odd years of medical practice. It's neither human nor Soghun, I can tell you that much. It has a quality you would expect from the lining of internal organs and is incredibly sensitive. Yet, it is also very resilient. It took me about five tries before I was able to stick a syringe through it. And even then I got just enough blood for a test, not a drop more. The wound healed quickly afterwards, as well. Whatever you boys in science are doing, you've stumbled across something, that's for sure."; name = "Unfinished Form"},/turf/simulated/floor{icon_state = "white"},/area/awaymission/labs/militarydivision) -"fS" = (/obj/structure/closet/crate/secure/weapon,/obj/item/ammo_magazine/a357,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/labs/militarydivision) +"fS" = (/obj/structure/closet/crate/secure/weapon,/obj/item/ammo_magazine/m357,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/labs/militarydivision) "fT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/labs/militarydivision) "fU" = (/obj/machinery/door/window{dir = 8},/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/labs/militarydivision) "fV" = (/obj/machinery/atmospherics/unary/vent_pump,/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/awaymission/labs/militarydivision) @@ -434,7 +434,7 @@ "ir" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/classic_baton,/turf/simulated/floor{icon_state = "wood"},/area/awaymission/labs/militarydivision) "is" = (/obj/effect/decal/cleanable/blood/splatter,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/awaymission/labs/militarydivision) "it" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor,/area/awaymission/labs/militarydivision) -"iu" = (/obj/item/ammo_casing/c9mm{pixel_x = 25; pixel_y = -60},/turf/simulated/floor,/area/awaymission/labs/militarydivision) +"iu" = (/obj/item/ammo_casing/a9mm{pixel_x = 25; pixel_y = -60},/turf/simulated/floor,/area/awaymission/labs/militarydivision) "iv" = (/obj/structure/stool/bed/chair/comfy/beige,/turf/simulated/floor,/area/awaymission/labs/militarydivision) "iw" = (/obj/structure/bookcase,/turf/simulated/floor,/area/awaymission/labs/militarydivision) "ix" = (/obj/machinery/camera{c_tag = "Dormitory South"; c_tag_order = 999; dir = 4},/turf/simulated/floor,/area/awaymission/labs/command) @@ -460,7 +460,7 @@ "iR" = (/obj/structure/table/woodentable,/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/awaymission/labs/militarydivision) "iS" = (/obj/structure/stool/bed/chair/office/dark{dir = 8},/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/awaymission/labs/militarydivision) "iT" = (/obj/structure/stool/bed/chair,/turf/simulated/floor,/area/awaymission/labs/militarydivision) -"iU" = (/obj/item/ammo_casing/c9mm{pixel_x = 3; pixel_y = -22},/turf/simulated/floor,/area/awaymission/labs/militarydivision) +"iU" = (/obj/item/ammo_casing/a9mm{pixel_x = 3; pixel_y = -22},/turf/simulated/floor,/area/awaymission/labs/militarydivision) "iV" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor{icon_state = "green"; dir = 8},/area/awaymission/labs/command) "iW" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor,/area/awaymission/labs/command) "iX" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{icon_state = "blue"; dir = 4},/area/awaymission/labs/command) @@ -486,8 +486,8 @@ "jr" = (/obj/machinery/camera{c_tag = "Central Hallway South-West"; dir = 8},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "carpet"},/area/awaymission/labs/militarydivision) "js" = (/obj/structure/table/standard,/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/labs/militarydivision) "jt" = (/obj/structure/table/standard,/obj/item/weapon/paper{icon_state = "paper_words"; info = "We got back from another ship-out today. Those idiots on the NSV Icarus somehow managed to land themselves in the middle of a fleet of pirates. Frigates were downed easily, and they boarded with the intent to take the artillery cannon. Thankfully, those implants the doctors gave us worked like a charm. I think they made me sick, though, I've got this terrible rash on my arm that is a pain to scratch. Making my skin look all pink and nasty. Gonna go see Doc Brown in the monring, I need some rest after all we've been through."; name = "Journal Page"},/turf/simulated/floor{tag = "icon-cafeteria (NORTHEAST)"; icon_state = "cafeteria"; dir = 5},/area/awaymission/labs/militarydivision) -"ju" = (/obj/item/ammo_casing/c9mm{pixel_y = -8},/turf/simulated/floor,/area/awaymission/labs/militarydivision) -"jv" = (/obj/item/ammo_casing/c9mm{pixel_x = -28; pixel_y = -4},/turf/simulated/floor,/area/awaymission/labs/militarydivision) +"ju" = (/obj/item/ammo_casing/a9mm{pixel_y = -8},/turf/simulated/floor,/area/awaymission/labs/militarydivision) +"jv" = (/obj/item/ammo_casing/a9mm{pixel_x = -28; pixel_y = -4},/turf/simulated/floor,/area/awaymission/labs/militarydivision) "jw" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/hos,/turf/simulated/floor,/area/awaymission/labs/militarydivision) "jx" = (/turf/simulated/floor{icon_state = "green"; dir = 8},/area/awaymission/labs/command) "jy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor,/area/awaymission/labs/command) @@ -856,7 +856,7 @@ "qx" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/labs/civilian) "qy" = (/obj/structure/barricade/wooden,/turf/simulated/floor{icon_state = "bar"},/area/awaymission/labs/civilian) "qz" = (/obj/machinery/door/airlock/glass{name = "Mess Hall"},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/labs/civilian) -"qA" = (/obj/effect/decal/cleanable/blood,/obj/item/ammo_casing/c9mm{pixel_x = 0; pixel_y = -4},/turf/simulated/floor,/area/awaymission/labs/command) +"qA" = (/obj/effect/decal/cleanable/blood,/obj/item/ammo_casing/a9mm{pixel_x = 0; pixel_y = -4},/turf/simulated/floor,/area/awaymission/labs/command) "qB" = (/obj/structure/stool/bed/chair/comfy/brown{dir = 1},/turf/simulated/floor{icon_state = "wood"},/area/awaymission/labs/command) "qC" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{icon_state = "paper_words"; info = "
Research Weekly Report


As of this day (Dec 26, 2556), the research division of Outpost Zeta has made signifcant strides in the development of safe-to-use nanoaugmentations based upon Soghun genetic structure. Though the unfortunate death of Commander Karl was a result of an earlier, more potent batch, his passing has brought great wisdom to our division and through his dead, infected tissue, we are very close to isolating the gene responsible for the fatal abnormal mutation.

Should current schedules and effort remain steady, we are expected to produce a far safer serum in no less than seven days. All data has been saved and uploaded to the main company development server via the nearby telecommunications satellite.

In our firearms department, development of a weapon that fires x-ray beams has proved successful. The weapon is not to be confused with a laser weapon - lasers are primitive tools that simply burn flesh. This weapon is capable of firing toxic beams that poison and harm the target's biological functions, much more painful than a laser burn. Similarly, even after the firefight is over with, or in the event of a retreat, the harmful toxins will remain in the affected individual's bloodstream and cause great discomfort. Your signature and stamp will be required for field tests with the emergency response commandos, Overseer.

End report.

-Doctor Jenkins"; name = "Report"},/turf/simulated/floor{icon_state = "wood"},/area/awaymission/labs/command) "qD" = (/obj/effect/decal/cleanable/blood/tracks,/turf/simulated/floor{icon_state = "wood"},/area/awaymission/labs/command) @@ -866,7 +866,7 @@ "qH" = (/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/awaymission/labs/command) "qI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{tag = "icon-vault (SOUTHWEST)"; icon_state = "vault"; dir = 10},/area/awaymission/labs/command) "qJ" = (/obj/machinery/power/apc{dir = 4; name = "Worn-out APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/labs/command) -"qK" = (/obj/item/ammo_casing/c9mm{pixel_x = 1; pixel_y = 0},/turf/simulated/floor,/area/awaymission/labs/command) +"qK" = (/obj/item/ammo_casing/a9mm{pixel_x = 1; pixel_y = 0},/turf/simulated/floor,/area/awaymission/labs/command) "qL" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/unsimulated/desert,/area/awaymission/labs/cave) "qM" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/labs/civilian) "qN" = (/obj/structure/stool/bed/chair,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "bar"},/area/awaymission/labs/civilian) @@ -1047,8 +1047,8 @@ "ug" = (/obj/machinery/power/apc{cell_type = 5000; dir = 1; name = "Virology APC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/labs/security) "uh" = (/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/labs/security) "ui" = (/obj/structure/closet/secure_closet/warden,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/labs/security) -"uj" = (/obj/structure/rack,/obj/item/ammo_magazine/c45,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/labs/security) -"uk" = (/obj/structure/rack,/obj/item/ammo_magazine/c45,/obj/item/weapon/gun/projectile/silenced/sc_silenced{desc = "A sidearm commonly favored by terrestrial security forces."; icon_state = "g115 Pistol"; name = "Pistol"; silenced = 0},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/labs/security) +"uj" = (/obj/structure/rack,/obj/item/ammo_magazine/m45,/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/labs/security) +"uk" = (/obj/structure/rack,/obj/item/ammo_magazine/m45,/obj/item/weapon/gun/projectile/silenced/sc_silenced{desc = "A sidearm commonly favored by terrestrial security forces."; icon_state = "g115 Pistol"; name = "Pistol"; silenced = 0},/turf/simulated/floor{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/labs/security) "ul" = (/obj/structure/table/standard,/obj/item/weapon/storage/backpack/satchel/med,/turf/simulated/floor{icon_state = "white"},/area/awaymission/labs/medical) "um" = (/obj/machinery/computer/prisoner,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/labs/security) "un" = (/obj/machinery/computer/security,/turf/simulated/floor{icon_state = "showroomfloor"},/area/awaymission/labs/security) diff --git a/maps/northern_star/northern_star.dm b/maps/northern_star/northern_star.dm index 2212774657f..fe95bbaeb64 100644 --- a/maps/northern_star/northern_star.dm +++ b/maps/northern_star/northern_star.dm @@ -7,6 +7,7 @@ #include "polaris-5.dmm" #include "northern_star_defines.dm" + #include "northern_star_shuttles.dm" #define USING_MAP_DATUM /datum/map/northern_star diff --git a/maps/northern_star/northern_star_shuttles.dm b/maps/northern_star/northern_star_shuttles.dm new file mode 100644 index 00000000000..44a5e1a5bd3 --- /dev/null +++ b/maps/northern_star/northern_star_shuttles.dm @@ -0,0 +1,272 @@ +// Escape shuttle and pods +/datum/shuttle/ferry/emergency/centcom + name = "Escape" + location = 1 + warmup_time = 10 + area_offsite = /area/shuttle/escape/centcom + area_station = /area/shuttle/escape/station + area_transition = /area/shuttle/escape/transit + docking_controller_tag = "escape_shuttle" + dock_target_station = "escape_dock" + dock_target_offsite = "centcom_dock" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_one + name = "Escape Pod 1" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod1/station + area_offsite = /area/shuttle/escape_pod1/centcom + area_transition = /area/shuttle/escape_pod1/transit + docking_controller_tag = "escape_pod_1" + dock_target_station = "escape_pod_1_berth" + dock_target_offsite = "escape_pod_1_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_two + name = "Escape Pod 2" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod2/station + area_offsite = /area/shuttle/escape_pod2/centcom + area_transition = /area/shuttle/escape_pod2/transit + docking_controller_tag = "escape_pod_2" + dock_target_station = "escape_pod_2_berth" + dock_target_offsite = "escape_pod_2_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_three + name = "Escape Pod 3" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod3/station + area_offsite = /area/shuttle/escape_pod3/centcom + area_transition = /area/shuttle/escape_pod3/transit + docking_controller_tag = "escape_pod_3" + dock_target_station = "escape_pod_3_berth" + dock_target_offsite = "escape_pod_3_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_four + name = "Escape Pod 4" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod4/station + area_offsite = /area/shuttle/escape_pod4/centcom + area_transition = /area/shuttle/escape_pod4/transit + docking_controller_tag = "escape_pod_4" + dock_target_station = "escape_pod_4_berth" + dock_target_offsite = "escape_pod_4_recovery" + transit_direction = NORTH //should this be SOUTH? I have no idea. + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_five + name = "Escape Pod 5" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod5/station + area_offsite = /area/shuttle/escape_pod5/centcom + area_transition = /area/shuttle/escape_pod5/transit + docking_controller_tag = "escape_pod_5" + dock_target_station = "escape_pod_5_berth" + dock_target_offsite = "escape_pod_5_recovery" + transit_direction = NORTH //should this be WEST? I have no idea. + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_six + name = "Escape Pod 6" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/escape_pod6/station + area_offsite = /area/shuttle/escape_pod6/centcom + area_transition = /area/shuttle/escape_pod6/transit + docking_controller_tag = "escape_pod_6" + dock_target_station = "escape_pod_6_berth" + dock_target_offsite = "escape_pod_6_recovery" + transit_direction = NORTH //should this be WEST? I have no idea. + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/escape_pod_cryo + name = "Cryostorage Shuttle" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/cryo/station + area_offsite = /area/shuttle/cryo/centcom + area_transition = /area/shuttle/cryo/transit + docking_controller_tag = "cryostorage_shuttle" + dock_target_station = "cryostorage_shuttle_berth" + dock_target_offsite = "cryostorage_shuttle_recovery" + transit_direction = NORTH + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/large_escape_pod1 + name = "Large Escape Pod 1" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/large_escape_pod1/station + area_offsite = /area/shuttle/large_escape_pod1/centcom + area_transition = /area/shuttle/large_escape_pod1/transit + docking_controller_tag = "large_escape_pod_1" + dock_target_station = "large_escape_pod_1_berth" + dock_target_offsite = "large_escape_pod_1_recovery" + transit_direction = EAST + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +/datum/shuttle/ferry/escape_pod/large_escape_pod2 + name = "Large Escape Pod 2" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/large_escape_pod2/station + area_offsite = /area/shuttle/large_escape_pod2/centcom + area_transition = /area/shuttle/large_escape_pod2/transit + docking_controller_tag = "large_escape_pod_2" + dock_target_station = "large_escape_pod_2_berth" + dock_target_offsite = "large_escape_pod_2_recovery" + transit_direction = EAST + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +// Cargo shuttle. +/datum/shuttle/ferry/supply/cargo + name = "Supply" + location = 1 + warmup_time = 10 + area_offsite = /area/supply/dock + area_station = /area/supply/station + docking_controller_tag = "supply_shuttle" + dock_target_station = "cargo_bay" + flags = SHUTTLE_FLAGS_PROCESS|SHUTTLE_FLAGS_SUPPLY + +// The "Elevators" +/datum/shuttle/ferry/engineering + name = "Engineering" + warmup_time = 10 + area_offsite = /area/shuttle/constructionsite/site + area_station = /area/shuttle/constructionsite/station + docking_controller_tag = "engineering_shuttle" + dock_target_station = "engineering_dock_airlock" + dock_target_offsite = "edock_airlock" + +/datum/shuttle/ferry/mining + name = "Mining" + warmup_time = 10 + area_offsite = /area/shuttle/mining/outpost + area_station = /area/shuttle/mining/station + docking_controller_tag = "mining_shuttle" + dock_target_station = "mining_dock_airlock" + dock_target_offsite = "mining_outpost_airlock" + +/datum/shuttle/ferry/research + name = "Research" + warmup_time = 10 + area_offsite = /area/shuttle/research/outpost + area_station = /area/shuttle/research/station + docking_controller_tag = "research_shuttle" + dock_target_station = "research_dock_airlock" + dock_target_offsite = "research_outpost_dock" + +// Admin shuttles. +/datum/shuttle/ferry/centcom + name = "Centcom" + location = 1 + warmup_time = 10 + area_offsite = /area/shuttle/transport1/centcom + area_station = /area/shuttle/transport1/station + docking_controller_tag = "centcom_shuttle" + dock_target_station = "centcom_shuttle_dock_airlock" + dock_target_offsite = "centcom_shuttle_bay" + +/datum/shuttle/ferry/administration + name = "Administration" + location = 1 + warmup_time = 10 //want some warmup time so people can cancel. + area_offsite = /area/shuttle/administration/centcom + area_station = /area/shuttle/administration/station + docking_controller_tag = "admin_shuttle" + dock_target_station = "admin_shuttle_dock_airlock" + dock_target_offsite = "admin_shuttle_bay" + +// Traders +/datum/shuttle/ferry/trade + name = "Trade" + location = 1 + warmup_time = 10 //want some warmup time so people can cancel. + area_offsite = /area/shuttle/trade/centcom + area_station = /area/shuttle/trade/station + docking_controller_tag = "trade_shuttle" + dock_target_station = "trade_shuttle_dock_airlock" + dock_target_offsite = "trade_shuttle_bay" + +// Is this even used? +/datum/shuttle/ferry/alien + name = "Alien" + area_offsite = /area/shuttle/alien/base + area_station = /area/shuttle/alien/mine + flags = SHUTTLE_FLAGS_NONE + +// Mercenary +/datum/shuttle/multi_shuttle/mercenary + name = "Mercenary" + warmup_time = 0 + origin = /area/syndicate_station/start + interim = /area/syndicate_station/transit + start_location = "Mercenary Base" + destinations = list( + "Northwest of the station" = /area/syndicate_station/northwest, + "North of the station" = /area/syndicate_station/north, + "Northeast of the station" = /area/syndicate_station/northeast, + "Southwest of the station" = /area/syndicate_station/southwest, + "South of the station" = /area/syndicate_station/south, + "Southeast of the station" = /area/syndicate_station/southeast, + "Telecomms Satellite" = /area/syndicate_station/commssat, + "Mining Station" = /area/syndicate_station/mining, + "Arrivals dock" = /area/syndicate_station/arrivals_dock, + ) + docking_controller_tag = "merc_shuttle" + destination_dock_targets = list( + "Mercenary Base" = "merc_base", + "Arrivals dock" = "nuke_shuttle_dock_airlock", + ) + announcer = "Automated Traffic Control" + +/datum/shuttle/multi_shuttle/mercenary/New() + arrival_message = "Attention. A vessel is approaching the colony." + departure_message = "Attention. A vessel is now leaving from the colony." + ..() + +// Heist +/datum/shuttle/multi_shuttle/skipjack + name = "Skipjack" + warmup_time = 0 + origin = /area/skipjack_station/start + interim = /area/skipjack_station/transit + destinations = list( + "Fore Starboard Solars" = /area/skipjack_station/northeast_solars, + "Fore Port Solars" = /area/skipjack_station/northwest_solars, + "Aft Starboard Solars" = /area/skipjack_station/southeast_solars, + "Aft Port Solars" = /area/skipjack_station/southwest_solars, + "Mining Station" = /area/skipjack_station/mining + ) + announcer = "Automated Traffic Control" + +/datum/shuttle/multi_shuttle/skipjack/New() + arrival_message = "Attention. Unidentified object approaching the colony." + departure_message = "Attention. Unidentified object exiting local space. Unidentified object expected to escape Kara gravity well with current velocity." + ..() + +/datum/shuttle/ferry/multidock/specops/ert + name = "Special Operations" + location = 0 + warmup_time = 10 + area_offsite = /area/shuttle/specops/station //centcom is the home station, the Exodus is offsite + area_station = /area/shuttle/specops/centcom + docking_controller_tag = "specops_shuttle_port" + docking_controller_tag_station = "specops_shuttle_port" + docking_controller_tag_offsite = "specops_shuttle_fore" + dock_target_station = "specops_centcom_dock" + dock_target_offsite = "specops_dock_airlock" + + diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index 2b58fe71757..faa45896592 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -2311,7 +2311,7 @@ "aSw" = (/obj/structure/bed/chair{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "aSx" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/security) "aSy" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/security_port) -"aSz" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/red/full,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(2)},/turf/simulated/floor/tiled/dark,/area/security/armoury) +"aSz" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/red/full,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/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/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(2)},/turf/simulated/floor/tiled/dark,/area/security/armoury) "aSA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aSB" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aSC" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) @@ -5255,7 +5255,7 @@ "bXc" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/tiled/white,/area/medical/patient_b) "bXd" = (/obj/effect/floor_decal/corner/pink{dir = 10},/obj/structure/table/glass,/obj/item/weapon/paper_bin,/obj/item/weapon/clipboard,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/medical/patient_b) "bXe" = (/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/effect/floor_decal/corner/pink/full{dir = 4},/obj/machinery/light,/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 21},/turf/simulated/floor/tiled/white,/area/medical/patient_b) -"bXf" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/turf/simulated/floor/tiled,/area/security/range) +"bXf" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/item/ammo_magazine/m9mmt/practice,/obj/item/ammo_magazine/m9mmt/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/turf/simulated/floor/tiled,/area/security/range) "bXg" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/structure/table/steel,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/item/device/radio{frequency = 1487; icon_state = "med_walkietalkie"; name = "Medbay Emergency Radio Link"},/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bXh" = (/obj/structure/closet/crate{icon_state = "crateopen"; name = "Grenade Crate"; opened = 1},/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bXi" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 8; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/carpet/blue,/area/medical/psych) @@ -6167,7 +6167,7 @@ "coE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 26},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "coF" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "coG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/sleep/elevator) -"coH" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/machinery/door/window/brigdoor/northright{name = "Ammo"},/turf/simulated/floor/tiled/dark,/area/security/tactical) +"coH" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/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/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/machinery/door/window/brigdoor/northright{name = "Ammo"},/turf/simulated/floor/tiled/dark,/area/security/tactical) "coI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/medbay_aft) "coJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/medbay_aft) "coK" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/medbay_aft) diff --git a/maps/northern_star/polaris-2.dmm b/maps/northern_star/polaris-2.dmm index 3f14b894893..edead8f1980 100644 --- a/maps/northern_star/polaris-2.dmm +++ b/maps/northern_star/polaris-2.dmm @@ -859,7 +859,7 @@ "aqA" = (/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 = "dark"},/area/centcom/specops) "aqB" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/gun/energy/ionrifle,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqC" = (/obj/structure/window/reinforced{dir = 8},/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 = "dark"},/area/centcom/specops) -"aqD" = (/obj/structure/table/rack,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aqD" = (/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/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,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqE" = (/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{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqF" = (/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 = "dark"},/area/centcom/specops) "aqG" = (/obj/machinery/vending/security,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -869,11 +869,11 @@ "aqK" = (/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) "aqL" = (/obj/structure/sign/securearea,/turf/simulated/shuttle/wall/dark/hard_corner,/area/centcom/specops) "aqM" = (/obj/machinery/door/airlock/centcom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aqN" = (/obj/structure/table/rack,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aqN" = (/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,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqO" = (/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) "aqP" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aqQ" = (/obj/structure/table/rack,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/weapon/gun/projectile/automatic/p90,/obj/item/weapon/gun/projectile/automatic/p90,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aqR" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aqQ" = (/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) +"aqR" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "aqS" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) "aqT" = (/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) "aqU" = (/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) @@ -896,7 +896,7 @@ "arl" = (/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 = "dark"},/area/centcom/specops) "arm" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/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 = "dark"},/area/centcom/specops) "arn" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"aro" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"aro" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arp" = (/obj/machinery/deployable/barrier,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arq" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arr" = (/obj/effect/floor_decal/corner/purple{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) @@ -953,7 +953,7 @@ "asq" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "asr" = (/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) "ass" = (/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) -"ast" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"ast" = (/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 = "dark"},/area/centcom/specops) "asu" = (/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 = "dark"},/area/centcom/specops) "asv" = (/obj/structure/table/reinforced,/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 = "dark"},/area/centcom/specops) "asw" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -1179,7 +1179,7 @@ "awI" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "awJ" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "awK" = (/obj/structure/closet/hydrant{pixel_y = 32},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) -"awL" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/ammo_magazine/mc9mm/flash,/obj/item/weapon/gun/projectile/pistol/flash,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) +"awL" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/ammo_magazine/m9mm/flash,/obj/item/weapon/gun/projectile/pistol/flash,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "awM" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/syndicate_mothership) "awN" = (/obj/machinery/door/airlock/centcom{name = "Bathroom"; opacity = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "awO" = (/obj/machinery/shower{dir = 1},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) @@ -1207,8 +1207,8 @@ "axk" = (/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_mothership) "axl" = (/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_mothership) "axm" = (/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_mothership) -"axn" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/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_mothership) -"axo" = (/obj/structure/table/rack,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"axn" = (/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_mothership) +"axo" = (/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/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "axp" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) "axq" = (/obj/machinery/vending/boozeomat,/turf/simulated/shuttle/wall/dark,/area/shuttle/administration/centcom) "axr" = (/obj/machinery/vending/coffee,/turf/simulated/shuttle/floor/red,/area/shuttle/administration/centcom) diff --git a/maps/tether/tether-01-surface.dmm b/maps/tether/tether-01-surface.dmm index 43fe590b615..437ab7d8d22 100644 --- a/maps/tether/tether-01-surface.dmm +++ b/maps/tether/tether-01-surface.dmm @@ -30,7 +30,7 @@ "aaD" = (/obj/machinery/conveyor{dir = 1; id = "mining_inbound"},/turf/simulated/floor/plating,/area/tether/surfacebase/mining_main/refinery) "aaE" = (/obj/random/maintenance/cargo,/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/tether/surfacebase/mining_main/refinery) "aaF" = (/obj/random/contraband,/obj/random/maintenance/cargo,/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/tether/surfacebase/mining_main/refinery) -"aaG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/closet,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/clean,/obj/random/junk,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum{desc = "TASTE DEMOCRACY"; name = "Managed Democra-cider"},/obj/random_multi/single_item/teleport,/obj/random/contraband,/obj/random/cigarettes,/turf/simulated/floor/wood,/area/vacant/vacant_site2) +"aaG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/closet,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/clean,/obj/random/junk,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum{desc = "TASTE DEMOCRACY"; name = "Managed Democra-cider"},/obj/random/contraband,/obj/random/cigarettes,/turf/simulated/floor/wood,/area/vacant/vacant_site2) "aaH" = (/obj/machinery/mineral/output,/obj/machinery/conveyor{dir = 10; id = "mining_interior"},/turf/simulated/floor/plating,/area/tether/surfacebase/mining_main/refinery) "aaI" = (/obj/machinery/conveyor{dir = 4; id = "mining_interior"},/turf/simulated/floor/plating,/area/tether/surfacebase/mining_main/refinery) "aaJ" = (/obj/machinery/mineral/input,/obj/machinery/conveyor{dir = 4; id = "mining_interior"},/turf/simulated/floor/plating,/area/tether/surfacebase/mining_main/refinery) @@ -62,7 +62,7 @@ "abj" = (/obj/machinery/mineral/stacking_unit_console{density = 0; layer = 3.3; pixel_y = 30},/turf/simulated/floor/tiled/steel_grid,/area/tether/surfacebase/mining_main/refinery) "abk" = (/obj/effect/floor_decal/industrial/loading,/obj/machinery/light_switch{pixel_x = 25},/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/refinery) "abl" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) -"abm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/drinkbottle,/obj/random/medical/lite,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random_multi/single_item/netgun,/turf/simulated/floor/wood,/area/vacant/vacant_site2) +"abm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/random/trash_pile,/turf/simulated/floor/wood,/area/vacant/vacant_site2) "abn" = (/turf/simulated/wall,/area/tether/surfacebase/mining_main/storage) "abo" = (/obj/structure/closet/firecloset,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/tether/surfacebase/mining_main/storage) "abp" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/brown/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/brown/bordercorner2{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) @@ -101,7 +101,7 @@ "abW" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) "abX" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) "abY" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) -"abZ" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) +"abZ" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) "aca" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/obj/machinery/alarm{pixel_y = 22},/obj/machinery/washing_machine,/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) "acb" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/obj/item/device/radio/intercom{pixel_y = 24; req_access = list()},/obj/machinery/washing_machine,/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) "acc" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) @@ -119,7 +119,7 @@ "aco" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "acp" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "acq" = (/obj/machinery/door/airlock/maintenance/medical{name = "Medical Maintenance Access"},/obj/machinery/door/firedoor/glass,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) -"acr" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{pixel_y = 22; target_temperature = 273.15},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/lower/mining_eva) +"acr" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{pixel_y = 22; target_temperature = 293.15},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/lower/mining_eva) "acs" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 10; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/maintenance/lower/mining_eva) "act" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/brown/border{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) "acu" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/brown/border,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) @@ -203,7 +203,7 @@ "adU" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/shovel,/obj/machinery/light,/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/tether/surfacebase/mining_main/storage) "adV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) "adW" = (/obj/item/weapon/pickaxe,/obj/structure/table/steel,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/brown/border,/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/brown/bordercorner2,/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) -"adX" = (/obj/item/stack/flag/green{pixel_x = -4; pixel_y = 0},/obj/item/stack/flag/red,/obj/item/stack/flag/yellow{pixel_x = 4},/obj/structure/table/steel,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/brown/border{dir = 6},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) +"adX" = (/obj/item/stack/flag/green{pixel_x = -4; pixel_y = 0},/obj/item/stack/flag/red,/obj/item/stack/flag/yellow{pixel_x = 4},/obj/structure/table/steel,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/brown/border{dir = 6},/obj/item/weapon/storage/box/nifsofts_mining,/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) "adY" = (/obj/machinery/suit_cycler/mining,/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/brown/border{dir = 10},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/eva) "adZ" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/void/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/mining,/obj/item/weapon/mining_scanner,/obj/item/clothing/suit/space/void/mining/taur,/obj/item/clothing/head/helmet/space/void/mining,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/brown/border,/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/eva) "aea" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/void/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/mining,/obj/item/weapon/mining_scanner,/obj/item/clothing/suit/space/void/mining/taur,/obj/item/clothing/head/helmet/space/void/mining,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/brown/border{dir = 6},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/eva) @@ -254,9 +254,9 @@ "aeT" = (/obj/machinery/power/sensor{name = "Powernet Sensor - Mining Subgrid"; name_tag = "Mining Subgrid"},/obj/structure/cable/green{icon_state = "0-4"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/maintenance/substation/mining) "aeU" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/substation/mining) "aeV" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{pixel_y = 22},/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/substation/mining) -"aeW" = (/obj/machinery/door/airlock/engineering{name = "Science Substation"; req_one_access = list(11,24,47)},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/maintenance/substation/mining) +"aeW" = (/obj/machinery/door/airlock/engineering{name = "Mining Substation"; req_one_access = list(11,24,47)},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/maintenance/substation/mining) "aeX" = (/obj/structure/catwalk,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining_eva) -"aeY" = (/obj/effect/floor_decal/techfloor{dir = 1},/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/floor/tiled/techfloor,/area/maintenance/lower/mining) +"aeY" = (/obj/effect/floor_decal/techfloor{dir = 1},/obj/machinery/vending/cigarette{name = "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/floor/tiled/techfloor,/area/maintenance/lower/mining) "aeZ" = (/obj/effect/floor_decal/techfloor{dir = 1},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) "afa" = (/obj/structure/closet/crate,/turf/simulated/floor/tiled/steel_dirty,/area/tether/surfacebase/mining_main/ore) "afb" = (/obj/effect/floor_decal/rust,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/steel_dirty,/area/tether/surfacebase/mining_main/ore) @@ -304,7 +304,7 @@ "afR" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Mining Substation Bypass"},/turf/simulated/floor,/area/maintenance/substation/mining) "afS" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/camera/network/engineering{dir = 1},/turf/simulated/floor,/area/maintenance/substation/mining) "afT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/maintenance/substation/mining) -"afU" = (/obj/machinery/door/airlock/engineering{name = "Science Substation"; req_one_access = list(11,24,47)},/obj/machinery/door/firedoor/glass,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/maintenance/substation/mining) +"afU" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/engineering{name = "Mining Substation"; req_one_access = list(11,24,47)},/turf/simulated/floor,/area/maintenance/substation/mining) "afV" = (/obj/structure/catwalk,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining_eva) "afW" = (/obj/structure/railing{dir = 8},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining_eva) "afX" = (/obj/effect/floor_decal/techfloor{dir = 1},/obj/structure/bed/padded,/obj/item/weapon/bedsheet/mime,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) @@ -337,7 +337,7 @@ "agy" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/brown/bordercorner2{dir = 6},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/lobby) "agz" = (/obj/effect/floor_decal/techfloor{dir = 4},/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "agA" = (/obj/effect/floor_decal/techfloor{dir = 5},/obj/effect/floor_decal/techfloor/hole/right{dir = 1},/obj/structure/undies_wardrobe,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) -"agB" = (/obj/structure/closet,/obj/random/action_figure,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/lower/mining) +"agB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) "agC" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 1},/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "agD" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/brown/border{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/vending/wallmed_airlock{pixel_x = -32},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/storage) "agE" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/newscaster{pixel_x = -30},/turf/simulated/floor/tiled,/area/storage/primary) @@ -349,7 +349,7 @@ "agK" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/tether/surfacebase/mining_main/lobby) "agL" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/effect/floor_decal/techfloor/hole/right{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) "agM" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) -"agN" = (/obj/random_multi/single_item/teleport,/obj/random/cigarettes,/obj/random/toy,/obj/random/tech_supply,/obj/random/junk,/obj/item/weapon/flame/lighter/zippo,/turf/simulated/floor/plating,/area/maintenance/lower/mining) +"agN" = (/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/mining) "agO" = (/obj/effect/floor_decal/techfloor{dir = 4},/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "agP" = (/turf/simulated/wall,/area/storage/surface_eva) "agQ" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -28},/turf/simulated/floor/tiled,/area/storage/primary) @@ -373,7 +373,7 @@ "ahi" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/turf/simulated/floor/tiled/steel_grid,/area/storage/primary) "ahj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/storage/primary) "ahk" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass{name = "Primary Tool Storage"},/turf/simulated/floor/tiled/steel_grid,/area/storage/primary) -"ahl" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining_eva) +"ahl" = (/obj/random/cigarettes,/obj/random/toy,/obj/random/tech_supply,/obj/random/junk,/obj/item/weapon/flame/lighter/zippo,/turf/simulated/floor/plating,/area/maintenance/lower/mining) "ahm" = (/obj/effect/floor_decal/techfloor,/obj/effect/decal/cleanable/dirt,/obj/structure/table/steel,/obj/random/drinkbottle,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) "ahn" = (/obj/effect/floor_decal/corner_techfloor_grid,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) "aho" = (/obj/structure/railing{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining_eva) @@ -401,7 +401,7 @@ "ahK" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) "ahL" = (/obj/machinery/atm{pixel_y = 31},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) "ahM" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/machinery/station_map{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) -"ahN" = (/obj/machinery/alarm{pixel_y = 22; target_temperature = 273.15},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) +"ahN" = (/obj/machinery/alarm{pixel_y = 22; target_temperature = 293.15},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) "ahO" = (/obj/structure/extinguisher_cabinet{pixel_y = 30},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) "ahP" = (/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) "ahQ" = (/obj/machinery/camera/network/northern_star,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) @@ -411,7 +411,7 @@ "ahU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/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/hallway/lower/first_west) "ahV" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/lightgrey/border{dir = 5},/obj/structure/closet/firecloset,/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 5},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) "ahW" = (/turf/simulated/wall,/area/tether/surfacebase/north_stairs_one) -"ahX" = (/obj/effect/floor_decal/techfloor{dir = 4},/obj/structure/railing,/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/crate,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"ahX" = (/obj/effect/floor_decal/techfloor{dir = 4},/obj/structure/railing,/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "ahY" = (/obj/structure/sign/directions/cargo{dir = 4},/turf/simulated/wall,/area/tether/surfacebase/north_stairs_one) "ahZ" = (/obj/structure/sign/directions/evac{dir = 4},/turf/simulated/wall,/area/tether/surfacebase/north_stairs_one) "aia" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/floor_decal/corner/lightgrey/border{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) @@ -686,9 +686,9 @@ "anj" = (/obj/machinery/door/airlock/glass_medical{name = "First-Aid Station"; req_one_access = newlist()},/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},/turf/simulated/floor/tiled/steel_grid,/area/tether/surfacebase/medical/first_aid_west) "ank" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) "anl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) -"anm" = (/obj/effect/floor_decal/techfloor,/obj/structure/railing{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"anm" = (/obj/effect/floor_decal/techfloor,/obj/structure/railing{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "ann" = (/obj/structure/railing{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) -"ano" = (/obj/structure/railing{dir = 4},/obj/structure/railing{dir = 1},/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) +"ano" = (/obj/effect/floor_decal/techfloor,/obj/structure/railing{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "anp" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/guestpass{dir = 4; pixel_x = -28; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) "anq" = (/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/tether/surfacebase/atrium_one) "anr" = (/obj/structure/flora/ausbushes/ywflowers,/obj/structure/flora/ausbushes/ywflowers,/turf/simulated/floor/grass,/area/tether/surfacebase/atrium_one) @@ -718,8 +718,8 @@ "anP" = (/obj/structure/disposalpipe/segment,/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) "anQ" = (/obj/structure/sign/directions/evac,/turf/simulated/wall,/area/crew_quarters/locker) "anR" = (/turf/simulated/wall,/area/crew_quarters/locker) -"anS" = (/obj/effect/floor_decal/techfloor,/obj/structure/railing{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) -"anT" = (/turf/simulated/mineral,/area/space) +"anS" = (/obj/effect/floor_decal/techfloor{dir = 5},/obj/structure/closet/firecloset,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) +"anT" = (/turf/simulated/wall,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) "anU" = (/obj/structure/table/standard,/obj/machinery/computer/atmoscontrol/laptop{monitored_alarm_ids = list("isolation_one","isolation_two"); req_one_access = list(47,24,11)},/turf/simulated/floor/tiled,/area/rnd/anomaly_lab) "anV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/rnd/anomaly_lab/containment_one) "anW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/rnd/anomaly_lab/containment_one) @@ -741,7 +741,7 @@ "aom" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/structure/disposalpipe/trunk,/obj/machinery/disposal,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "aon" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/lightgrey/border{dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "aoo" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled/white,/area/crew_quarters/locker) -"aop" = (/obj/machinery/alarm{pixel_y = 22; target_temperature = 273.15},/turf/simulated/floor/tiled/white,/area/crew_quarters/locker) +"aop" = (/obj/structure/kitchenspike,/obj/machinery/alarm{pixel_y = 22; target_temperature = 293.15},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) "aoq" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/tiled/white,/area/crew_quarters/locker) "aor" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/locker) "aos" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled,/area/rnd/anomaly_lab) @@ -788,14 +788,14 @@ "aph" = (/obj/machinery/light{dir = 4},/obj/item/device/suit_cooling_unit,/obj/structure/table/rack,/turf/simulated/floor/tiled,/area/rnd/xenoarch_storage) "api" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) "apj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/hallway/lower/first_west) -"apk" = (/obj/effect/floor_decal/techfloor{dir = 5},/obj/structure/closet/firecloset,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random_multi/single_item/teleport,/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) -"apl" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) +"apk" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) +"apl" = (/obj/structure/closet,/obj/random/maintenance/medical,/obj/random/maintenance/clean,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) "apm" = (/obj/structure/railing{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) "apn" = (/obj/structure/railing{dir = 8},/obj/structure/railing{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) -"apo" = (/obj/structure/closet,/obj/random/maintenance/medical,/obj/random/maintenance/clean,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random_multi/single_item/netgun,/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) +"apo" = (/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining_eva) "app" = (/obj/structure/railing{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) "apq" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) -"apr" = (/obj/structure/table/rack,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining_eva) +"apr" = (/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) "aps" = (/obj/structure/railing{dir = 8},/obj/machinery/atmospherics/pipe/zpipe/up/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/zpipe/up/supply{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable{icon_state = "16-0"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining_eva) "apt" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) "apu" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/machinery/status_display{pixel_x = 32; pixel_y = 0},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) @@ -829,7 +829,7 @@ "apW" = (/turf/simulated/wall,/area/maintenance/substation/civ_west) "apX" = (/obj/structure/railing{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) "apY" = (/obj/structure/railing{dir = 8},/obj/machinery/atmospherics/binary/passive_gate{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) -"apZ" = (/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/random_multi/single_item/teleport,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) +"apZ" = (/obj/effect/floor_decal/rust,/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) "aqa" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{dir = 4; icon_state = "extinguisher_closed"; pixel_x = -30; tag = "icon-extinguisher_closed (EAST)"},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) "aqb" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/machinery/computer/guestpass{dir = 8; pixel_x = 25},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) "aqc" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/locker) @@ -909,8 +909,8 @@ "ary" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/tether/surfacebase/tram) "arz" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/tether/surfacebase/tram) "arA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/tether/surfacebase/tram) -"arB" = (/turf/simulated/floor/maglev,/area/shuttle/escape/station) -"arC" = (/turf/simulated/floor/tiled/techfloor/grid,/area/shuttle/escape/station) +"arB" = (/turf/simulated/floor/maglev,/area/shuttle/escape/station{base_turf = /turf/simulated/floor/tiled/techfloor/grid}) +"arC" = (/turf/simulated/floor/tiled/techfloor/grid,/area/shuttle/escape/station{base_turf = /turf/simulated/floor/tiled/techfloor/grid}) "arD" = (/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/machinery/portable_atmospherics/canister/phoron,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/monotile,/area/rnd/anomaly_lab) "arE" = (/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/tiled/monotile,/area/rnd/anomaly_lab) "arF" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/corner/white{dir = 9},/obj/effect/floor_decal/corner/white{dir = 6},/turf/simulated/floor/tiled,/area/rnd/anomaly_lab) @@ -930,7 +930,7 @@ "arT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/maintenance/lower/solars) "arU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/airlock/engineering{name = "Civilian West Substation"; req_one_access = list(11)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/maintenance/lower/solars) "arV" = (/obj/machinery/light/small{dir = 1},/obj/structure/railing{dir = 4},/turf/simulated/floor/plating,/area/maintenance/lower/solars) -"arW" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/alarm{pixel_y = 22; target_temperature = 273.15},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/lower/solars) +"arW" = (/obj/machinery/alarm{pixel_y = 22; target_temperature = 293.15},/turf/simulated/floor/tiled/white,/area/crew_quarters/locker) "arX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/lower/solars) "arY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/solars) "arZ" = (/obj/machinery/door/airlock/maintenance/common{name = "Solars Maintenance Access"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/catwalk,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/maintenance/lower/xenoflora) @@ -1064,7 +1064,7 @@ "aux" = (/obj/effect/floor_decal/borderfloor,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/obj/effect/floor_decal/corner/lightgrey/border,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 8},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) "auy" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/obj/effect/floor_decal/corner/lightgrey/bordercorner{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 1},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) "auz" = (/obj/machinery/recharge_station,/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor/holofloor/tiled/dark,/area/crew_quarters/locker) -"auA" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/locker) +"auA" = (/obj/structure/anomaly_container,/turf/simulated/floor/tiled,/area/rnd/anomaly_lab) "auB" = (/obj/effect/floor_decal/steeldecal/steel_decals6{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/locker) "auC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "1-2"},/obj/effect/floor_decal/steeldecal/steel_decals6,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "auD" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/lightgrey/bordercorner2,/turf/simulated/floor/tiled,/area/crew_quarters/locker) @@ -1081,7 +1081,7 @@ "auO" = (/obj/structure/table/rack,/obj/item/clothing/suit/bio_suit/anomaly,/obj/item/clothing/head/bio_hood/anomaly,/obj/item/clothing/mask/breath,/obj/item/clothing/glasses/science,/obj/item/clothing/gloves/sterile/latex,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled,/area/rnd/anomaly_lab) "auP" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/mauve/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/rnd/hallway) "auQ" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/mauve/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/rnd/hallway) -"auR" = (/obj/structure/closet/crate,/obj/random/action_figure,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining_eva) +"auR" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 4},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "auS" = (/obj/effect/floor_decal/rust,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/lower/solars) "auT" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/structure/cable{icon_state = "1-8"},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/lower/solars) "auU" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/mauve/border{dir = 9},/obj/machinery/camera/network/research{dir = 4},/obj/structure/closet/secure_closet/hydroponics{req_access = list(47)},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora) @@ -1095,7 +1095,7 @@ "avc" = (/obj/machinery/door/window/brigdoor/southright{req_access = list(55); req_one_access = list(47)},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora/lab_atmos) "avd" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora/lab_atmos) "ave" = (/obj/structure/window/reinforced,/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/industrial/danger{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/machinery/status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled,/area/rnd/xenobiology/xenoflora/lab_atmos) -"avf" = (/obj/effect/floor_decal/rust,/obj/structure/closet,/obj/random_multi/single_item/teleport,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) +"avf" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/random/cigarettes,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "avg" = (/obj/structure/catwalk,/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) "avh" = (/turf/simulated/floor/plating,/area/maintenance/lower/xenoflora) "avi" = (/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) @@ -1152,7 +1152,7 @@ "awh" = (/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/tether/surfacebase/atrium_one) "awi" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/obj/effect/floor_decal/industrial/danger{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_one) "awj" = (/obj/machinery/status_display{pixel_y = 30},/obj/machinery/vending/fitness,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/turf/simulated/floor/tiled/monotile,/area/crew_quarters/locker/laundry_arrival) -"awk" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/turf/simulated/floor/tiled/monotile,/area/crew_quarters/locker/laundry_arrival) +"awk" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/machinery/vending/nifsoft_shop,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "awl" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/turf/simulated/floor/tiled/monotile,/area/crew_quarters/locker/laundry_arrival) "awm" = (/obj/machinery/camera/network/civilian,/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/turf/simulated/floor/tiled/monotile,/area/crew_quarters/locker/laundry_arrival) "awn" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/lightgrey/border{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/locker/laundry_arrival) @@ -1236,7 +1236,7 @@ "axN" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals4,/obj/effect/landmark/tram,/turf/simulated/floor/tiled,/area/tether/surfacebase/tram) "axO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/machinery/camera/network/northern_star{dir = 5},/turf/simulated/floor/tiled,/area/tether/surfacebase/tram) "axP" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/maintenance/lower/solars) -"axQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{pixel_y = 22; target_temperature = 273.15},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/solars) +"axQ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/alarm{pixel_y = 22; target_temperature = 293.15},/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/lower/solars) "axR" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/lower/solars) "axS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance/common,/turf/simulated/floor/plating,/area/maintenance/lower/solars) "axT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/maintenance/lower/solars) @@ -1425,7 +1425,7 @@ "aBu" = (/obj/structure/railing{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 10},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "aBv" = (/obj/structure/railing{dir = 4},/obj/structure/railing{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "aBw" = (/obj/structure/catwalk,/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/structure/cable{icon_state = "1-2"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) -"aBx" = (/obj/structure/catwalk,/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/random/cigarettes,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"aBx" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/random/junk,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aBy" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/locker_room) "aBz" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/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"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/locker_room) "aBA" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/maintenance/lower/solars) @@ -1453,10 +1453,10 @@ "aBW" = (/obj/machinery/floodlight,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/techfloor,/area/tether/surfacebase/emergency_storage/rnd) "aBX" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/machinery/camera/network/northern_star{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "aBY" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) -"aBZ" = (/obj/structure/catwalk,/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/random/junk,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"aBZ" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aCa" = (/obj/structure/catwalk,/obj/structure/cable{icon_state = "1-2"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "aCb" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/mouse,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/locker_room) -"aCc" = (/obj/structure/catwalk,/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/random/junk,/obj/random/junk,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"aCc" = (/obj/structure/railing{dir = 8},/obj/structure/railing{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aCd" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/locker_room) "aCe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/tether/surfacebase/tram) "aCf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/tether/surfacebase/tram) @@ -1487,7 +1487,7 @@ "aCE" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/techfloor,/area/tether/surfacebase/emergency_storage/rnd) "aCF" = (/obj/structure/table/standard,/obj/item/device/t_scanner,/obj/item/weapon/storage/briefcase/inflatable,/turf/simulated/floor/tiled/techfloor,/area/tether/surfacebase/emergency_storage/rnd) "aCG" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 6},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) -"aCH" = (/obj/structure/railing{dir = 8},/obj/structure/railing{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"aCH" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/trash_pile,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aCI" = (/obj/structure/railing{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "aCJ" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/structure/cable{icon_state = "4-8"},/obj/structure/cable{icon_state = "1-4"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "aCK" = (/obj/machinery/door/airlock/maintenance/common,/obj/machinery/door/firedoor/glass,/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"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) @@ -1508,7 +1508,7 @@ "aCZ" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/mauve/border{dir = 4},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 30; pixel_y = 0},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/turf/simulated/floor/tiled,/area/rnd/hallway) "aDa" = (/obj/effect/decal/cleanable/blood,/obj/item/clothing/shoes/athletic{desc = "Assault"},/obj/item/clothing/under/pants{desc = "Overdose"},/obj/item/weapon/material/twohanded/baseballbat{desc = "Decadence"; health = 1989},/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/atmos) "aDb" = (/obj/effect/decal/cleanable/blood,/obj/item/device/tape{desc = "No Talk"},/obj/item/clothing/suit/varsity/brown{desc = "Showdown"},/obj/item/clothing/head/richard,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/atmos) -"aDc" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/junk,/obj/random/junk,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"aDc" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aDd" = (/obj/structure/railing,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "aDe" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/random/junk,/obj/random/junk,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aDf" = (/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) @@ -1542,7 +1542,7 @@ "aDH" = (/obj/structure/railing{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/pipe/zpipe/up/scrubbers,/obj/machinery/atmospherics/pipe/zpipe/up/supply,/obj/structure/cable/cyan{d1 = 16; d2 = 0; icon_state = "16-0"},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "aDI" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "aDJ" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) -"aDK" = (/obj/structure/catwalk,/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) +"aDK" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/junk,/obj/random/junk,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aDL" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/tiled,/area/tether/surfacebase/tram) "aDM" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -28},/obj/structure/cable,/turf/simulated/floor/tiled,/area/tether/surfacebase/tram) "aDN" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/tether/surfacebase/tram) @@ -1604,7 +1604,7 @@ "aER" = (/obj/structure/railing{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techmaint,/area/maintenance/lower/bar) "aES" = (/obj/machinery/light/small{dir = 8; pixel_x = 0},/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "aET" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/random/junk,/obj/random/junk,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) -"aEU" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"aEU" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining_eva) "aEV" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/cigarettes,/obj/random/junk,/obj/random/junk,/obj/random/tool,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aEW" = (/obj/effect/floor_decal/rust,/obj/effect/step_trigger/teleporter/to_solars,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/tether/surfacebase/outside/outside1) "aEX" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/tether/surfacebase/outside/outside1) @@ -1727,13 +1727,13 @@ "aHk" = (/obj/structure/ladder/up,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty,/area/maintenance/lower/research) "aHl" = (/obj/structure/railing{dir = 8},/obj/structure/railing,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/junk,/obj/random/junk,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aHm" = (/turf/simulated/mineral,/area/rnd/external) -"aHn" = (/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/turf/simulated/floor/outdoors/grass/sif/virgo3b,/area/rnd/external) -"aHo" = (/obj/machinery/camera/network/research{dir = 2},/obj/machinery/floodlight,/turf/simulated/floor/outdoors/grass/sif/virgo3b,/area/rnd/external) -"aHp" = (/obj/structure/railing,/obj/structure/railing{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"aHn" = (/turf/simulated/wall,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) +"aHo" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) +"aHp" = (/obj/structure/railing,/obj/structure/railing{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aHq" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/industrial/warning,/obj/random/junk,/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) "aHr" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/processing) "aHs" = (/obj/machinery/door/airlock/maintenance/common{name = "Mining Maintenance Access"},/obj/machinery/door/firedoor/glass,/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/tether/surfacebase/north_stairs_one) -"aHt" = (/obj/structure/catwalk,/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/junk,/obj/random/junk,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"aHt" = (/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -30},/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/button/remote/blast_door{id = "freezer"; name = "Freezer shutters"; pixel_x = -24; pixel_y = -24},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) "aHu" = (/obj/effect/floor_decal/techfloor{dir = 9},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing) "aHv" = (/obj/effect/floor_decal/techfloor{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing) "aHw" = (/obj/effect/floor_decal/techfloor{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/extinguisher_cabinet{pixel_y = 30},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing) @@ -1881,7 +1881,7 @@ "aKi" = (/obj/structure/cable{icon_state = "2-8"},/obj/structure/catwalk,/obj/machinery/alarm{pixel_y = 22},/obj/structure/cable{icon_state = "2-4"},/turf/simulated/floor,/area/maintenance/lower/north) "aKj" = (/obj/structure/catwalk,/obj/structure/extinguisher_cabinet{pixel_y = 30},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) "aKk" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/random/cigarettes,/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) -"aKl" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small{brightness_color = "#DA0205"; brightness_power = 1; brightness_range = 5},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) +"aKl" = (/obj/structure/railing{dir = 4},/obj/structure/railing,/obj/random/trash_pile,/turf/simulated/floor/tiled/techmaint,/area/maintenance/lower/bar) "aKm" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -28},/obj/structure/cable{icon_state = "0-8"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) "aKn" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/camera/network/medbay{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) "aKo" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) @@ -1905,7 +1905,7 @@ "aKG" = (/turf/simulated/open,/area/maintenance/lower/mining) "aKH" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/mining) "aKI" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/plating,/area/maintenance/lower/mining) -"aKJ" = (/obj/structure/catwalk,/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/random/junk,/obj/random/junk,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/lower/trash_pit) +"aKJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "freezer"; name = "Freezer Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/crew_quarters/freezer) "aKK" = (/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor/tiled/dark,/area/gateway) "aKL" = (/turf/simulated/floor/tiled/dark,/area/gateway) "aKM" = (/obj/structure/closet/firecloset,/obj/machinery/camera/network/command,/turf/simulated/floor/tiled/dark,/area/gateway) @@ -1926,7 +1926,7 @@ "aLb" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) "aLc" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) "aLd" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable{icon_state = "1-2"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) -"aLe" = (/obj/structure/railing{dir = 4},/obj/random/junk,/turf/simulated/floor/tiled/techmaint,/area/maintenance/lower/bar) +"aLe" = (/obj/structure/catwalk,/obj/structure/closet,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/random/maintenance/research,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/tool,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aLf" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/lower/mining) "aLg" = (/turf/simulated/floor/plating,/area/maintenance/lower/mining) "aLh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/gateway) @@ -1994,7 +1994,7 @@ "aMr" = (/turf/simulated/wall,/area/maintenance/lower/bar) "aMs" = (/obj/structure/table/rack,/obj/random/cigarettes,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/vacant/vacant_site) "aMt" = (/obj/structure/railing,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) -"aMu" = (/obj/structure/catwalk,/obj/structure/closet,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/random_multi/single_item/teleport,/obj/random/maintenance/research,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/tool,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) +"aMu" = (/obj/structure/catwalk,/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/drinkbottle,/turf/simulated/floor/plating,/area/maintenance/lower/vacant_site) "aMv" = (/obj/structure/railing,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) "aMw" = (/obj/effect/floor_decal/rust,/obj/structure/table/rack,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/vacant/vacant_site) "aMx" = (/obj/structure/railing,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) @@ -2025,7 +2025,7 @@ "aMW" = (/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aMX" = (/obj/structure/catwalk,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aMY" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable{icon_state = "16-0"},/obj/structure/cable,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/machinery/atmospherics/pipe/zpipe/up/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/zpipe/up/supply{dir = 1},/turf/simulated/floor/plating,/area/gateway) -"aMZ" = (/obj/structure/catwalk,/obj/structure/closet,/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/drinkbottle,/turf/simulated/floor/plating,/area/maintenance/lower/vacant_site) +"aMZ" = (/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/vacant/vacant_shop) "aNa" = (/obj/structure/catwalk,/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) "aNb" = (/obj/structure/catwalk,/obj/machinery/light/small,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) "aNc" = (/obj/structure/catwalk,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) @@ -2036,7 +2036,7 @@ "aNh" = (/obj/structure/catwalk,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) "aNi" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) "aNj" = (/obj/structure/railing{dir = 1},/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/mining) -"aNk" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) +"aNk" = (/obj/effect/floor_decal/corner_techfloor_grid,/obj/machinery/alarm{pixel_y = 22},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aNl" = (/obj/effect/floor_decal/rust,/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aNm" = (/obj/structure/catwalk,/obj/effect/floor_decal/rust,/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aNn" = (/obj/structure/catwalk,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) @@ -2085,7 +2085,7 @@ "aOe" = (/obj/structure/disposalpipe/junction{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals6{dir = 4},/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_two) "aOf" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_two) "aOg" = (/obj/effect/floor_decal/borderfloor{dir = 5},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_two) -"aOh" = (/obj/item/weapon/reagent_containers/food/drinks/bottle/orangejuice,/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/vacant/vacant_shop) +"aOh" = (/obj/structure/railing{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/vacant_site) "aOi" = (/obj/structure/catwalk,/turf/simulated/open,/area/maintenance/lower/bar) "aOj" = (/obj/structure/catwalk,/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/open,/area/maintenance/lower/bar) "aOk" = (/obj/structure/catwalk,/obj/structure/disposalpipe/segment,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) @@ -2109,7 +2109,7 @@ "aOC" = (/obj/machinery/light/small{dir = 8},/obj/effect/floor_decal/techfloor{dir = 9},/obj/structure/cable{icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled/techfloor/grid,/area/maintenance/lower/north) "aOD" = (/obj/structure/railing{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/vacant_site) "aOE" = (/obj/effect/floor_decal/techfloor{dir = 1},/obj/effect/floor_decal/techfloor,/obj/structure/cable{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) -"aOF" = (/obj/structure/railing{dir = 1},/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/lower/vacant_site) +"aOF" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 4},/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/vacant_site) "aOG" = (/obj/effect/floor_decal/techfloor{dir = 6},/obj/structure/cable{icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled/techfloor/grid,/area/maintenance/lower/north) "aOH" = (/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_two) "aOI" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_two) @@ -2129,7 +2129,7 @@ "aOW" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 4},/turf/simulated/open,/area/tether/surfacebase/atrium_two) "aOX" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/orange/border{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_two) "aOY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_two) -"aOZ" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 4},/obj/structure/closet/crate,/obj/random/action_figure,/obj/random/cigarettes,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/lower/vacant_site) +"aOZ" = (/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aPa" = (/obj/effect/floor_decal/techfloor/orange,/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aPb" = (/obj/structure/catwalk,/obj/effect/floor_decal/techfloor/orange,/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aPc" = (/obj/structure/catwalk,/obj/effect/floor_decal/techfloor/orange,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) @@ -2147,8 +2147,8 @@ "aPo" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/effect/floor_decal/techfloor/hole/right{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/north) "aPp" = (/obj/machinery/light/small{dir = 8; pixel_x = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_two) "aPq" = (/obj/machinery/light/small{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_two) -"aPr" = (/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) -"aPs" = (/obj/structure/railing{dir = 4},/obj/structure/railing,/turf/simulated/floor/tiled/techmaint,/area/maintenance/lower/bar) +"aPr" = (/obj/effect/floor_decal/techfloor{dir = 10},/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) +"aPs" = (/obj/structure/railing{dir = 4},/obj/structure/railing{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) "aPt" = (/obj/item/clothing/gloves/boxing/blue,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/lower/north) "aPu" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/lower/north) "aPv" = (/obj/random/obstruction,/turf/simulated/floor,/area/maintenance/lower/north) @@ -2209,7 +2209,7 @@ "aQy" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aQz" = (/obj/structure/railing{dir = 8},/obj/effect/floor_decal/techfloor{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aQA" = (/obj/effect/floor_decal/techfloor{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) -"aQB" = (/obj/effect/floor_decal/corner_techfloor_grid,/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) +"aQB" = (/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aQC" = (/obj/structure/ladder{layer = 3.3; pixel_y = 16},/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aQD" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aQE" = (/obj/structure/sign/warning/caution{name = "\improper CAUTION - DANGEROUS EQUIPMENT AND DROPS"},/turf/simulated/wall,/area/tether/surfacebase/north_staires_two) @@ -2235,7 +2235,7 @@ "aQY" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aQZ" = (/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,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aRa" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{icon_state = "4-8"},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) -"aRb" = (/obj/effect/floor_decal/techfloor{dir = 10},/obj/structure/closet,/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) +"aRb" = (/obj/effect/floor_decal/techfloor{dir = 9},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor/grid,/area/maintenance/lower/bar) "aRc" = (/obj/structure/cable{icon_state = "4-8"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aRd" = (/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aRe" = (/obj/structure/cable{icon_state = "16-0"},/obj/structure/cable{icon_state = "0-8"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) @@ -2271,7 +2271,7 @@ "aRI" = (/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aRJ" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aRK" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) -"aRL" = (/obj/structure/closet/crate,/obj/random_multi/single_item/teleport,/obj/random/cigarettes,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/obj/random/maintenance/research,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) +"aRL" = (/obj/structure/railing{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) "aRM" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aRN" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aRO" = (/obj/machinery/door/airlock/maintenance/common,/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/tether/surfacebase/atrium_two) @@ -2355,7 +2355,7 @@ "aTo" = (/obj/structure/railing{dir = 4},/obj/effect/floor_decal/rust,/obj/effect/floor_decal/techfloor{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "aTp" = (/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "aTq" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) -"aTr" = (/obj/effect/floor_decal/techfloor{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) +"aTr" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) "aTs" = (/turf/simulated/wall,/area/maintenance/research) "aTt" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall,/area/maintenance/research) "aTu" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) @@ -2364,7 +2364,7 @@ "aTx" = (/turf/simulated/shuttle/wall/voidcraft/green{hard_corner = 1},/area/tether/surfacebase/atrium_two) "aTy" = (/obj/machinery/door/airlock/maintenance/common{name = "Bar Maintenance Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/vacant/vacant_shop) "aTz" = (/obj/effect/floor_decal/techfloor{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) -"aTA" = (/obj/effect/floor_decal/techfloor{dir = 9},/obj/structure/closet,/obj/random_multi/single_item/netgun,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor/grid,/area/maintenance/lower/bar) +"aTA" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aTB" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aTC" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/structure/cable{icon_state = "1-4"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aTD" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 10},/obj/structure/cable{icon_state = "2-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) @@ -2411,7 +2411,7 @@ "aUs" = (/obj/structure/railing{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 6},/obj/effect/floor_decal/rust,/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/maintenance/cargo,/obj/random/maintenance/research,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) "aUt" = (/obj/structure/railing{dir = 8},/obj/effect/floor_decal/techfloor{dir = 4},/obj/structure/railing,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "aUu" = (/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) -"aUv" = (/obj/structure/closet,/obj/random_multi/single_item/netgun,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/obj/random/maintenance/research,/obj/random/tech_supply,/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) +"aUv" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/tool,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "aUw" = (/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aUx" = (/obj/structure/railing,/obj/effect/floor_decal/techfloor/hole/right{dir = 4},/obj/effect/floor_decal/techfloor/hole{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/junk,/turf/simulated/floor/tiled/techfloor/grid,/area/maintenance/lower/bar) "aUy" = (/obj/machinery/power/sensor{name = "Powernet Sensor - Research Subgrid"; name_tag = "Research Subgrid"},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/cable/green,/obj/structure/cable/green{icon_state = "0-4"},/turf/simulated/floor,/area/maintenance/research) @@ -2441,7 +2441,7 @@ "aUW" = (/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/rnd) "aUX" = (/turf/simulated/wall,/area/rnd/lockers) "aUY" = (/turf/simulated/wall,/area/rnd/research) -"aUZ" = (/obj/structure/railing{dir = 1},/obj/effect/decal/cleanable/dirt,/obj/structure/table/rack,/obj/random/medical/lite,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/research,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) +"aUZ" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "aVa" = (/turf/simulated/wall/r_wall,/area/rnd/research) "aVb" = (/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/structure/cable{icon_state = "1-2"},/obj/structure/disposalpipe/segment,/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aVc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_two) @@ -2492,7 +2492,7 @@ "aVV" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 5},/obj/structure/cable{icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aVW" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/structure/cable{icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "aVX" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 10},/obj/structure/cable{icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/lower/rnd) -"aVY" = (/obj/structure/railing{dir = 1},/obj/structure/table/rack,/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/research,/obj/random/tech_supply,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) +"aVY" = (/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/rnd) "aVZ" = (/obj/effect/floor_decal/techfloor{dir = 4},/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aWa" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/outline,/obj/machinery/portable_atmospherics/powered/scrubber,/obj/structure/extinguisher_cabinet{pixel_y = 30},/turf/simulated/floor/tiled/techfloor,/area/engineering/lower/lobby) "aWb" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 1},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled,/area/engineering/lower/lobby) @@ -2582,14 +2582,14 @@ "aXH" = (/obj/structure/table/glass,/obj/machinery/computer/atmoscontrol/laptop,/turf/simulated/floor/carpet,/area/engineering/lower/breakroom) "aXI" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/carpet,/area/engineering/lower/breakroom) "aXJ" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/turf/simulated/floor/tiled,/area/engineering/lower/breakroom) -"aXK" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) +"aXK" = (/obj/effect/floor_decal/techfloor{dir = 4},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aXL" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/purple/border{dir = 8},/turf/simulated/floor/tiled,/area/janitor) "aXM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/janitor) "aXN" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/janitor) "aXO" = (/obj/structure/janitorialcart,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/purple/border{dir = 4},/turf/simulated/floor/tiled,/area/janitor) -"aXP" = (/obj/effect/floor_decal/corner_techfloor_grid{dir = 9},/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) +"aXP" = (/obj/effect/floor_decal/techfloor{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "aXQ" = (/obj/structure/catwalk,/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) -"aXR" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random_multi/single_item/netgun,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) +"aXR" = (/obj/structure/railing{dir = 8},/obj/effect/floor_decal/techfloor{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "aXS" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/machinery/computer/rdconsole/core{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/rnd/workshop) "aXT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/techfloor,/area/rnd/workshop) "aXU" = (/obj/effect/floor_decal/techfloor/corner{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/rnd/workshop) @@ -2660,7 +2660,7 @@ "aZh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/engineering/lower/breakroom) "aZi" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/item/weapon/storage/box/glasses/pint,/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 3; name = "Engineering RC"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/lower/breakroom) "aZj" = (/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access = list(26)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor,/area/janitor) -"aZk" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random_multi/single_item/netgun,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/tool,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) +"aZk" = (/obj/structure/railing{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) "aZl" = (/obj/structure/railing{dir = 4},/obj/effect/floor_decal/corner_techfloor_grid{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "aZm" = (/obj/structure/railing{dir = 4},/obj/effect/floor_decal/corner_techfloor_grid/full{dir = 8},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "aZn" = (/obj/structure/catwalk,/obj/effect/floor_decal/corner_techfloor_grid{dir = 5},/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) @@ -2716,7 +2716,7 @@ "bal" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/mauve/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/mauve/bordercorner2{dir = 6},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light_switch{pixel_x = 25},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/rnd/lockers) "bam" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/mauve/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/mauve/bordercorner2{dir = 8},/obj/machinery/camera/network/research{dir = 4},/obj/item/device/radio/intercom{dir = 4; pixel_x = -24},/turf/simulated/floor/tiled,/area/rnd/research) "ban" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/steel_grid,/area/rnd/research) -"bao" = (/obj/machinery/computer/rdconsole/core{dir = 8},/turf/simulated/floor/tiled/dark,/area/rnd/research) +"bao" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{pixel_y = 22; target_temperature = 293.15},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/solars) "bap" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/rnd/research) "baq" = (/obj/machinery/r_n_d/protolathe,/turf/simulated/floor/tiled/dark,/area/rnd/research) "bar" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/steel_grid,/area/rnd/research) @@ -2740,7 +2740,7 @@ "baJ" = (/obj/structure/cable{icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "baK" = (/obj/effect/floor_decal/corner_techfloor_grid/full{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "baL" = (/obj/effect/floor_decal/corner_techfloor_grid{dir = 5},/obj/structure/cable{icon_state = "2-4"},/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) -"baM" = (/obj/effect/floor_decal/corner_techfloor_grid{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) +"baM" = (/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) "baN" = (/obj/effect/floor_decal/corner_techfloor_grid{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/mob/living/simple_animal/mouse,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "baO" = (/obj/structure/railing{dir = 4},/obj/effect/floor_decal/corner_techfloor_grid{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "baP" = (/obj/structure/catwalk,/obj/structure/cable{icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) @@ -2774,7 +2774,7 @@ "bbr" = (/obj/machinery/space_heater,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/techfloor,/area/tether/surfacebase/emergency_storage/atrium) "bbs" = (/obj/effect/floor_decal/corner_techfloor_grid{dir = 9},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bbt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) -"bbu" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) +"bbu" = (/turf/simulated/floor/plating,/area/tether/surfacebase/atrium_two) "bbv" = (/obj/structure/railing{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bbw" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bbx" = (/obj/structure/catwalk,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) @@ -2831,7 +2831,7 @@ "bcw" = (/obj/effect/floor_decal/techfloor{dir = 10},/obj/structure/table/steel,/obj/item/stack/material/glass{amount = 50; pixel_x = 3; pixel_y = 3},/turf/simulated/floor/tiled/techfloor,/area/rnd/workshop) "bcx" = (/obj/effect/floor_decal/techfloor,/obj/structure/table/steel,/obj/machinery/camera/network/research{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/rnd/workshop) "bcy" = (/obj/effect/floor_decal/techfloor{dir = 6},/obj/structure/table/steel,/obj/item/weapon/storage/bag/circuits/basic,/turf/simulated/floor/tiled/techfloor,/area/rnd/workshop) -"bcz" = (/obj/structure/closet/crate,/obj/random/maintenance/research,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/rnd) +"bcz" = (/obj/effect/decal/remains/xeno,/turf/simulated/floor/plating,/area/tether/surfacebase/atrium_two) "bcA" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/mauve/border{dir = 10},/obj/machinery/status_display{pixel_x = -32},/turf/simulated/floor/tiled,/area/rnd/research) "bcB" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/mauve/border,/obj/machinery/computer/guestpass{dir = 1; icon_state = "guest"; pixel_y = -28; tag = "icon-guest (NORTH)"},/turf/simulated/floor/tiled,/area/rnd/research) "bcC" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/mauve/border,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/mauve/bordercorner2{dir = 9},/turf/simulated/floor/tiled,/area/rnd/research) @@ -2850,7 +2850,7 @@ "bcP" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/yellow/border,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/yellow/bordercorner2{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 8},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) "bcQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) "bcR" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) -"bcS" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/sortjunction{dir = 4; icon_state = "pipe-j1s"; name = "Drone Fabrication"; sortType = "Drone Fabrication"},/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) +"bcS" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) "bcT" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 10; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) "bcU" = (/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) "bcV" = (/obj/effect/floor_decal/steeldecal/steel_decals4,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) @@ -2863,7 +2863,7 @@ "bdc" = (/obj/machinery/light/small,/turf/simulated/floor/tiled/techfloor,/area/tether/surfacebase/emergency_storage/atrium) "bdd" = (/obj/structure/table/standard,/obj/item/device/t_scanner,/obj/item/weapon/storage/briefcase/inflatable,/turf/simulated/floor/tiled/techfloor,/area/tether/surfacebase/emergency_storage/atrium) "bde" = (/obj/effect/decal/cleanable/dirt,/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) -"bdf" = (/obj/effect/floor_decal/techfloor{dir = 4},/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/maintenance/cargo,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) +"bdf" = (/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bdg" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 6},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bdh" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bdi" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 9},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) @@ -2874,17 +2874,17 @@ "bdn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/command{name = "Server Room"; req_access = list(30)},/turf/simulated/floor/tiled/steel_grid,/area/server) "bdo" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/yellow/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 8},/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"},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) "bdp" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/yellow/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 1},/obj/machinery/light_switch{pixel_x = 25},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) -"bdq" = (/turf/simulated/wall,/area/engineering/drone_fabrication) +"bdq" = (/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) "bdr" = (/obj/effect/floor_decal/corner/yellow{dir = 6},/obj/effect/floor_decal/corner/yellow{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/machinery/vending/engivend,/turf/simulated/floor/tiled/monotile,/area/engineering/atmos/hallway) "bds" = (/obj/effect/floor_decal/corner/yellow{dir = 6},/obj/effect/floor_decal/corner/yellow{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/machinery/vending/tool,/turf/simulated/floor/tiled/monotile,/area/engineering/atmos/hallway) "bdt" = (/turf/simulated/wall,/area/engineering/lower/atmos_lockers) "bdu" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) "bdv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/engineering/lower/atmos_lockers) -"bdw" = (/obj/machinery/computer/atmos_alert{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"bdw" = (/obj/machinery/computer/arcade,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bdx" = (/obj/structure/bed/chair/office/light,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) -"bdy" = (/obj/machinery/computer/security/engineering{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) -"bdz" = (/obj/machinery/computer/rcon{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) -"bdA" = (/obj/machinery/computer/power_monitor{dir = 8},/obj/item/device/radio/intercom{dir = 8; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"bdy" = (/obj/machinery/computer/rdconsole/core{dir = 4},/turf/simulated/floor/tiled/dark,/area/rnd/research) +"bdz" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bdA" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/obj/structure/table/bench/wooden,/turf/simulated/floor/wood,/area/crew_quarters/bar) "bdB" = (/obj/effect/floor_decal/corner_techfloor_grid{dir = 9},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bdC" = (/obj/structure/railing{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bdD" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) @@ -2912,7 +2912,7 @@ "bdZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) "bea" = (/obj/structure/table/glass,/obj/item/weapon/wrench,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "beb" = (/obj/machinery/computer/atmoscontrol{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) -"bec" = (/obj/structure/table/glass,/obj/machinery/camera/network/engineering{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"bec" = (/obj/item/device/radio/intercom{dir = 8; pixel_x = 24},/obj/structure/table/glass,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "bed" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "bee" = (/obj/machinery/computer/station_alert{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "bef" = (/obj/structure/table/glass,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -2987,7 +2987,7 @@ "bfw" = (/obj/machinery/space_heater,/turf/simulated/floor,/area/engineering/atmos/storage) "bfx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/cleanable/dirt,/obj/machinery/door/airlock/maintenance/rnd{name = "Science Maintenance"},/obj/machinery/door/firedoor/glass,/obj/structure/catwalk,/turf/simulated/floor/plating,/area/maintenance/lower/solars) "bfy" = (/obj/effect/floor_decal/techfloor{dir = 10},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) -"bfz" = (/obj/structure/railing{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/closet,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/xenoflora) +"bfz" = (/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bfA" = (/obj/structure/railing{dir = 1},/obj/effect/floor_decal/techfloor,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "bfB" = (/obj/machinery/light_switch{pixel_x = -25},/obj/effect/floor_decal/techfloor{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/server) "bfC" = (/obj/effect/floor_decal/techfloor,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -28},/obj/structure/cable/green,/turf/simulated/floor/tiled/techfloor,/area/server) @@ -3131,7 +3131,7 @@ "bik" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 9; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/obj/structure/extinguisher_cabinet{dir = 2; icon_state = "extinguisher_closed"; pixel_x = 30; tag = "icon-extinguisher_closed (WEST)"},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) "bil" = (/obj/structure/catwalk,/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bim" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/effect/floor_decal/techfloor{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) -"bin" = (/obj/structure/catwalk,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) +"bin" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random/action_figure,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bio" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{dir = 8},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) "bip" = (/obj/machinery/atmospherics/pipe/manifold4w/visible/red,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) "biq" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{dir = 4; initialize_directions = 11},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) @@ -3145,7 +3145,7 @@ "biy" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance/engi{name = "Drone Bay"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "biz" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/steel_dirty,/area/engineering/atmos) "biA" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) -"biB" = (/obj/structure/railing{dir = 4},/obj/effect/floor_decal/techfloor{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 1},/obj/structure/table/rack,/obj/random/maintenance/research,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) +"biB" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "biC" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) "biD" = (/obj/effect/floor_decal/techfloor{dir = 1},/obj/machinery/atmospherics/binary/pump{dir = 4; name = "Scrubbers to Waste"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) "biE" = (/obj/machinery/atmospherics/pipe/simple/visible/red{dir = 5},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) @@ -3158,7 +3158,7 @@ "biL" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 4},/turf/simulated/open,/area/engineering/atmos) "biM" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) "biN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) -"biO" = (/obj/machinery/atmospherics/omni/filter{tag_east = 4; tag_north = 2; tag_south = 1},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) +"biO" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) "biP" = (/obj/machinery/atmospherics/valve/digital/open{dir = 4; icon_state = "map_valve1"; tag = "icon-map_valve1 (WEST)"},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) "biQ" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) "biR" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 1},/obj/machinery/meter,/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) @@ -3291,12 +3291,12 @@ "blo" = (/obj/structure/railing{dir = 8},/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "blp" = (/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/mouse,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "blq" = (/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) -"blr" = (/obj/structure/railing{dir = 4},/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) +"blr" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bls" = (/obj/structure/catwalk,/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "blt" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 9},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "blu" = (/obj/structure/table/standard,/obj/effect/floor_decal/techfloor{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) -"blv" = (/obj/structure/table/standard,/obj/effect/floor_decal/techfloor,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) -"blw" = (/obj/structure/table/standard,/obj/effect/floor_decal/techfloor,/obj/machinery/camera/network/engineering{dir = 1},/obj/item/clothing/glasses/welding,/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) +"blv" = (/obj/machinery/atmospherics/omni/filter{tag_east = 7; tag_north = 2; tag_south = 1},/turf/simulated/floor/tiled/techmaint,/area/engineering/atmos) +"blw" = (/obj/structure/table/standard,/obj/effect/floor_decal/techfloor,/obj/item/clothing/glasses/welding,/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) "blx" = (/obj/effect/floor_decal/techfloor,/obj/machinery/space_heater,/obj/machinery/light,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) "bly" = (/obj/effect/floor_decal/techfloor,/obj/machinery/suit_cycler/engineering{name = "Atmospherics suit cycler"},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) "blz" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/window/northleft{name = "Atmospherics Hardsuits"; req_access = list(24)},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/void/atmos/taur,/obj/item/clothing/head/helmet/space/void/atmos,/obj/item/clothing/suit/space/void/atmos,/obj/item/clothing/head/helmet/space/void/atmos,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) @@ -3327,35 +3327,35 @@ "blY" = (/obj/machinery/power/sensor{name = "Powernet Sensor - Telecomms Subgrid"; name_tag = "Telecomms Subgrid"},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/cable/green{icon_state = "0-8"},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/maintenance/substation/tcomms) "blZ" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/substation/tcomms) "bma" = (/turf/simulated/wall/r_wall,/area/maintenance/substation/tcomms) -"bmb" = (/turf/simulated/wall/r_wall,/area/tcommsat/entrance) +"bmb" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) "bmc" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) "bmd" = (/obj/structure/filingcabinet,/obj/machinery/status_display{pixel_y = 30},/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) "bme" = (/obj/structure/table/standard,/obj/item/weapon/folder/yellow,/obj/item/weapon/folder/yellow,/obj/machinery/light{dir = 1},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) "bmf" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/obj/item/weapon/pen/blue{pixel_x = -3; pixel_y = 2},/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) "bmg" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) "bmh" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) -"bmi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/tcommsat/entrance) -"bmj" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) -"bmk" = (/obj/machinery/porta_turret{dir = 6},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/tcommsat/entrance) -"bml" = (/obj/machinery/camera/network/telecom,/turf/simulated/floor/tiled/dark,/area/tcommsat/entrance) -"bmm" = (/obj/machinery/turretid/lethal{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Satellite"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms lethal turret control"; pixel_x = 29; pixel_y = 0; req_access = list(61)},/obj/structure/extinguisher_cabinet{pixel_y = 30},/obj/effect/decal/cleanable/cobweb2,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/dark,/area/tcommsat/entrance) +"bmi" = (/obj/effect/floor_decal/techfloor,/obj/machinery/camera/network/engineering{dir = 1},/obj/structure/dispenser{phorontanks = 0},/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos) +"bmj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) +"bmk" = (/obj/machinery/computer/atmos_alert{tag = "icon-computer (NORTH)"; icon_state = "computer"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) +"bml" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) +"bmm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -30},/obj/structure/cable{icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) "bmn" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/tiled,/area/tcommsat/computer) "bmo" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) "bmp" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) "bmq" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/turf/simulated/floor/tiled,/area/tcommsat/computer) "bmr" = (/obj/machinery/computer/telecomms/monitor{dir = 8; network = "tcommsat"},/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) "bms" = (/obj/machinery/door/airlock/maintenance/rnd{name = "Elavator Maintenance Access"},/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/rnd/breakroom) -"bmt" = (/obj/structure/sign/department/telecoms,/turf/simulated/wall/r_wall,/area/tcommsat/entrance) -"bmu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/decal/cleanable/cobweb,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmv" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmw" = (/obj/machinery/turretid/stun{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Foyer"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms Foyer turret control"; pixel_x = 29; pixel_y = 0; req_access = list(61)},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmx" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmy" = (/obj/machinery/camera/network/telecom,/obj/structure/sign/electricshock{pixel_y = 32},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmA" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmB" = (/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/grille,/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/tcommsat/entrance) -"bmC" = (/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmD" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"bmt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/tiled/steel_grid,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) +"bmu" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) +"bmv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) +"bmw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "1-8"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) +"bmx" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) +"bmy" = (/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom{name = "\improper Recreation Area Showers"}) +"bmz" = (/obj/effect/floor_decal/corner_techfloor_grid{dir = 5},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/table/rack,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) +"bmA" = (/turf/simulated/wall/r_wall,/area/engineering/drone_fabrication) +"bmB" = (/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/rnd/external) +"bmC" = (/obj/machinery/camera/network/research{dir = 2},/obj/machinery/floodlight,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/rnd/external) +"bmD" = (/turf/simulated/wall/r_wall,/area/tcomsat{name = "\improper Telecomms Lobby"}) "bmE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/camera/network/telecom{dir = 4},/obj/item/device/radio/intercom{dir = 4; pixel_x = -24},/turf/simulated/floor/tiled,/area/tcommsat/computer) "bmF" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/tcommsat/computer) "bmG" = (/turf/simulated/floor/tiled,/area/tcommsat/computer) @@ -3364,18 +3364,18 @@ "bmJ" = (/obj/machinery/computer/telecomms/server{dir = 8; network = "tcommsat"},/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) "bmK" = (/obj/structure/catwalk,/obj/effect/floor_decal/techfloor/corner,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bmL" = (/obj/structure/catwalk,/obj/effect/floor_decal/techfloor{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) -"bmM" = (/obj/machinery/door/airlock/highsecurity{name = "Telecomms Access"; req_one_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmO" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmP" = (/obj/structure/cable/green{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/tcommsat/entrance) -"bmQ" = (/obj/structure/cable/green{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/machinery/door/airlock/hatch{name = "Telecomms Foyer"; req_one_access = list(61)},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmR" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmS" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmT" = (/obj/structure/cable/green{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/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/glass{req_access = list(61)},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bmX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"bmM" = (/turf/simulated/wall/r_wall,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) +"bmN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bmO" = (/obj/machinery/porta_turret{dir = 6},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bmP" = (/obj/machinery/camera/network/telecom,/turf/simulated/floor/tiled/dark,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bmQ" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bmR" = (/obj/machinery/turretid/lethal{ailock = 1; check_synth = 1; control_area = "\improper Telecomms Central Compartment"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms lethal turret control"; pixel_x = 29; pixel_y = 0; req_access = list(61); req_one_access = list(12)},/obj/structure/extinguisher_cabinet{pixel_y = 30},/obj/effect/decal/cleanable/cobweb2,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/dark,/area/tcommsat/chamber) +"bmS" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) +"bmT" = (/obj/machinery/turretid/stun{ailock = 1; check_synth = 1; control_area = "\improper Telecoms Foyer"; desc = "A firewall prevents AIs from interacting with this device."; name = "Telecoms Foyer turret control"; pixel_x = 29; pixel_y = 0; req_access = list(61); req_one_access = list(12)},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bmU" = (/obj/structure/sign/department/telecoms,/turf/simulated/wall/r_wall,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) +"bmV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/effect/decal/cleanable/cobweb,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) +"bmW" = (/obj/machinery/camera/network/telecom,/obj/structure/sign/electricshock{pixel_y = 32},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bmX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) "bmY" = (/obj/machinery/door/airlock/hatch{name = "Telecoms Control Room"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/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},/turf/simulated/floor/tiled,/area/tcommsat/computer) "bmZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) "bna" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/computer) @@ -3385,15 +3385,15 @@ "bne" = (/turf/simulated/wall/r_wall,/area/tcommsat/chamber) "bnf" = (/obj/structure/railing{dir = 1},/obj/effect/floor_decal/techfloor{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bng" = (/obj/structure/railing{dir = 1},/obj/effect/floor_decal/techfloor{dir = 6},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) -"bnh" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/item/device/radio/intercom{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bni" = (/obj/machinery/camera/network/telecom{dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bnj" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bnk" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bnl" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bnm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/obj/structure/cable/green,/turf/simulated/floor/plating,/area/tcommsat/entrance) -"bnn" = (/obj/machinery/porta_turret{dir = 6},/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bno" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -28},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/tcommsat/entrance) -"bnp" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/tcommsat/entrance) +"bnh" = (/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bni" = (/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bnj" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bnk" = (/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/grille,/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bnl" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bnm" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) +"bnn" = (/obj/structure/cable/green{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/tcommsat/entrance{name = "\improper Telecomms Entrance"}) +"bno" = (/obj/machinery/door/airlock/highsecurity{name = "Telecomms Access"; req_one_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) +"bnp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) "bnq" = (/obj/machinery/light{dir = 8},/obj/structure/table/standard,/obj/item/device/multitool,/obj/structure/sign/electricshock{pixel_x = -32},/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) "bnr" = (/obj/machinery/atmospherics/unary/freezer{dir = 2; icon_state = "freezer_1"; set_temperature = 73; use_power = 1},/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) "bns" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/tcommsat/computer) @@ -3401,20 +3401,20 @@ "bnu" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1381; icon_state = "door_locked"; id_tag = "server_access_outer"; locked = 1; name = "Telecoms Server Access"; req_access = list(61)},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/tcommsat/chamber) "bnv" = (/obj/machinery/airlock_sensor{frequency = 1381; id_tag = "server_access_sensor"; pixel_x = 12; pixel_y = 25},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1381; id_tag = "server_access_pump"},/obj/machinery/embedded_controller/radio/airlock/advanced_airlock_controller{frequency = 1381; id_tag = "server_access_airlock"; name = "Server Access Airlock"; pixel_x = 0; pixel_y = 25; tag_airpump = "server_access_pump"; tag_chamber_sensor = "server_access_sensor"; tag_exterior_door = "server_access_outer"; tag_exterior_sensor = "server_access_ex_sensor"; tag_interior_door = "server_access_inner"; tag_interior_sensor = "server_access_in_sensor"; tag_secure = 1},/turf/simulated/floor/plating,/area/tcommsat/chamber) "bnw" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/tcommsat/chamber) -"bnx" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/porta_turret{dir = 6},/turf/simulated/floor/tiled/dark,/area/tcommsat/entrance) -"bny" = (/turf/simulated/floor/tiled/dark,/area/tcommsat/entrance) -"bnz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/tcommsat/entrance) -"bnA" = (/obj/machinery/porta_turret/stationary,/turf/simulated/floor/tiled/dark,/area/tcommsat/entrance) +"bnx" = (/obj/structure/cable/green{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/tcomsat{name = "\improper Telecomms Lobby"}) +"bny" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bnz" = (/obj/structure/cable/green{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/machinery/door/airlock/hatch{name = "Telecomms Foyer"; req_access = list(61); req_one_access = list(12)},/obj/machinery/door/firedoor,/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bnA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) "bnB" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/grille,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 6},/turf/simulated/floor/plating,/area/tcommsat/chamber) "bnC" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/grille,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/manifold/hidden/black,/turf/simulated/floor/plating,/area/tcommsat/chamber) "bnD" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/grille,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/chamber) "bnE" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/grille,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 4},/turf/simulated/floor/plating,/area/tcommsat/chamber) "bnF" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/grille,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/black{dir = 10},/turf/simulated/floor/plating,/area/tcommsat/chamber) -"bnG" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1381; icon_state = "door_locked"; id_tag = "server_access_inner"; locked = 1; name = "Telecoms Server Access"; req_access = list(61)},/turf/simulated/wall/r_wall,/area/tcommsat/chamber) +"bnG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) "bnH" = (/obj/effect/floor_decal/industrial/warning/dust{dir = 10},/obj/effect/floor_decal/industrial/warning/dust/corner{dir = 4},/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/engineering/atmos/intake) "bnI" = (/obj/effect/floor_decal/industrial/warning/dust,/obj/effect/floor_decal/industrial/warning/dust{dir = 1},/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/engineering/atmos/intake) -"bnJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/tcommsat/entrance) -"bnK" = (/obj/machinery/door/airlock/glass{name = "Telecomms Storage"; req_access = list(61); req_one_access = newlist()},/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,/turf/simulated/floor/tiled/dark,/area/tcommsat/entrance) +"bnJ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bnK" = (/obj/structure/cable/green{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/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) "bnL" = (/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "bnM" = (/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/power/apc/super/critical{dir = 1; name = "north bump"; pixel_y = 24},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "bnN" = (/obj/machinery/atmospherics/pipe/simple/hidden/black,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) @@ -3426,30 +3426,30 @@ "bnT" = (/obj/machinery/airlock_sensor/airlock_interior{frequency = 1381; id_tag = "server_access_in_sensor"; name = "interior sensor"; pixel_y = 25},/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "bnU" = (/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "bnV" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = 32},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"bnW" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) -"bnX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/molten_item,/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) -"bnY" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) -"bnZ" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) +"bnW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/glass{req_access = list(61)},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bnX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bnY" = (/obj/machinery/camera/network/telecom{dir = 1},/turf/simulated/floor/tiled,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) +"bnZ" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/tiled,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) "boa" = (/obj/machinery/atmospherics/pipe/simple/hidden/black,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "bob" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"boc" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/transmitter,/obj/item/weapon/stock_parts/subspace/transmitter,/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) -"bod" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) -"boe" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) -"bof" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/machinery/firealarm{dir = 4; pixel_x = 26},/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) +"boc" = (/obj/machinery/door/airlock/maintenance_hatch{frequency = 1381; icon_state = "door_locked"; id_tag = "server_access_inner"; locked = 1; name = "Telecoms Server Access"; req_access = list(61)},/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) +"bod" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) +"boe" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/item/device/radio/intercom{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/tcommsat/entrance{name = "\improper Telecomms Entrance"}) +"bof" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) "bog" = (/obj/machinery/telecomms/server/presets/supply,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "boh" = (/obj/machinery/telecomms/server/presets/service,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "boi" = (/obj/machinery/telecomms/server/presets/unused,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "boj" = (/obj/machinery/telecomms/server/presets/common,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "bok" = (/obj/machinery/telecomms/server/presets/engineering,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"bol" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) -"bom" = (/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) -"bon" = (/obj/structure/table/rack,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/receiver,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/broadcaster,/obj/item/weapon/circuitboard/telecomms/exonet_node,/obj/machinery/light/small,/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) +"bol" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bom" = (/obj/machinery/porta_turret{dir = 6},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bon" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -28},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) "boo" = (/obj/machinery/camera/network/telecom{dir = 4},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "bop" = (/obj/machinery/exonet_node{anchored = 1},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "boq" = (/obj/machinery/camera/network/telecom{dir = 8},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) -"bor" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) -"bos" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/machinery/camera/network/telecom{dir = 1},/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) -"bot" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/turf/simulated/floor/tiled/techmaint,/area/tcommsat/entrance) +"bor" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/obj/structure/cable/green,/turf/simulated/floor/plating,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bos" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bot" = (/turf/simulated/floor/tiled/dark,/area/tcomsat{name = "\improper Telecomms Lobby"}) "bou" = (/obj/structure/sign/nosmoking_2{pixel_x = -32; pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "bov" = (/obj/machinery/telecomms/processor/preset_two,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) "bow" = (/obj/machinery/telecomms/bus/preset_two,/turf/simulated/floor/tiled/dark{nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/chamber) @@ -3548,7 +3548,7 @@ "bql" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/tether/surfacebase/security/breakroom) "bqm" = (/turf/simulated/wall/r_wall,/area/vacant/vacant_site2) "bqn" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/maintenance/engi,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) -"bqo" = (/obj/structure/table/glass,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/triage) +"bqo" = (/obj/structure/table/glass,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/item/device/sleevemate,/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/triage) "bqp" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 1},/obj/structure/closet/hydrant{pixel_x = 32},/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/triage) "bqq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/tether/surfacebase/reading_room) "bqr" = (/obj/structure/table/glass,/obj/item/device/flashlight/lamp/green,/turf/simulated/floor/wood,/area/tether/surfacebase/reading_room) @@ -3580,9 +3580,9 @@ "bqR" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/carpet/blue,/area/tether/surfacebase/security/breakroom) "bqS" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/table/steel,/obj/random/tech_supply,/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) "bqT" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) -"bqU" = (/obj/random_multi/single_item/netgun,/turf/simulated/floor/plating,/area/tether/surfacebase/atrium_two) +"bqU" = (/obj/effect/floor_decal/corner_techfloor_grid{dir = 9},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/bar) "bqV" = (/obj/effect/floor_decal/techfloor/corner,/obj/effect/floor_decal/techfloor{dir = 1},/obj/effect/floor_decal/techfloor/hole/right{dir = 1},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) -"bqW" = (/obj/effect/decal/remains/xeno,/obj/random_multi/single_item/teleport,/turf/simulated/floor/plating,/area/tether/surfacebase/atrium_two) +"bqW" = (/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/locker_room) "bqX" = (/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{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/white,/area/tether/surfacebase/medical/triage) "bqY" = (/obj/structure/cable/green{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/white,/area/tether/surfacebase/medical/triage) "bqZ" = (/obj/structure/cable/green{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/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/triage) @@ -3706,8 +3706,8 @@ "btn" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/obj/machinery/light_switch{pixel_x = 25},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/tether/surfacebase/security/breakroom) "bto" = (/obj/effect/floor_decal/techfloor{dir = 8},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) "btp" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) -"btq" = (/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) -"btr" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) +"btq" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random/maintenance/research,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/junk,/turf/simulated/floor,/area/maintenance/lower/south) +"btr" = (/obj/structure/railing{dir = 4},/obj/effect/floor_decal/techfloor{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 1},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "bts" = (/turf/simulated/wall,/area/tether/surfacebase/medical/lobby) "btt" = (/obj/machinery/disposal,/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/lobby) "btu" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{pixel_y = 24; req_access = list()},/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/lobby) @@ -3856,7 +3856,7 @@ "bwh" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals6,/turf/simulated/floor/tiled,/area/tether/surfacebase/security/lobby) "bwi" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/red/bordercorner2,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/tether/surfacebase/security/lobby) "bwj" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary{scrub_id = "atrium"},/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_three) -"bwk" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) +"bwk" = (/obj/structure/railing{dir = 8},/obj/effect/floor_decal/techfloor{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "bwl" = (/obj/effect/floor_decal/techfloor/corner{dir = 8},/obj/effect/floor_decal/techfloor/corner,/obj/effect/floor_decal/techfloor{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/techfloor/grid,/area/vacant/vacant_site2) "bwm" = (/obj/structure/bed/chair{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/obj/machinery/computer/guestpass{dir = 4; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/lobby) "bwn" = (/obj/structure/bed/chair{dir = 1},/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/tether/surfacebase/medical/lobby) @@ -4205,7 +4205,7 @@ "bCS" = (/turf/simulated/wall,/area/crew_quarters/freezer) "bCT" = (/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) "bCU" = (/obj/structure/closet/crate/freezer,/obj/machinery/camera/network/civilian,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) -"bCV" = (/obj/structure/kitchenspike,/obj/machinery/alarm{pixel_y = 22; target_temperature = 273.15},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) +"bCV" = (/obj/machinery/computer/power_monitor{tag = "icon-computer (NORTH)"; icon_state = "computer"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "bCW" = (/obj/structure/kitchenspike,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) "bCX" = (/obj/structure/flora/ausbushes/grassybush,/turf/simulated/floor/grass,/area/hydroponics/cafegarden) "bCY" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/grass,/area/hydroponics/cafegarden) @@ -4237,11 +4237,11 @@ "bDy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/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/tether/surfacebase/atrium_three) "bDz" = (/obj/structure/cable{icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bDA" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) -"bDB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) +"bDB" = (/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/machinery/vending/nifsoft_shop,/turf/simulated/floor/tiled/monotile,/area/crew_quarters/locker/laundry_arrival) "bDC" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/lightgrey/border{dir = 5},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) -"bDD" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) -"bDE" = (/obj/machinery/light_switch{pixel_y = 25},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) -"bDF" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) +"bDD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bDE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/porta_turret{dir = 6},/turf/simulated/floor/tiled/dark,/area/tcomsat{name = "\improper Telecomms Lobby"}) +"bDF" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/tcomfoyer{name = "\improper Telecomms Storage"}) "bDG" = (/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bDH" = (/turf/simulated/floor/plating,/area/tether/surfacebase/atrium_three) "bDI" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) @@ -4263,15 +4263,15 @@ "bDY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "1-2"},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bDZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/junction,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bEa" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) -"bEb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -30},/obj/structure/cable{icon_state = "0-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) -"bEc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) -"bEd" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) +"bEb" = (/obj/machinery/door/airlock/glass{name = "Telecomms Storage"; req_access = list(61); req_one_access = newlist()},/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,/turf/simulated/floor/tiled/dark,/area/tcomfoyer{name = "\improper Telecomms Storage"}) +"bEc" = (/turf/simulated/wall/r_wall,/area/tcomfoyer{name = "\improper Telecomms Storage"}) +"bEd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/molten_item,/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) "bEe" = (/obj/structure/cable{icon_state = "32-4"},/obj/structure/lattice,/obj/machinery/light/small{dir = 8; pixel_x = 0},/obj/machinery/door/firedoor/glass,/turf/simulated/open,/area/tether/surfacebase/atrium_three) "bEf" = (/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/plating,/area/tether/surfacebase/atrium_three) "bEg" = (/obj/machinery/door/airlock/maintenance/engi,/obj/machinery/door/firedoor/glass,/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/plating,/area/tether/surfacebase/atrium_three) "bEh" = (/obj/structure/cable{icon_state = "4-8"},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bEi" = (/obj/structure/cable{icon_state = "4-8"},/obj/structure/cable{icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) -"bEj" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random_multi/single_item/teleport,/obj/random/action_figure,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) +"bEj" = (/obj/structure/railing,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "bEk" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bEl" = (/obj/structure/disposalpipe/segment,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bEm" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/industrial/danger{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) @@ -4279,8 +4279,8 @@ "bEo" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary{scrub_id = "atrium"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/techmaint,/area/tether/surfacebase/atrium_three) "bEp" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/vacant/vacant_shop) "bEq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/vacant/vacant_shop) -"bEr" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random_multi/single_item/netgun,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) -"bEs" = (/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -30},/obj/structure/cable/green{icon_state = "0-4"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) +"bEr" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) +"bEs" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/lightgrey/border,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 9},/obj/machinery/vending/cigarette,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "bEt" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) "bEu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) "bEv" = (/obj/machinery/gibber,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) @@ -4304,10 +4304,10 @@ "bEN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/disposalpipe/segment,/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bEO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bEP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{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/tether/surfacebase/atrium_three) -"bEQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock{name = "Unisex Showers"},/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/tiled/steel_grid,/area/crew_quarters/recreation_area_restroom) -"bER" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{icon_state = "1-8"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) -"bES" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) -"bET" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) +"bEQ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) +"bER" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/item/weapon/stock_parts/subspace/amplifier,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) +"bES" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/item/weapon/stock_parts/subspace/ansible,/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) +"bET" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) "bEU" = (/turf/simulated/wall/r_wall,/area/maintenance/lower/atmos) "bEV" = (/obj/structure/extinguisher_cabinet{dir = 4; icon_state = "extinguisher_closed"; pixel_x = -30; tag = "icon-extinguisher_closed (EAST)"},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bEW" = (/obj/structure/cable{icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) @@ -4315,7 +4315,7 @@ "bEY" = (/obj/machinery/camera/network/northern_star{dir = 9},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bEZ" = (/obj/structure/sign/directions/medical{dir = 1; icon_state = "direction_med"; pixel_y = 8; tag = "icon-direction_med (EAST)"},/obj/structure/sign/directions/science{dir = 2; icon_state = "direction_sci"; pixel_y = 3; tag = "icon-direction_sci (WEST)"},/obj/structure/sign/directions/security{dir = 1; icon_state = "direction_sec"; pixel_y = -4; tag = "icon-direction_sec (WEST)"},/obj/structure/sign/directions/engineering{dir = 1; icon_state = "direction_eng"; pixel_y = -10; tag = "icon-direction_eng (WEST)"},/turf/simulated/wall,/area/tether/surfacebase/atrium_three) "bFa" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/structure/cable{icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) -"bFb" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/structure/table/rack,/obj/random/maintenance/engineering,/obj/random/maintenance/research,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) +"bFb" = (/obj/structure/closet,/obj/item/clothing/mask/gas,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bFc" = (/obj/structure/closet/secure_closet/freezer/meat,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) "bFd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/icecream_vat,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) "bFe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) @@ -4332,12 +4332,11 @@ "bFp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/extinguisher_cabinet{pixel_x = 27},/turf/simulated/floor/tiled,/area/crew_quarters/pool) "bFq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bFr" = (/obj/structure/extinguisher_cabinet{pixel_x = 27},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) -"bFs" = (/obj/item/weapon/bikehorn/rubberducky,/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) -"bFt" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/tiled/white,/area/crew_quarters/recreation_area_restroom) +"bFs" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) +"bFt" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/transmitter,/obj/item/weapon/stock_parts/subspace/transmitter,/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) "bFu" = (/obj/machinery/camera/network/northern_star{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bFv" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bFw" = (/obj/structure/railing{dir = 8},/obj/effect/floor_decal/techfloor{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/structure/table/rack,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/drinkbottle,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) -"bFx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/crew_quarters/freezer) "bFy" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/freezer{name = "Kitchen cold room"; req_access = list(28)},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/freezer) "bFz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "bFA" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass{name = "Garden"; req_access = list(28)},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) @@ -4695,7 +4694,7 @@ "bMo" = (/obj/machinery/alarm{pixel_y = 22},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bMp" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bMq" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lime/border{dir = 8},/turf/simulated/floor/tiled,/area/hydroponics) -"bMr" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/cargo,/obj/random/tool,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/locker_room) +"bMr" = (/obj/structure/railing{dir = 4},/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/research) "bMs" = (/obj/effect/floor_decal/corner/green{dir = 5},/obj/effect/floor_decal/corner/green{dir = 10},/turf/simulated/floor/tiled,/area/hydroponics) "bMt" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/effect/floor_decal/corner/green{dir = 10},/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/tiled,/area/hydroponics) "bMu" = (/obj/machinery/vending/snack,/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -4790,7 +4789,7 @@ "bOf" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) "bOg" = (/obj/machinery/atmospherics/pipe/simple/visible/red{dir = 9},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) "bOh" = (/obj/machinery/atmospherics/pipe/manifold/visible/supply,/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers,/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) -"bOi" = (/turf/simulated/wall,/area/maintenance/substation/bar) +"bOi" = (/obj/structure/cable{icon_state = "2-8"},/obj/machinery/camera/network/engineering,/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) "bOj" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bOk" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bOl" = (/obj/machinery/door/airlock/maintenance/common{name = "Hydroponics Maintenance"; req_access = list(35)},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{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/plating,/area/hydroponics) @@ -4829,10 +4828,10 @@ "bOS" = (/obj/structure/railing,/obj/machinery/computer/area_atmos/tag{dir = 8; scrub_id = "atrium"},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) "bOT" = (/obj/machinery/light/small{dir = 8; pixel_x = 0},/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bOU" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/maintenance/engi{name = "Engineering Pump Station"},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) -"bOV" = (/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"; pixel_x = 0},/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/locker_room) -"bOW" = (/obj/structure/cable{icon_state = "2-8"},/obj/machinery/camera/network/engineering,/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/bar) -"bOX" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/substation/bar) -"bOY" = (/obj/machinery/alarm{pixel_y = 22},/obj/effect/decal/cleanable/blood/splatter,/obj/structure/cable{icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/substation/bar) +"bOV" = (/obj/item/weapon/pickaxe,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/hallway) +"bOW" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable{icon_state = "4-8"},/obj/machinery/door/airlock/maintenance/engi{name = "Bar Substation"},/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) +"bOX" = (/obj/machinery/alarm{pixel_y = 22},/obj/effect/decal/cleanable/blood/splatter,/obj/structure/cable{icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) +"bOY" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-8"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) "bOZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bPa" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lime/border{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/computer/guestpass{dir = 4; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled,/area/hydroponics) "bPb" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics) @@ -4864,10 +4863,10 @@ "bPB" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 5},/obj/structure/railing{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) "bPC" = (/obj/machinery/atmospherics/pipe/zpipe/down/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/zpipe/down/supply{dir = 8},/obj/structure/cable/cyan{d1 = 32; d2 = 2; icon_state = "32-2"},/obj/machinery/camera/network/engineering{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/open,/area/maintenance/engineering/pumpstation) "bPD" = (/obj/effect/decal/cleanable/dirt,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) -"bPE" = (/obj/structure/sign/warning/high_voltage,/turf/simulated/wall,/area/maintenance/substation/bar) -"bPF" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/substation/bar) -"bPG" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-8"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/substation/bar) -"bPH" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/substation/bar) +"bPE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) +"bPF" = (/obj/structure/sign/warning/high_voltage,/turf/simulated/wall,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) +"bPG" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) +"bPH" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Surface Civilian"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) "bPI" = (/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor,/area/maintenance/lower/south) "bPJ" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lime/border{dir = 8},/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -30},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/hydroponics) "bPK" = (/obj/machinery/biogenerator,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lime/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/lime/bordercorner2{dir = 6},/turf/simulated/floor/tiled,/area/hydroponics) @@ -4895,9 +4894,9 @@ "bQg" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) "bQh" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) "bQi" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{dir = 10},/obj/structure/railing{dir = 1},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) -"bQj" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Cargo Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/bar) -"bQk" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Surface Civilian"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/substation/bar) -"bQl" = (/obj/machinery/power/sensor{name = "Powernet Sensor - Surface Civilian Subgrid"; name_tag = "Surface Civilian Subgrid"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/substation/bar) +"bQj" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/item/weapon/stock_parts/subspace/analyzer,/obj/machinery/firealarm{dir = 4; pixel_x = 26},/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) +"bQk" = (/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) +"bQl" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Surface Civilian Substation Bypass"},/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) "bQm" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/locker_room) "bQn" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table/rack,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/junk,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/lower/rnd) "bQo" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/lower/atrium) @@ -4926,7 +4925,7 @@ "bQL" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -25},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bQM" = (/obj/machinery/camera/network/civilian{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) "bQN" = (/obj/machinery/light,/obj/item/device/radio/intercom{dir = 1; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/bar) -"bQO" = (/obj/machinery/alarm{dir = 1; pixel_y = -25},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"bQO" = (/obj/machinery/camera/network/engineering{dir = 1},/obj/machinery/computer/security/engineering{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "bQP" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/mauve/border{dir = 8},/obj/item/device/radio/intercom{dir = 4; pixel_x = -24},/turf/simulated/floor/tiled,/area/rnd/research) "bQQ" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/rnd/research) "bQR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/rnd/research) @@ -4944,7 +4943,7 @@ "bRd" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/mauve/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/mauve/bordercorner2{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/hallway/lower/third_south) "bRe" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) "bRf" = (/obj/machinery/light/small,/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) -"bRg" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable{icon_state = "4-8"},/obj/machinery/door/airlock/maintenance/engi{name = "Bar Substation"},/turf/simulated/floor/plating,/area/maintenance/substation/bar) +"bRg" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance/engi{name = "Bar Substation"},/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) "bRh" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary{scrub_id = "atrium"},/turf/simulated/floor/tiled/techmaint,/area/hallway/lower/third_south) "bRi" = (/obj/random/toy,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) "bRj" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) @@ -5142,7 +5141,7 @@ "bUT" = (/obj/structure/table/glass,/obj/machinery/computer/skills,/turf/simulated/floor/tiled,/area/rnd/rdoffice) "bUU" = (/turf/simulated/floor/tiled,/area/rnd/rdoffice) "bUV" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/mauve/border{dir = 4},/turf/simulated/floor/tiled,/area/rnd/rdoffice) -"bUW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/turf/simulated/floor/plating,/area/rnd/rdoffice) +"bUW" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/obj/item/weapon/stock_parts/subspace/treatment,/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) "bUX" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/mauve/border{dir = 8},/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/mauve/bordercorner2{dir = 10},/turf/simulated/floor/tiled/steel_grid,/area/assembly/robotics) "bUY" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled/steel_grid,/area/assembly/robotics) "bUZ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/steel_grid,/area/assembly/robotics) @@ -5202,7 +5201,7 @@ "bWb" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/mauve/border,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled/steel_grid,/area/assembly/robotics) "bWc" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/mauve/border,/obj/structure/filingcabinet/chestdrawer,/turf/simulated/floor/tiled/steel_grid,/area/assembly/robotics) "bWd" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/mauve/border,/obj/structure/table/standard,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor/tiled/steel_grid,/area/assembly/robotics) -"bWe" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/mauve/border{dir = 6},/obj/structure/table/standard,/obj/item/weapon/pen,/obj/item/weapon/pen,/obj/item/weapon/pen,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor/tiled/steel_grid,/area/assembly/robotics) +"bWe" = (/obj/machinery/computer/rcon{tag = "icon-computer (NORTH)"; icon_state = "computer"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "bWf" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/hallway/lower/third_south) "bWg" = (/turf/simulated/wall,/area/tether/surfacebase/shuttle_pad) "bWh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/tether/surfacebase/shuttle_pad) @@ -5299,43 +5298,43 @@ "bXU" = (/obj/structure/table/steel,/turf/simulated/floor/tiled/techfloor,/area/tether/surfacebase/shuttle_pad) "bXV" = (/obj/structure/table/steel,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/tether/surfacebase/shuttle_pad) "bXW" = (/obj/machinery/camera/network/northern_star,/turf/simulated/floor/outdoors/grass/sif/virgo3b,/area/tether/surfacebase/outside/outside3) -"bXX" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random_multi/single_item/netgun,/obj/random/maintenance/research,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/junk,/turf/simulated/floor,/area/maintenance/lower/south) -"bXY" = (/obj/structure/railing{dir = 4},/obj/effect/floor_decal/techfloor{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 1},/obj/structure/table/rack,/obj/random/medical/lite,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) +"bXX" = (/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor,/area/maintenance/lower/south) +"bXY" = (/obj/effect/floor_decal/corner_techfloor_grid/full{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bXZ" = (/obj/structure/closet/firecloset,/obj/structure/sign/warning/high_voltage{pixel_x = -32},/obj/random/maintenance/clean,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) -"bYa" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) +"bYa" = (/obj/structure/table/rack,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/receiver,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/broadcaster,/obj/item/weapon/circuitboard/telecomms/exonet_node,/obj/machinery/light/small,/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) "bYb" = (/obj/machinery/door/airlock/maintenance/engi{name = "Engineering Pump Station"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) "bYc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) -"bYd" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/maintenance/engi{name = "Bar Substation"},/turf/simulated/floor/plating,/area/maintenance/substation/bar) -"bYe" = (/obj/structure/railing{dir = 8},/obj/effect/floor_decal/techfloor{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) +"bYd" = (/obj/machinery/power/sensor{name = "Powernet Sensor - Surface Civilian Subgrid"; name_tag = "Surface Civilian Subgrid"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/plating,/area/maintenance/substation/bar{name = "\improper Surface Civilian Substation"}) +"bYe" = (/obj/effect/floor_decal/techfloor,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/structure/closet,/obj/random/contraband,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/tool,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "bYf" = (/obj/machinery/door/airlock/maintenance/rnd{name = "Research Maintenance Access"},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/rnd/lockers) "bYg" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance/rnd{name = "Science Maintenance"},/turf/simulated/floor/tiled/steel_grid,/area/rnd/hallway) "bYh" = (/obj/machinery/door/firedoor/glass,/obj/structure/catwalk,/obj/machinery/door/airlock/maintenance/rnd{name = "Science Maintenance"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) -"bYi" = (/obj/structure/railing,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) +"bYi" = (/obj/item/clothing/under/rank/clown,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/hallway) "bYj" = (/obj/structure/railing,/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "bYk" = (/obj/machinery/door/airlock/maintenance/engi{name = "Atmospherics Access"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) -"bYl" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet,/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) -"bYm" = (/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/junk,/obj/random/maintenance/research,/obj/random/maintenance/medical,/obj/random/tech_supply,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) +"bYl" = (/obj/structure/catwalk,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/visible/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) +"bYm" = (/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bYn" = (/obj/structure/railing,/turf/simulated/floor,/area/maintenance/lower/south) "bYo" = (/obj/machinery/door/airlock/maintenance/common,/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/door/firedoor/glass,/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "bYp" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) -"bYq" = (/obj/structure/closet,/obj/item/clothing/mask/gas,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/obj/random/maintenance/medical,/obj/random_multi/single_item/teleport,/obj/random/maintenance/medical,/turf/simulated/floor/plating,/area/maintenance/lower/atrium) +"bYq" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bYr" = (/obj/effect/decal/cleanable/dirt,/obj/structure/catwalk,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bYs" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/mauve/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/machinery/vending/wallmed_airlock{pixel_x = 32},/turf/simulated/floor/tiled,/area/rnd/hallway) "bYt" = (/obj/effect/floor_decal/techfloor/corner{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) -"bYu" = (/obj/structure/railing{dir = 4},/obj/structure/table/rack,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/research) +"bYu" = (/obj/structure/railing{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bYv" = (/obj/machinery/door/airlock/multi_tile/metal/mait{name = "Atmospherics Maintenance"; req_access = list(24); req_one_access = list(24)},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) -"bYw" = (/obj/item/weapon/pickaxe,/obj/random_multi/single_item/teleport,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/hallway) +"bYw" = (/obj/structure/railing,/obj/structure/railing{dir = 4},/obj/effect/floor_decal/techfloor{dir = 9},/obj/structure/closet,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bYx" = (/obj/machinery/door/firedoor/glass,/obj/effect/decal/cleanable/dirt,/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/atmos) "bYy" = (/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/obj/structure/catwalk,/obj/structure/closet/crate,/obj/random/maintenance/engineering,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/junk,/turf/simulated/floor,/area/maintenance/lower/south) -"bYz" = (/obj/effect/decal/cleanable/dirt,/obj/structure/catwalk,/obj/structure/closet/crate,/obj/random/cigarettes,/obj/random/maintenance/engineering,/obj/random/maintenance/research,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/lower/south) +"bYz" = (/obj/structure/railing{dir = 4},/obj/effect/floor_decal/techfloor,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bYA" = (/obj/effect/floor_decal/rust,/obj/structure/table/rack,/obj/structure/catwalk,/obj/random/maintenance/research,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) -"bYB" = (/obj/effect/floor_decal/corner_techfloor_grid/full{dir = 4},/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) +"bYB" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/item/weapon/stock_parts/subspace/filter,/obj/machinery/camera/network/telecom{dir = 1},/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) "bYC" = (/obj/structure/railing{dir = 8},/obj/effect/floor_decal/corner_techfloor_grid{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bYD" = (/obj/structure/catwalk,/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/research) "bYE" = (/turf/simulated/wall/r_wall,/area/maintenance/lower/south) "bYF" = (/obj/machinery/door/airlock/multi_tile/metal/mait,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor/grid,/area/maintenance/lower/south) -"bYG" = (/obj/effect/floor_decal/techfloor,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/structure/closet,/obj/random_multi/single_item/netgun,/obj/random/contraband,/obj/random/maintenance/research,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/tool,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) -"bYH" = (/obj/item/clothing/under/rank/clown,/obj/random_multi/single_item/netgun,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/hallway) +"bYG" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/obj/item/weapon/stock_parts/subspace/crystal,/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) +"bYH" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/obj/item/weapon/stock_parts/micro_laser/high,/turf/simulated/floor/tiled/techmaint,/area/tcomfoyer{name = "\improper Telecomms Storage"}) "bYI" = (/obj/effect/floor_decal/techfloor{dir = 4},/obj/effect/floor_decal/techfloor{dir = 6},/obj/structure/railing,/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/obj/random/maintenance/research,/turf/simulated/floor/tiled/techfloor,/area/maintenance/asmaint2) "bYJ" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/maintenance/rnd{name = "Science Maintenance"},/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/research) "bYK" = (/obj/effect/floor_decal/rust,/obj/random/junk,/turf/simulated/floor/tiled/steel_dirty,/area/maintenance/lower/research) @@ -5346,11 +5345,11 @@ "bYP" = (/obj/machinery/door/firedoor/glass,/obj/structure/catwalk,/turf/simulated/floor/tiled/techfloor,/area/engineering/atmos/processing) "bYQ" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bYR" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) -"bYS" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 5},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/research,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) -"bYT" = (/obj/structure/railing{dir = 1},/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) +"bYS" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/item/weapon/wrench,/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) +"bYT" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/yellow/border{dir = 1},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/item/weapon/storage/box/donkpockets,/turf/simulated/floor/tiled,/area/engineering/atmos/hallway) "bYU" = (/obj/structure/railing{dir = 1},/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/structure/table/rack,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bYV" = (/turf/simulated/wall/r_wall,/area/engineering/atmos) -"bYW" = (/obj/structure/railing,/obj/structure/railing{dir = 4},/obj/effect/floor_decal/techfloor{dir = 9},/obj/structure/closet,/obj/random_multi/single_item/netgun,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) +"bYW" = (/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/mauve/border{dir = 6},/obj/structure/table/standard,/obj/item/weapon/pen,/obj/item/weapon/pen,/obj/item/weapon/pen,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/steel_grid,/area/assembly/robotics) "bYX" = (/obj/structure/railing,/obj/effect/floor_decal/techfloor{dir = 1},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/structure/cable{icon_state = "2-4"},/obj/random/junk,/turf/simulated/floor/tiled/techfloor,/area/maintenance/lower/south) "bYY" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/substation/tcomms) "bYZ" = (/obj/structure/sign/department/telecoms,/turf/simulated/wall/r_wall,/area/maintenance/substation/tcomms) @@ -5363,7 +5362,6 @@ "bZg" = (/obj/structure/railing,/turf/simulated/floor/water/pool,/area/tether/surfacebase/atrium_one) "bZh" = (/obj/structure/railing{dir = 8},/obj/structure/railing,/turf/simulated/floor/water/pool,/area/tether/surfacebase/atrium_one) "bZi" = (/obj/structure/railing,/obj/structure/railing{dir = 4},/turf/simulated/floor/water/pool,/area/tether/surfacebase/atrium_one) -"bZj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/crew_quarters/locker) "bZk" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/crew_quarters/bar) "bZl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/disposalpipe/junction{dir = 1; icon_state = "pipe-j2"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/tether/surfacebase/atrium_three) "bZm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/crew_quarters/locker/laundry_arrival) @@ -5426,62 +5424,62 @@ aaaaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaa aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagabTabTacracsabnactacuacvacwacxacyacxacxaczacAacBacCacDacEacFacGacHacIacJacKacLabMacMacNabPacOacpahXaaUaaUaaUaaUaaUaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagabTacQacRacSabnajZabnacUacVacWacXacYacZadaacWadbadcaddadeadfadfadgadfadhadiadjadkadladmabPacOadnabHabHabHabHabHaaUaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagabTacQacRadoabTadpabnadqadracxadsadradtaduacxadvabMadwadxadxadyadzadAadBadxadCadDadEadFabPadGadHadIadIadIadJabHaaUaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagabTadKadLadMadNadOabnadPadQadRadSadTadUadVadWadXabLadYadZadZaeaabLaebaecaedaeeabLaefaegabPamWamFanSanmaelaemabHaaUaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagabTabTabTabTabTaenabnabnaeoaeoaepaeoaeoaeqaeoaeoabLabLabLabLabLabLabMaeraesabMabLabPabPabPaaUaaUaaUaaUaaUaaUaetaaUaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagabTadKadLadMadNadOabnadPadQadRadSadTadUadVadWadXabLadYadZadZaeaabLaebaecaedaeeabLaefaegabPamWamFanoanmaelaemabHaaUaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagabTabTabTabTabTaenabnabnaeoaeoaepaeoaeoaeqaeoaeoabLabLabLabLabLabLabLaeraesabLabLabPabPabPaaUaaUaaUaaUaaUaaUaetaaUaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeuaeuaeuaeuaevaewaexaoJaeoaezaeAaeBaeCaeDaeEaeFaeGaeHaeIaeIaeJaeKaeLaeMaeNaeOaePaeQaeRaeGaagaagaagaagaagaaUabHaaUaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSaeSaeSaeSaeSaeSaeSaeSaeSaagaagaagaeuaeTaeUaeVaeWaeXapsapraeoafaafbaeCaeCafcaeCaeCafdafeaffafgafhafiafiafjafkafkafkafkaflaeGaagaagaagaagaagaaUafmaaUaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSaeSaeSaeSaeSaeSaeSaeSaeSaagaagaagaeuaeTaeUaeVaeWaeXapsapoaeoafaafbaeCaeCafcaeCaeCafdafeaffafgafhafiafiafjafkafkafkafkaflaeGaagaagaagaagaagaaUafmaaUaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSafnafoafpafqafrafsafnaeSaagaagaagaeuaftafuafvaeuafwasFaqJaeoafaafzaeCaeCafAafBafCafDafEafFafFafGafFafHafIafJafJafKafkafLaeGaagaagaagaagaagaaUasGaaUaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSafMafNafNafOafNafPafQaeSaagaagaagaeuafRafSafTafUafVafWauRaeoafYafZaeCagaaeCagbagcaeGagdageagfaggaghagiagjagkagkagkaglagmaeGaagaagaagaagaagaaUabHaaUaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSafMafNafNafOafNafPafQaeSaagaagaagaeuafRafSafTafUafVafWapoaeoafYafZaeCagaaeCagbagcaeGagdageagfaggaghagiagjagkagkagkaglagmaeGaagaagaagaagaagaaUabHaaUaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSagnafNafnafnafnagoagpaeSaagaagaagaeuaeuaeuaeuaevagqabTabTaeoaeoaeoaeoaeoaeoaeoaeoaeGaeGaeGagragsaeGaeGaeGaeGaeGaeGaeGaeGaeGaagaagaagaaUaaUaaUabHaaUaaUaaUaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSaguafNafnagvafnagoagwaeSaagaagaagaagaagaagaagabTagqabTaagaagaagaagaagaagaagaagaagaagaagaeGagxagyaeGaagaagaagaagaagaagaagaagaagaagaagaaUaBxagCaBZaBYaCcaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSagEagFafNafOafNagoagGaeSabTabTabTabTabTabTabTabTagHabTaagaagaagaagaagaagagIagIagIaagaagaeGagJagKaeGaagaagaagaagaagaagaagaagaagaagaagaaUaCOaCHaDeaDcaEMaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagagPagPagPagPagPaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSagQagRagSagTagSagUagVaeSabTafwafwafwagWafwafwafwagHabTaagaagaagaagaagaagagIagXagIaagaagaeGagYagZaeGaagaagaagaagaagaagaagaagaagaagaagaaUabHaETaEVaEUabHaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagagPaheahfahgagPagPaagaagahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhaeSaeSahiahjahjahjahkaeSaeSabTafwahlahoaFyahoahpahpahrabTaagagIagIagIagIagIagIahsagIagIagIagIahtahuagIagIagIagIagIagIahvahvahvahvaagaagaaUahwaHlaHqaHpaEMaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagagPahBahCahDahEagPaagaagahhahFahGahHahIahJahKahLahKahMahKahNahKahOahKahPahKahQahKahJahKahKahRahSahTahKahRahUahTahVahWaHsahWahWahWahWahYahWahZahWahWagIaiaaibaicaidaieaifaigaihaiiaijaikailaimainaioaipaiqagIairaisaitahvaagaagaaUaHtaivaKkabHaKJaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSaguafNafnagvafnagoagwaeSaagaagaagaagaagaagaagabTagqabTaagaagaagaagaagaagaagaagaagaagaagaeGagxagyaeGaagaagaagaagaagaagaagaagaagaagaagaaUavfagCaBxaBYaBZaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSagEagFafNafOafNagoagGaeSabTabTabTabTabTabTabTabTagHabTaagaagaagaagaagaagagIagIagIaagaagaeGagJagKaeGaagaagaagaagaagaagaagaagaagaagaagaaUaCOaCcaDeaCHaEMaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagagPagPagPagPagPaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaeSagQagRagSagTagSagUagVaeSabTafwafwafwagWafwafwafwagHabTaagaagaagaagaagaagagIagXagIaagaagaeGagYagZaeGaagaagaagaagaagaagaagaagaagaagaagaaUabHaETaEVaDcabHaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagagPaheahfahgagPagPaagaagahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhahhaeSaeSahiahjahjahjahkaeSaeSabTafwaEUahoaFyahoahpahpahrabTaagagIagIagIagIagIagIahsagIagIagIagIahtahuagIagIagIagIagIagIahvahvahvahvaagaagaaUahwaHlaHqaHpaEMaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagagPahBahCahDahEagPaagaagahhahFahGahHahIahJahKahLahKahMahKahNahKahOahKahPahKahQahKahJahKahKahRahSahTahKahRahUahTahVahWaHsahWahWahWahWahYahWahZahWahWagIaiaaibaicaidaieaifaigaihaiiaijaikailaimainaioaipaiqagIairaisaitahvaagaagaaUaDKaivaKkabHaEMaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaiwaiwaiwaiwagPaixaiyaizaiAagPaagaagahhaiBbOAaiDaiEaiFaiFaiFaiFaiGaiFaiFaiHaiGaiFaiFaiFaiFaiFaiIaiFaiFaiFaiJaiFaiFaiFaiKaiLaiNaiMajCaiPaiQaiRaiSaiOaiTaiUaiVaiWaiXaiYaiZajaajaajaajaajaajaajbajaajaajaajaajaajaajcajdajeajfajgajhahvaagaagaaUaaUaaUaaUaaUaaUaaUaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaiwajiajjaiwagPajkagPagPagPagPagPagPagPajlajmajnajoajpajpajqajrajsajtajuajvajwajuajuajuajuajuajxajuajuajuajyajuajuajzajAajBbAOajDbZTajEajFajFajGajHajHajIajJajKajLajMajNajOajOajOajOajOajOajOajOajOajOajOajOajOajPajQagIajRajSajTahvaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaadaadajUajUajVaiwajWajXaiwajYaLMagPakaakbakcakdakeakfakgaiCakhahhahhahhakiakjakkakiahhahhahhahhahhahhahhahhahhahhahhahhahhaklakmakmaknakmakmahWaLPahWakpakqakraksahWahWahWahWagIaktakuajOakvakwakwakwakwakwakwakwakwakwakvajOajPajQagIahvakxahvahvaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaadaadajUajUakyakzakAakBakCakDakEakFakGakHakHakHakIakJakKaiFakLahhakMaMaakOakPakQakRaMsakMakMakMakTaagaagaagaagaagaagaagaagaklakUakVakWakVakXakYakZahWalaalaahWalbalcahWaagaagagIaldakuajOalebRXbVubVubVubVubVubVubVubZcaleajOajPalgagIalhalialjalhaagaagaagaagaagaagaagaagaagalhalhalhalhalhaagaadaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaadaadajUajUakyalkallalmalnaloalpalqalralsaltalsalualvalwaiCalxahhakMaMwalzalAakQakRakOakMakMakMakTaagaagaagaagaagaagaagaagaklalBakValCakValDakYalEahWahWahWahWakqalFahWaagaagagIalGakuajOalebZdalfalfalfalfalfalfalfbZealeajOajPajQagIalhalhaMJalhalhalhalhalhalhalhalhalhalhalhaMZalJalKalhaagaadaadaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaadaadajUajUakyalkallalmalnaloalpalqalralsaltalsalualvalwaiCalxahhakMaMwalzalAakQakRakOakMakMakMakTaagaagaagaagaagaagaagaagaklalBakValCakValDakYalEahWahWahWahWakqalFahWaagaagagIalGakuajOalebZdalfalfalfalfalfalfalfbZealeajOajPajQagIalhalhaMJalhalhalhalhalhalhalhalhalhalhalhaMualJalKalhaagaadaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaadaadajUajUalLaiwalMalNaiwalOalPagPalQalRalSalTalUakfalVaiCalWahhakManIakOalXalYalzakOakMakMakMakTaagaagaagaagaagaagaagaagaklalZakVamaambamcakYalEakYahWahWahWamdameahWaagaagagIalGakuajOalebZdbZfalfalfalfalfalfalfbZealeajOajPamfamgagXaNpamiamjamjaNzamjamkalKalKalKalKalKalKalKamlalKalhaagaagaagaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagammammammammammamnamnamnamnamoamoamoamoamoampamqamrahhakMakOakOamsalzakOakOakOakMakMakTaagaagaagaagaagaagaagaagaklaklamuamvamwamxakYalEakYakYahWahWahWahWahWaagaagagIamyakuajOamzbZdalfalfalfalfalfalfalfbZeamzajOajPajQagIalhalhalhalhalhamAamAamBamAaODamAamDaOFaOZalKalKalKalhaagaagaagaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaadaadaagaagammammammammammamnamnamnamnamoamoamoamoamoampamqamrahhakMakOakOamsalzakOakOakOakMakMakTaagaagaagaagaagaagaagaagaklaklamuamvamwamxakYalEakYakYahWahWahWahWahWaagaagagIamyakuajOamzbZdalfalfalfalfalfalfalfbZeamzajOajPajQagIalhalhalhalhalhamAamAamBamAaODamAamDaOhaOFalKalKalKalhaagaagaagaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaadaagaagaagamGamHamIamJamGamKamLamMamGamNamOamPamQamRamSaiCakhahhakMakOalzakOakOanIanIakOakOakOakTaagaagaagaagaagaagaagaagaagaklaklamTamUamVakYaPdalEalEakYaagaagaagaagaagaagagIamXakuajOamzbZdalfalfbZgbZgbZgalfalfbZeamzajOajPamYagIaagaagaagalhamZamZalhalhalhalhalhalhalhalhalhalhalhalhaagaagaagaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaadaagaagaagamGanaanbancamGandaneanfamGanganhanhanianjankaiFanlahhaRkakOakRakOakOakOakOalzalzakRakTaagaagaagaagaagaagaagaagaagaagaklaklaklaklakYannanoalEakYaagaagaagaagaagaagagIanpakuajOamzbZdalfbZeanqanqanrbZdalfbZeamzajOajPansagIaagaagaagalhantalhalhaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaadaagamGamGamGanuanvanwamGanxanyanzamGanAanBanCanDanEanFaiCanGanHakOakOakOakOakOalzakOakOakOanJakTaagaagaagaagaagaagaagaagaagaagaagaagaagaagakYanKanLanMakYaagaagaagaagaagaaganNalGanOajOamzbZdalfbZeanqakvanqbZdalfbZeamzajOanPajQanQanRanRanRanRaSqanRanRanRanRanRanRaaganTaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaadaagamGanUamGanVanWanXamGanYanZaoaamGamoamoamoamoamoaobaocaodaoeaofalzanIakOakOakOakOakOaogaohakTaagaagaagaagakYakYakYakYakYakYakYakYakYakYakYakYakYaSWakYakYakYakYakYakYakYagIalGakuajOamzbZdalfbZeanranqanrbZdalfbZeamzajOajPajQanRaojaokaolaomaonanRaooaopaoqaoranRaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaadaagaagaagamGanaanbancamGandaneanfamGanganhanhanianjankaiFanlahhaRkakOakRakOakOakOakOalzalzakRakTaagaagaagaagaagaagaagaagaagaagaklaklaklaklakYannaPsalEakYaagaagaagaagaagaagagIanpakuajOamzbZdalfbZeanqanqanrbZdalfbZeamzajOajPansagIaagaagaagalhantalhalhaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaadaagamGamGamGanuanvanwamGanxanyanzamGanAanBanCanDanEanFaiCanGanHakOakOakOakOakOalzakOakOakOanJakTaagaagaagaagaagaagaagaagaagaagaagaagaagaagakYanKanLanMakYaagaagaagaagaagaaganNalGanOajOamzbZdalfbZeanqakvanqbZdalfbZeamzajOanPajQanQanRanRanRanRaSqanRanRanRanRanRanRaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaaa +aaaaadaadaadaadaadaadaadaadaadaadaadaagamGanUamGanVanWanXamGanYanZaoaamGamoamoamoamoamoaobaocaodaoeaofalzanIakOakOakOakOakOaogaohakTaagaagaagaagakYakYakYakYakYakYakYakYakYakYakYakYakYaSWakYakYakYakYakYakYakYagIalGakuajOamzbZdalfbZeanranqanrbZdalfbZeamzajOajPajQanRaojaokaolaomaonanRaooarWaoqaoranRaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaagaagamGaosaotaouaovaowaoxaoyaozaoAamGaoBaoCaoDaoEahhaoFaiCaoGahhaoHakOakOakOalzalzaUrakMakMakMakTaagaagaagaagakYaUsaoKaoLalEalEaoMalEalEalEalEalEalEaoNaoOaoOaoOaoOaoOaoOaoOaoPaoQakuajOamzbZdalfalfbVubVubVualfalfbZeamzajOajPaoRanRaoSaoTaoUaoVaoWanRaoXaoYanRanRanRaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaaa -aaaaadaadaadaadaadaadaadaadaadaadaagaagamGaoZaotaouapaapbapcapdapaaoAamGapeapfapgaphahhapiapjakhahhaUNakOakOalzaUQakMakMakMakMakMakTaagaagaagaagakYapmalEapnappappappannannannaUZaVYaVJakYakYakYakYakYakYakYakYagIaptakuajOamzbZdalfalfalfalfalfalfalfbZeamzajOajPapuanRaoSapvapwapxapyanRapzapAapBaoranRaagapCapCapCapCapCapCapCapDapEapEapFapGapGapGapGapFapEapEapHaaa -aaaaadaadaadaadaadaadaadaadaadaadaagaagamGapIapJapKapLapMapNapOapPapQamGapRapfapgapSahhapTaiCapUapVapWapWapWapWakTakTakTakTakTakTakTaagaagaagaagakYapXalEapYaXKakYakYakYakYakYakYakYakYakYaagaagaagaagaagaagaagagIaqaakuajOalebZdalfalfalfalfalfalfbZfbZealeajOajPaqbanRaqcapvaqdaqeaoWanRaqfaqganRanRanRaagapCaqhaqiaqjaqkaqlaqmaqnaqoaqpaqqaqpaqpaqpaqpaqqaqpaqrapCaaa +aaaaadaadaadaadaadaadaadaadaadaadaagaagamGauAaotaouapaapbapcapdapaaoAamGapeapfapgaphahhapiapjakhahhaUNakOakOalzaUQakMakMakMakMakMakTaagaagaagaagakYapmalEapnappappappannannannannaRLaVJakYakYakYakYakYakYakYakYagIaptakuajOamzbZdalfalfalfalfalfalfalfbZeamzajOajPapuanRaoSapvapwapxapyanRapzapAapBaoranRaagapCapCapCapCapCapCapCapDapEapEapFapGapGapGapGapFapEapEapHaaa +aaaaadaadaadaadaadaadaadaadaadaadaagaagamGapIapJapKapLapMapNapOapPapQamGapRapfapgapSahhapTaiCapUapVapWapWapWapWakTakTakTakTakTakTakTaagaagaagaagakYapXalEapYaTrakYakYakYakYakYakYakYakYakYaagaagaagaagaagaagaagagIaqaakuajOalebZdalfalfalfalfalfalfbZfbZealeajOajPaqbanRaqcapvaqdaqeaoWanRaqfaqganRanRanRaagapCaqhaqiaqjaqkaqlaqmaqnaqoaqpaqqaqpaqpaqpaqpaqqaqpaqrapCaaa aaaaadaadaadaadaadaadaadaadaadaadaagamGamGamGaqsaqtaquaqvaqwaqxaqyaqzamGapRaqAaqBaqCahhaqDaiCaqEaqFaqGaqHaqIapWaagaagaagaagaagaagaagaagaagaagaagakYaYDaqKaqLaqMakYaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagagIaptakuajOalebZdalfalfalfalfalfalfalfbZealeajOajPajQanRaqNaqOaqPaqQaqRanRaqSaqTaqUaoranRaagapCaqVaqWaqWaqWaqXaqWaqnaqoaqpaqqaqpaqpaqpaqpaqqaqpaqYapCaaa aaaaadaadaadaadaadaadaadaadaadaadaagamGaqZaraarbaoZarcaoZardarearfargamGarhariarjarjahharkaiCarlapWarmarnaroapWarparparparparparparparparparparpakYarqalEakYakYakYaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagagIarrakuajOalebZhbZgbZgbZgbZgbZgbZgbZgbZialeajOajParsanRartaoTaoTaruarvanRarwanRanRanRanRaagapCarxaqWaryarzarAaqWaqnaqoaqparBarCarCarCarCarBaqpaqrapCaaa -aaaaadaadaadaadaadaadaadaadaadaagaagamGarDarEarbarFarGarHarIarJarKarKarLarMarNarOarParQarRaiCarSarparparTarUarparVarWarXarYarXarXarXarXarXarXarXarZasaasbakYaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagagIascakuajOakvakwakwakwakwakwakwakwakwakwakvajOajPasdaseasfaoTaoTaruasgashasiasjaskaslanRaagapCasmaqWasnasoaspaqWaqnaqoarCarBarCarCarCarCarBarCasqapCaaa -aaaaadaadaadaadaadaadaadaadaadaagaagamGasrassastasuasuasuasuasuasuasvaswasxasyaszasAasBasCasDasEarpbegbdUasHasIasJasKasLasLasLasLasLasLasLasLasLasLasMasNasOasOasPasPasPasPasPasPagIagIaagaagaagaagaagaagaagaagagIasQakuajOajOajOajOajOajOajOajOajOajOajOajOajOasRasSasTasUasVbZjasWasXaoTasYaoTaoWaslanRaagapCaqhasZasZaqWataaqWaqnaqoarCarBarCarCarCarCarBarCaqYatbaaa -aaaaadaadaadaadaadaadaadaadaadaagamGamGamGamGatcaoZaoZatdateatfatgathaoZatiatjatkatlatmatnatoatparpatqatratratratratsasLattatuatvatwatxatxatxatyasLatzatAasOatBatCatCatCatCatCatCagIagIagIaagaagaagaagaagaagaagagIatDatEatFatGatGatGatGatGatHatGatGatGatGatGatGatIatJanRatKaoTaoTatLatMatNatOaoTaoWaslanRaagapCapCapCapCatPataaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa -aaaaadaadaadaadaadaadaadaadaagaagamGatQatRatSatTaoZaquaotatQamGatUatVatWamGatXatYarparparparparparpatZauaauaauaauaauaasLaubaucaudaueaufaufaufaugasLbeQauibeSaukatCaulaulaulaulatCaumaunagIagIagIagIauoagIagIagIagIaupakuauqaurausautautauuauvauwauxautautautauyajPajQanRauzauzauAauBauCauDauEauFauGauHanRaagapCauIauIapCauJataaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa -aaaaadaadaadaadaadaadaadaadaagaagamGauKaoZaoZatTaoZauLaotauMamGatUauNauOamGauPauQbfxarXarXarXarXauSauTauaauUauVauWauXauYauZavaavbavcavdavdavdaveasLbfzavgasOavhatCaulaulaulaulaulaviavjavkavlavmavnavnavoavpavqavravsavtavuagIagIavvavvavvavvavvavvavwavvavvavxajPajQanRanRanRanRavyavzanRanRanRanRanRavAagIapCavBavBapCavCavDaqWaqnaqoarCarBarCarCarCarCarBarCaqYapCaaa -aaaaadaadaadaadaadaadaadaadaadaagamGavEavFavGavHbhtavJaotatQamGavKavLavMamGavNavOauaauaauaauaauaauaauaauaavPavQavRavSavTavUavVavWavXavYavYavZawaasLawbavgasOavhatCaulaulaulaulaulaviaviaviawcaviaviawdaviaweatGawfawgawhawiamgagXavvawjawkawlawmawnawoawpavvawqawrawsawtawuawvawwawxawyawzawAawBawCawDawEawuawFawGawGawHawIawJaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa +aaaaadaadaadaadaadaadaadaadaadaagaagamGarDarEarbarFarGarHarIarJarKarKarLarMarNarOarParQarRaiCarSarparparTarUarparVaxQarXarYarXarXarXarXarXarXarXarZasaasbakYaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagagIascakuajOakvakwakwakwakwakwakwakwakwakwakvajOajPasdaseasfaoTaoTaruasgashasiasjaskaslanRaagapCasmaqWasnasoaspaqWaqnaqoarCarBarCarCarCarCarBarCasqapCaaa +aaaaadaadaadaadaadaadaadaadaadaagaagamGasrassastasuasuasuasuasuasuasvaswasxasyaszasAasBasCasDasEarpbegbdUasHasIasJasKasLasLasLasLasLasLasLasLasLasLasMasNasOasOasPasPasPasPasPasPagIagIaagaagaagaagaagaagaagaagagIasQakuajOajOajOajOajOajOajOajOajOajOajOajOajOasRasSasTasUasVasVasWasXaoTasYaoTaoWaslanRaagapCaqhasZasZaqWataaqWaqnaqoarCarBarCarCarCarCarBarCaqYatbaaa +aaaaadaadaadaadaadaadaadaadaadaagamGamGamGamGatcaoZaoZatdateatfatgathauAatiatjatkatlatmatnatoatparpatqatratratratratsasLattatuatvatwatxatxatxatyasLatzatAasOatBatCatCatCatCatCatCagIagIagIaagaagaagaagaagaagaagagIatDatEatFatGatGatGatGatGatHatGatGatGatGatGatGatIatJanRatKaoTaoTatLatMatNatOaoTaoWaslanRaagapCapCapCapCatPataaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa +aaaaadaadaadaadaadaadaadaadaagaagamGatQatRatSatTaoZaquaotatQamGatUatVatWamGatXatYarparparparparparpatZauaauaauaauaauaasLaubaucaudaueaufaufaufaugasLbeQauibeSaukatCaulaulaulaulatCaumaunagIagIagIagIauoagIagIagIagIaupakuauqaurausautautauuauvauwauxautautautauyajPajQanRauzauzbEsauBauCauDauEauFauGauHanRaagapCauIauIapCauJataaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa +aaaaadaadaadaadaadaadaadaadaagaagamGauKaoZaoZatTaoZauLaotauMamGatUauNauOamGauPauQbfxarXarXarXarXauSauTauaauUauVauWauXauYauZavaavbavcavdavdavdaveasLaZkavgasOavhatCaulaulaulaulaulaviavjavkavlavmavnavnavoavpavqavravsavtavuagIagIavvavvavvavvavvavvavwavvavvavxajPajQanRanRanRanRavyavzanRanRanRanRanRavAagIapCavBavBapCavCavDaqWaqnaqoarCarBarCarCarCarCarBarCaqYapCaaa +aaaaadaadaadaadaadaadaadaadaadaagamGavEavFavGavHbhtavJaotatQamGavKavLavMamGavNavOauaauaauaauaauaauaauaauaavPavQavRavSavTavUavVavWavXavYavYavZawaasLawbavgasOavhatCaulaulaulaulaulaviaviaviawcaviaviawdaviaweatGawfawgawhawiamgagXavvawjbDBawlawmawnawoawpavvawqawrawsawtawuawvawwawxawyawzawAawBawCawDawEawuawFawGawGawHawIawJaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa aaaaadaadaadaadaadaadaadaadaadaagawKawKawKawKawKawKawKawKawKawKawKawKawKawKawLavOauaawMawNawOawPawQawRawSawTawUawVawWauYawXawYawZaxaaxbaxcaxdaxeblMaxgblPasOavhatCaxiaulaulaulatCaxjaxkaxlaxmaxnaxoaxpaxqaxraxsaxtaxuaxvaxwagIagIavvaxxaxyaxzaxzaxAbZmaxCaxDaxEasRawgaxFatGatGaxGatGaxHaxIatGatGawgatGatGaxJaxKaxLaxMaxNaxKaxOaqWaqnaqoarCarBarCarCarCarCarBarCaqratbaaa -aaaaadaadaadaadaadaadaadaadaadaagarpaxPaxQaxRaxRaxSaxRaxTaxUaxRaxRaxUaxRbphaxWavOauaaxXaxYaxZayaaybayaayaayaayaaycaydauYayeayfaygayhayiayjaykaylasLakYaymasObpiatCatCatCatCatCatCayoaypagIagIagIagIagIagIayqagIagIagIagIagIagIaagavvayraysaytayuayvaywayxayyayzayAayBayCayDayEayFayDayGayHayHayIayJayKayHayHayLayMayNayOayPayQaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa +aaaaadaadaadaadaadaadaadaadaadaagarpaxPbaoaxRaxRaxSaxRaxTaxUaxRaxRaxUaxRbphaxWavOauaaxXaxYaxZayaaybayaayaayaayaaycaydauYayeayfaygayhayiayjaykaylasLakYaymasObpiatCatCatCatCatCatCayoaypagIagIagIagIagIagIayqagIagIagIagIagIagIaagavvayraysaytayuayvaywayxayyayzayAayBayCayDayEayFayDayGayHayHayIayJayKayHayHayLayMayNayOayPayQaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa aaaaadaadaadaadaadaadaadaadaadaagarpayRaySayTayTayTayTayTayTayTayTayTayTayTayUayVauaayWawUayXayYayZayZayZazaazbazcazdasLasLasLauYauYazeasLasLasLasLaagazfasOasOasPasPasPasPasPasPagIagIagIaagaagaagaagazgazhazgaagaagaagaagaagaagavvaziazjazkazkavvazlazmavvagIagIaznagIagIagIagIagIazoagIagIagIagIagIauoagIapCazpazpapCavCazqaqWaqnaqoarCarBarCarCarCarCarBarCaqYapCaaa aaaaadaadaadaadaadaadaadaadaadaagarpazraySayTazsazsaztazuazvazwazxazyazzazAazBazCazDazEawUawUazFazGazGazGazHawUawVazIauaazJazKazLazMazNazOazPazQatmaagazRazSazTazTazTazTazUazUazUbCOazSazSazVbCPazUazUazWazXazgazgazgazgaagaagaagavvazYazZaAaaAbavvaAcaAdavvaagagIagXaAeaAeaAeaagaAeaAfaAeaagaagaagaagaagaagapCauIauIapCaAgaAhaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa aaaaadaadaadaadaadaadaadaadaadaadarpazraySayTazsazsazsaAiaAjaAkaAlaAmaAnazAaAoaApaAqaArawUawUazFazGaAsazGazHawUawVaAtauaaAuaAvaAwaAxaAyaAzaAxaAAatmaABaABaABaABaagaagaagaagaagaagaagaagaagaagaagaagaagbEUbFaaADaAEaAFazgaagaagaagavvaAGaAHaAIaAJavvaAKaALavvaagagIaAMaANaAOaAeaagaAeaAfaAeaagaagaagaagaagaagapCapCapCapCaAPaAhaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa aaaaadaadaadaadaadaadaadaadaadaadarpaAQaySayTaARaASaASaATaAUaAVaAWaAmaAXayTaAYaAZaAqaBaawUaBbaBcaBdaBdaBdaBeaBfaBgaBhaBiaBjaBkaAxaBlaBmaBnaBoaBpatmaBqaBraBsaABaagaagaagaagaagaagaagaagaagaagaagaagaagbEUaBtaBuaBvaBwazgaagaagaAeavvavvbJSavvavvavvavvavvavvaagagIagIaAeaByaAeaagaAeaBzaAeaagaagaagaagaagaagapCaqhaqiaqkaqWaAhaqWaqnaqoarCarBarCarCarCarCarBarCaqYatbaaa -aaaaadaadaadaadaadaadaadaadaadaadarpazraBAayTayTayTayTayTayTaBBaBCaBDaBEaBFaBGaBHaAqaBaawUaBIaBJaBJaBJaBKaBLaBLaBMaBNauaaBOaBkaBPaBlaBQaAxaBRaBSaBTaBUaBVaBWaABaagaagaagaagaagaagaagaagaagaagaagaagaagbEUaBXbLebLLaCaazgaAeaAeaAeaCbbMraAfaAeaagaagaagaagaagaagaagaagaAeaCdaAeaagaAeaAfaAeaagaagaagaagaagaagapCasmaqWaCeaCfaCgaqWaqnaqoarCarBarCarCarCarCarBarCasqapCaaa -aaaaadaadaadaadaadaadaadaadaadaadaChaCiaCjayTazsazsaztaCkazvaClaAWaAmaCmaCnaCoaCpauaaCqaCraCsaCtaCuaCvaCwaCxaCyaCyaCzaAqaAoaBkaAxaAxaAyaCAaCBaCCatmaCDaCEaCFaABaagaagaagaagaagaagaagaagaagaagbEUbEUbEUbEUaCGbOhaCIaCJaCKaCLaCLaCLaCMbOVaCNaAeaAeaAeaagaagaagaagaagaagaAebQmaAeaagaAeaAfaAeaagaagaagaagaagaagapCarxaqWaCParzaCQaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa +aaaaadaadaadaadaadaadaadaadaadaadarpazraBAayTayTayTayTayTayTaBBaBCaBDaBEaBFaBGaBHaAqaBaawUaBIaBJaBJaBJaBKaBLaBLaBMaBNauaaBOaBkaBPaBlaBQaAxaBRaBSaBTaBUaBVaBWaABaagaagaagaagaagaagaagaagaagaagaagaagaagbEUaBXbLebLLaCaazgaAeaAeaAeaCbbqWaAfaAeaagaagaagaagaagaagaagaagaAeaCdaAeaagaAeaAfaAeaagaagaagaagaagaagapCasmaqWaCeaCfaCgaqWaqnaqoarCarBarCarCarCarCarBarCasqapCaaa +aaaaadaadaadaadaadaadaadaadaadaadaChaCiaCjayTazsazsaztaCkazvaClaAWaAmaCmaCnaCoaCpauaaCqaCraCsaCtaCuaCvaCwaCxaCyaCyaCzaAqaAoaBkaAxaAxaAyaCAaCBaCCatmaCDaCEaCFaABaagaagaagaagaagaagaagaagaagaagbEUbEUbEUbEUaCGbOhaCIaCJaCKaCLaCLaCLaCMaCLaCNaAeaAeaAeaagaagaagaagaagaagaAebQmaAeaagaAeaAfaAeaagaagaagaagaagaagapCarxaqWaCParzaCQaqWaqnaqoarCarBarCarCarCarCarBarCaqrapCaaa aaaaadaadaadaadaadaadaadaadaadaadaadaCRajUayTazsazsazsaCSaAjaAkaCTaAmaCUaCVaCWaCXauaauaauaauaaAqaAqauaaCYauaaAqaAqaAqaAqaAoaBkaAxaAxaAyaAxaCBaCZatmaABaABaABaABaagaagaagaagaagaagbEUbEUbEUbEUbEUaDaaDbbEUbQGaDdbQIaDfbEUaAeaAeaAeaAeaAeaAfaAeaDgaAeaagaagaagaagaagaagaAeaByaAeaagaAeaAfaAeaagaagaagaagaagaagapCaqVaqWaqWaqWaDhaqWaqnaqoaqparBarCarCarCarCarBaqpaqYapCaaa -aaaaadaadaadaadaadaadaadaadaadaadaadaCRaagayTaARaASaASaDiaAUaAVaAWaDjaDkazAaDlaDmaDnaDoaDpaDqaDraDsaDtaDuaDvaDwaDwaDwaDxaDyaDzaDAaDBaDCaDDaDEaDFatmaagaagaagaagaagaagaagaagaagaagbEUaDGaDHaDIbEUbEUbEUbEUaDJaDfaDfaDKbEUaagaagaagaagaAeaAfaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaANaAeaAeaAeaAfaAeaagaagaagaagaagaagapCaqhasZaDLasZaDMaDNaqnaqoaqpaqqaqpaqpaqpaqpaqqaqpaqrapCaaa +aaaaadaadaadaadaadaadaadaadaadaadaadaCRaagayTaARaASaASaDiaAUaAVaAWaDjaDkazAaDlaDmaDnaDoaDpaDqaDraDsaDtaDuaDvaDwaDwaDwaDxaDyaDzaDAaDBaDCaDDaDEaDFatmaagaagaagaagaagaagaagaagaagaagbEUaDGaDHaDIbEUbEUbEUbEUaDJaDfaDfaDfbEUaagaagaagaagaAeaAfaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaANaAeaAeaAeaAfaAeaagaagaagaagaagaagapCaqhasZaDLasZaDMaDNaqnaqoaqpaqqaqpaqpaqpaqpaqqaqpaqrapCaaa aaaaDOaDPaDPaDPaDQaDRaDSaDPaDPaDPaDPaDTaagayTayTayTayTayTayTaDUaAWaDVaDWayTaDXaDYaDZaEaaEbaEcaEdaEbaEeaEfaEbaEbaEgaEhaEiaDZaEjaEkaElaEmaElaEnaEoatmaagaEpaEpaEpaEpaEpaEpaEpaEpaEpbEUaEqaEraEsbEUaEtbEUaDfaEubEUbEUbEUbEUaagaagaagaagaAeaEvaCLaCLaCLaCLaCLaCLaCLaEwaCLaCLaCLaCLaCLaExaEyaAeaagaagaagaagaagaagapCapCapCapCapCapCapCapDapEapEapFapGapGapGapGapFapEapEapHaaa -aEzaadaadaadaadaadaadaadaadaadaadaadaadaagayTazsazsaEAaEBaECaClaAWaEDaEEayTayTaEFaEGayTayTaEHaEIatmatmatmaEJaEJaEJaEJaEKaELaEJaEJaEJatmatmbYgatmatmaagaEpaENaEOaEOaEOaEPaEOaEQaEObYhaESbYjbYibEUbYkbEUaDfaEubEUaagaagaagaagaagaagaagaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa +aEzaadaadaadaadaadaadaadaadaadaadaadaadaagayTazsazsaEAaEBaECaClaAWaEDaEEayTayTaEFaEGayTayTaEHaEIatmatmatmaEJaEJaEJaEJaEKaELaEJaEJaEJatmatmbYgatmatmaagaEpaENaEOaEOaEOaEPaEOaEQaEObYhaESbYjbEjbEUbYkbEUaDfaEubEUaagaagaagaagaagaagaagaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaAeaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa aEWaEXaadaadaadaadaadaadaadaadaadaadaadaagayTazsazsazsaEYaAjaAkaCTaEZaFaaFbaFcaFdaFeaFfaFgaFhaFiatmaFjaFkaEJaFlaFmaFnaFoaFpaFqaFqaEJaagaEpaFraEpaagaagaEpaFsaEOaEpaEpaEpaEpaEpaEpbEUaFtaFuaFvaFwaFxbYoaFxaFzbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa -aEWaEXaadaadaadaadaadaadaadaadaadaadaagaagayTaARaASaASaFAaAUaAVaAWaEZaAmaAmaAmaFBaFCaFDaCVaFEbYsatmaFFaFGaEJaEJaEJaEJaEKaELaFqaFqaEJaagaEpaFHaEpaagaagaEpbYuaEQaEOaEpaagaagaagaagbEUbEUbEUbYvbYxbEUbEUbEUbEUbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa +aEWaEXaadaadaadaadaadaadaadaadaadaadaagaagayTaARaASaASaFAaAUaAVaAWaEZaAmaAmaAmaFBaFCaFDaCVaFEbYsatmaFFaFGaEJaEJaEJaEJaEKaELaFqaFqaEJaagaEpaFHaEpaagaagaEpbMraEQaEOaEpaagaagaagaagbEUbEUbEUbYvbYxbEUbEUbEUbEUbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa aEWaEXaadaadaadaadaadaadaadaadaadaadaagaagayTayTayTayTayTayTaFLaAWaFMaFNaFNaFNaFOaFPaFQazAaFRaFSaFTaFUaFVaFWaFXaEJaFYaFZaGaaGbaGcaEJaagaEpaFraEpaagaagaEpaEpaEpaEOaEpaagaagaagaagaagaagbEUaGdaEqbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaaa -aEWaEXaadaadaadaadaadaadaadaadaadaadaagaagayTazsazsaEAaGeaECaClaAWaAmaAmaAmaGfaGgaGhaGiayTaGjaGkatmaGlaGlaGmaGmaEJaGnaGoaGpaGqaGraEJaagaEpaFraEpaEpaagaagaagaEpbYDbgibdqbdqbdqbdqbdqaagbEUaGdaEqbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aEWaEXaadaadaadaadaadaadaadaadaadaadaagaagayTazsazsazsaGsaAjaAkaGtaAmaAmaGuaGvayTaGwaGwaGwaGxaGyaGzaGzaGzaGzaGzaEJaGAaGBaGCaGDaGDaEJaagaEpaGEaGFaEpaagaagaagaEpaEObgibdqbdVbgGbdXbdqbdqbEUaGGaGHbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aEWaEXaadaadaadaadaadaadaadaadaadaadaagaagayTaARaASaASaGIaAUaGJaGKaGLaGMaGNaGOayTaGPaGQaGRaGSaGTaGUaGVaGPaGzaagaEJaGWaGWaGCaGXaGXaEJaGYaEpaEpaGZaEpaEpaEpaagaEpaEObgibdqbeEbhibeGbeHbeIbEUaGdaDfbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aEWaadaadaadaadaadaadaadaadaadaadaadaagaagayTayTayTayTayTayTayTayTayTayTayTayTayTaGzaGzaHaaHbaHcaHdaGVaGPaGzaagaEJaGWaGWaHeaGXaGXaEJaGYaGYaGYaHfaHfaHgaEpaEpaEpaEQbgibdqbhAbhIbhCbhMbhLbiybinaDfbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aEWaEXaEXaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaGzaGzaHhaHiaGzaGzaGzaGzaagaEJaEJaHjaEJaHjaEJaEJaGYaGYaGZaHfaHkaHfbYJaEOaEQaEQbgibdqbfKbfLbfMbfNbfObEUaGdaDfbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aEWaEXaEXaEXaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaHmaHnaHnaHoaagaagaagaagaagaEJaFlaEJaFlaEJaagaGYbYMbYKaHfaGZbYNaEpaEpaEpaEpaEpbdqbdqaHraHraHraHraHrbYObYPaHraHraHraHraHraHraHraHraHraHraHraHraHraHraagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa -aEWaadaadaadaadaEXaadaEXaadaadaadaadaadaadaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaEJaEJaEJaEJaEJaagaEpaEpaEpaEpaEpaEpaEpaagaagaagaagaagaagaHraHuaHvaHwaHxaHyaHzaHAaHBaHCaHDaHEaHFaHGaHHaHxaHIaHEaHEaHJaHraagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aEWaEXaadaadaadaadaadaadaadaadaadaadaagaagayTazsazsaEAaGeaECaClaAWaAmaAmaAmaGfaGgaGhaGiayTaGjaGkatmaGlaGlaGmaGmaEJaGnaGoaGpaGqaGraEJaagaEpaFraEpaEpaagaagaagaEpbYDaEpbmAbmAbmAbmAbmAaagbEUaGdaEqbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aEWaEXaadaadaadaadaadaadaadaadaadaadaagaagayTazsazsazsaGsaAjaAkaGtaAmaAmaGuaGvayTaGwaGwaGwaGxaGyaGzaGzaGzaGzaGzaEJaGAaGBaGCaGDaGDaEJaagaEpaGEaGFaEpaagaagaagaEpaEObgibmAbdVbgGbdXbmAbmAbEUaGGaGHbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aEWaEXaadaadaadaadaadaadaadaadaadaadaagaagayTaARaASaASaGIaAUaGJaGKaGLaGMaGNaGOayTaGPaGQaGRaGSaGTaGUaGVaGPaGzaagaEJaGWaGWaGCaGXaGXaEJaGYaEpaEpaGZaEpaEpaEpaagaEpaEObgibmAbeEbhibeGbeHbeIbEUaGdaDfbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aEWaadaadaadaadaadaadaadaadaadaadaadaagaagayTayTayTayTayTayTayTayTayTayTayTayTayTaGzaGzaHaaHbaHcaHdaGVaGPaGzaagaEJaGWaGWaHeaGXaGXaEJaGYaGYaGYaHfaHfaHgaEpaEpaEpaEQbgibmAbhAbhIbhCbhMbhLbiybYlaDfbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aEWaEXaEXaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaGzaGzaHhaHiaGzaGzaGzaGzaagaEJaEJaHjaEJaHjaEJaEJaGYaGYaGZaHfaHkaHfbYJaEOaEQaEQbgibmAbfKbfLbfMbfNbfObEUaGdaDfbEUaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aEWaEXaEXaEXaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaHmbmBbmBbmCaagaagaagaagaagaEJaFlaEJaFlaEJaagaGYbYMbYKaHfaGZbYNaEpaEpaEpaEpaEpbmAbmAaHraHraHraHraHrbYObYPaHraHraHraHraHraHraHraHraHraHraHraHraHraHraagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa +aEWaadaadaadaadaEXaadaEXaadaadaadaadaadaadaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadajUajUajUajUaagaagaagaagaagaEJaEJaEJaEJaEJaagaEpaEpaEpaEpaEpaEpaEpaagaagaagaagaagaagaHraHuaHvaHwaHxaHyaHzaHAaHBaHCaHDaHEaHFaHGaHHaHxaHIaHEaHEaHJaHraagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa aEWaEXaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaHraHKaHLaHMaHNaHOaHNaHPaHQaHRaHSaHSaHSaHTaHNaHNaHNaHUaHVaHWaHraagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa aEzaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaHraHXaHYaHYaHYaHZaHYaHYaIaaIbaIcaIcaIcaIdaIeaIfaIgaIhaIiaIjaHraagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa aaaaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaadaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaHraHKaHYaHraHraIkaHYaHYaIlaImaInaIoaIcaIdaIpaIqaIraIhaIiaIsaHraagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaagaadaadaadaadaadaadaadaadaadaadaadaadaadaaa @@ -5542,95 +5540,95 @@ aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJ aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJKaJKaJKaJKaJKaJKaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaJLaJLaJLaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJKaJMaJNaJOaJPaJQaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaJRaJSaJTaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJUaJUaJUaJUaJUaJVaJWaJWaJKabSaJPaJPaJYaJZaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaKaaKbaKcaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJUaKdaKeaKfaKgaKhaKiaKjacqaKlaKmaKnaKoaKpaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaKaaKbaKcaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJUaKdaKeaKfaKgaKhaKiaKjacqagBaKmaKnaKoaKpaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaKqaKraKsaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJUaKtaKuaKvaJUaKwaKxaKyaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaKzaKzaKzaJLaJLaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJUaKAaKBaKCaKDaKEaKxaKFaJWaJJaJJaJKaehaeiaeyaeYaejaekafyafXaeZafxagtagAaJKaKHaKIagBaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaJLaJLaKKaKLaKLaKMaKNaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaJWaJWaJWaJWaJUaJUaJUaJUaKOaKxaJWaJWaJJaJJaJKagLaJPaJPaKoagMaJPaJPaJPaJPaKoaJPahaaJKagNaKQaKRaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaKzaKzaKzaJLaJLaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJUaKAaKBaKCaKDaKEaKxaKFaJWaJJaJJaJKaehaeiaeyaeYaejaekafyafXaeZafxagtagAaJKaKHaKIagNaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaJLaJLaKKaKLaKLaKMaKNaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaJWaJWaJWaJWaJUaJUaJUaJUaKOaKxaJWaJWaJJaJJaJKagLaJPaJPaKoagMaJPaJPaJPaJPaKoaJPahaaJKahlaKQaKRaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaKSaKTaKUaKUaKUaKUaKVaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaKWaKXaKYaKZaLaaLbahbaJWaJWaLdaJWaJJaJJaJJaJKahcaKoahnahqahdahmahzahAahxahyahqaiuaJKaLfaLgaKHaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaLhaJLaLiaKLaKLaKLaLjaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaLkaLlaLmaLnaLoaLpaLqaLraLsaLtaJWaJJaJJaJJaJKakSaJPahaaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaLgaKHalyaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaLxaJLaLyaLzaLAaKLaLBaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaLkaLCaLmaLDaJWaJJaJJaJJaLEaLFaJWaJJaJJaJJaJKalHahqalIaJKaLGaLvaLvaLvaLvaLHaLvaLvaLwamhaLgaLJaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaLhaJLaKLaKLaJLaLKaLLaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaLkaLCaLmaLNaJWaJJaJJaJJamtaLdaJWaJJaJJaJJaJKaJKaJKamEaJKaLvaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaLhaJLaLQaLQaJLaLRaLSaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaLkaLCaLmaLDaJWaJJaJJaJJaoiaLdaLUaLUaLUaLUaLVaLvaLvaLvaLvaLWaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaLxaJLaJLaJLaJLaJLaJLaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaJWaJWaJWaJWaJWaJWaoIaLXaLYaLZaJWaJJaJJaJJaplaMbaLrapqaLraLraMcaMdaMdaMdaMeaMfaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaLxaJLaJLaJLaJLaJLaJLaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaJWaJWaJWaJWaJWaJWaoIaLXaLYaLZaJWaJJaJJaJJapkaMbaLrapqaLraLraMcaMdaMdaMdaMeaMfaJKaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaLhaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaMgaMhaLUaLUaMiaMjaMkaMlaMmaLmaMnaJWaJJaJJaJJaJJaJJaJJaJJaJJaJJaJKaMoaMoaMpaMqaLvaJKaJKaJKaJKaJKaJKaJKaJKaMraMraMraMraMraMraMraMraMraMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaLhaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJapZaMtaMtaMvaMvaMvaMvaMxaMyaMzaMAaMBaJWaJJaJJaJJaJJaJJaJJaJJaJJaJJaJKaKGaKGaLuaMqaLvaLvaMCaMDaMEaMFaMEaMEaMEaMGaMGaMGaMGaMGaMHaMGaMIauhaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaLhaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJapraMtaMtaMvaMvaMvaMvaMxaMyaMzaMAaMBaJWaJJaJJaJJaJJaJJaJJaJJaJJaJJaJKaKGaKGaLuaMqaLvaLvaMCaMDaMEaMFaMEaMEaMEaMGaMGaMGaMGaMGaMHaMGaMIauhaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaMKaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaMLaMhaujaMMaLmaLmaLmaLmaMNaLmaLmaLmaMOaJWaJJaJJaMPaMPaMPaJJaJJaJJaJJaJKaKGaKGaLuaMQaMdaMRaMSaMdaMdaMdaMdaMdaMdaMUaMUaMUaMVaMWaMWaMWaMWaMXaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaMYaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWavfaMMaMMaLmaLmaLmaLmaLmaNaaNbaNcaNdaMnaJWaJJaJJaMPaNeaMPaJJaJJaJJaJJaJKaKGaKGaKGaxfaNfaNgaNhaNiaNjaJKaJKaJKaJKaMraNkaNlaNmaNnaNoaxhaMWaMXaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaMYaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWapZaMMaMMaLmaLmaLmaLmaLmaNaaNbaNcaNdaMnaJWaJJaJJaMPaNeaMPaJJaJJaJJaJJaJKaKGaKGaKGaxfaNfaNgaNhaNiaNjaJKaJKaJKaJKaMrauRaNlaNmaNnaNoaxhaMWaMXaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJLaJLaJLaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaJWaJWaNqaNraNsaxVaNtaJWaNuaMPaMPaNvaNwaMPaMPaMPaMPaNxaMPaMPaMPaMPaMPaMPaMPaMPaMPaMPaMPaynaACaMPaMPaMPaNAaNAaNAaMraNBaNCaNDaNEaNFaNGaMWaMXaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaNHaNIaNJaNJaNKaJWaNLaMPaNMaNNaNOaNPaNQaNRaNSaNTaNUaNVaNWaNRaNXaNYaNZaOaaNZaObaOcaOdaOeaOfaOgaMPaJJaNAaNAaMraOzaOiaOjaOiaOBaERaMWaMXaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaJWaJWaJWaJWaJWaJWaOmaMPaOnaOoaOpaOqaOraOsaOsaOsaOsaOsaOsaOtaOsaOsaOsaOsaOsaOsaOuaOvaOwaOxaOyaMPaJJaJJaNAaMraOzaOiaOAaOiaOBaOlaMWaMXaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaOCaFIaOEaOEaFJaFKaOGaMPaOHaOIaOJaOKaOKaOKaOKaOKaOKaOKaOKaOKaOKaOKaOKaOKaOKaOKaOKaOKaOLaOMaOyaMPaJJaJJaJJaMraONaOiaOOaOiaOBaOlaMWaMXaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaOPaOQaOQaOQaOQaOQaOQaMPaORaOSaOTaOUaOVaOVaOVaOVaOVaOVaOVaOVaOVaOVaOVaOVaOVaOVaOVaOWaOXaOYaOyaMPaJJaJJaJJaMraJXaPaaPbaPcaKPaERaMWaMXaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaLcaOQaPeaPeaOQaOQaOQaMPaOHaOSaOTaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaPiaPjaMPaJJaJJaJJaMraPkaPlaPmaMWaPnaLeaMWaMXaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaJWaJWaJWaJWaPoaOQaPeaPeaOQaOQaOQaMPaPpaOSaOTaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaPqaMPaMraMraMraMraMraMraPmaMWaLIaPsaMWaMXaMraJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaLcaOQaPeaPeaOQaOQaOQaMPaOHaOSaOTaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaPiaPjaMPaJJaJJaJJaMraPkaPlaPmaMWaPnaOlaMWaMXaMraJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaJWaJWaJWaJWaPoaOQaPeaPeaOQaOQaOQaMPaPpaOSaOTaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaPqaMPaMraMraMraMraMraMraPmaMWaLIaKlaMWaMXaMraJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaPtaPuaLOaPvaPwaOQaPxaPyaOQaPzaPzaMPaOHaOSaOTaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaPAaPBaPCaPCaPDaPEaPCaLTaPGaPHaMWaMWaMWaMXaMraJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaPJaPKaPJaPLaPwaPMaPNaPxaPOaPxaPxaMPaPPaOSaOTaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaPQaMPaMraMraMraMraMraMraPRaPSaMGaMGaMGaMuaMraJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaPJaPKaPJaPLaPwaPMaPNaPxaPOaPxaPxaMPaPPaOSaOTaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaPQaMPaMraMraMraMraMraMraPRaPSaMGaMGaMGaLeaMraJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaPKaPUaPVaJWaPwaOQaPWaPXaPYaPZbZVaQaaQbaOSaOTaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaOyaMPaQcaQdaQeaQfaQgaMraQhaQiaMTaMTaMTaMTaMTaMTaMTaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaJWaJWaJWaJWaQjaOQaQkaQlaQmaQnaQoaQpaQqaQraQsaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaQtaMPaQuaQvaQvaQwaQxaMraQyaMXaQzaQAaMTaQBaQCaQDaMTaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaJWaJWaJWaJWaQjaOQaQkaQlaQmaQnaQoaQpaQqaQraQsaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaQtaMPaQuaQvaQvaQwaQxaMraQyaMXaQzaQAaMTaNkaQCaQDaMTaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJWaQjaOQaOQaOQaOQaOQaQEaMPaQFaOYaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaQHaMPaQuaQvaQvaQIaQxaMraQJaOkaQKaQxaMTaQvaQvaQLaMTaMTaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaQMaQNaQMaQOaQPaQPaSraPraMPaOHaOYaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaOyaMPaRbaQSaQTaQUaQVaMraQWaMXaQKaRgaMTaQvaRhaQvaQvaMTaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaQMaQMaQMaQMaQMaQYaQZaRaaRqaRcaRdaReaRfaMPaOHaOYaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaRiaRjaMraMraRCaMraMraMraRlaRmaRnaRoaRpaQvaRUaQvaRLaMTaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaQMaQNaQMaQOaQPaQPaSraOZaMPaOHaOYaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaOyaMPaPraQSaQTaQUaQVaMraQWaMXaQKaRgaMTaQvaRhaQvaQvaMTaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaQMaQMaQMaQMaQMaQYaQZaRaaRqaRcaRdaReaRfaMPaOHaOYaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOYaRiaRjaMraMraRCaMraMraMraRlaRmaRnaRoaRpaQvaRUaQvaQBaMTaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaRXaRcaRdaRtaRdaRuaRvaRwaRxaRyaRzaQPaSraRjaOHaOYaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaRAaRBaShaRDaRDaREaRFaRFaSGaRHaMXaMTaMTaMTaMTaMTaMTaMTaMTaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaRIaSPaRxaSPaRJaRKaSTaRMaSraSraRNaRxaRxaROaRPaRQaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaRRaRSaMPaMWaMWaMWaMWaMWaMraRTaMXaMTaTAaRVaRWaUmaMTaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaUuaJJaJJaJJaJJaJJaJJaJJaUvaUwaJJaJJaJJaMPaPpaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaRRaQHaMPaScaMraMraMraMraMraRTaMXaMTaMTaMTaUxaMTaMTaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaRIaSPaRxaSPaRJaRKaSTaRMaSraSraRNaRxaRxaROaRPaRQaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaRRaRSaMPaMWaMWaMWaMWaMWaMraRTaMXaMTaRbaRVaRWaUmaMTaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaUuaJJaJJaJJaJJaJJaJJaJJaOZaUwaJJaJJaJJaMPaPpaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaRRaQHaMPaScaMraMraMraMraMraRTaMXaMTaMTaMTaUxaMTaMTaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaUuaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaMPaOnaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaRRaSeaMPaVZaMraSfaPIaMWaMWaRTaMXaWAaMWaMWaMWaMWaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaQMaQMaQMaQMaJJaQMaRYaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaMPaSiaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaSjaOyaMPaQXaMraSkaSlaSmaSnaSoaSpaMTaMTaMTaMTaPIaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaJJaJJaJJaJJaGmaJJaJJaJJaQMaQMaQMaQMaQMaQMaQMaQMaQMaYEaXRaQMaQMaQMaRYaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaMPaMPaMPaSsaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOsaStaMPaQxaMraSkaSuaPHaSvaSwaSxaMTaSyaSzaMTaSAaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaZkaJJaYYaJJaGmaJJaJJaJJaQMaSDaSXaSXaSXaSFaSFaSraSraSrbaubaJbaRaSHaSIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaMPaNeaSJaSKaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaSLaOyaMPaQxaMraSMaSuaMWaSNaSOaQxaMTaSQaSRaMTaSSaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbbuaSUaSUaSVaGmaJJaJJaJJaQMbczaSXaJJaJJaJJaJJaJJaJJaJJaJJaRYaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaMPaMPaMPaSYaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaSZaQHaMPbdfaMraTbaSuaMWaTcaTdbdEaMTaTfaTgaMTaMWaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaJJaJJaJJaJJaGmaJJaJJaJJaQMaQMaQMaQMaQMaQMaQMaQMaQMaYEaTAaQMaQMaQMaRYaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaMPaMPaMPaSsaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaOsaStaMPaQxaMraSkaSuaPHaSvaSwaSxaMTaSyaSzaMTaSAaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaUvaJJaYYaJJaGmaJJaJJaJJaQMaSDaSXaSXaSXaSFaSFaSraSraSrbaubaJbaRaSHaSIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaMPaNeaSJaSKaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaSLaOyaMPaQxaMraSMaSuaMWaSNaSOaQxaMTaSQaSRaMTaSSaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaUZaSUaSUaSVaGmaJJaJJaJJaQMaVYaSXaJJaJJaJJaJJaJJaJJaJJaJJaRYaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaMPaMPaMPaSYaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaSZaQHaMPaXKaMraTbaSuaMWaTcaTdbdEaMTaTfaTgaMTaMWaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaTiaSUaTjaGmaJJaJJaJJaQMaQMaSFaJJaJJaJJaJJaJJaJJaJJaJJaTkaTlaTlaTmaTmaTmaTmaTmaTmaMPaJJaJJaJJaJJaJJaJJaMPaOHaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaSZaOyaMPaQxaMraSkaSuaMWaTnaQiaMWaMTaTfaTfaMTaMWaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaToaTpaSUaTraGmaJJaJJaJJaJJaQMbehaJJaJJaJJaTsaTsaTsaTsaTtaTuaTvaTwaTxaTxaTxaTxaTxaTxaMPaMPaMPaJJaJJaJJaJJaMPaOHaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaSZaOyaMPbelaTzbeiaTBaRFaTCaTDaMWaMTaMTaMTaMTaMWaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaTEaTFaTGaGmaJJaJJaJJaJJaQMaSEaJJaJJaJJaTsaTHaTIaTJaTKaTLaTMaTNaTxaTOaTOaTOaTOaTxaTPaTQaTRaMPaMPaMPaMPaMPaOHaSbaQGaTSaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTUaOXaSZaRiaMPaMraMraMraMraMraMraTVaMWaWAaMWaMWaMWaMWaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaToaTpaSUaXPaGmaJJaJJaJJaJJaQMbehaJJaJJaJJaTsaTsaTsaTsaTtaTuaTvaTwaTxaTxaTxaTxaTxaTxaMPaMPaMPaJJaJJaJJaJJaMPaOHaSbaQGaPfaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPgaPhaOXaSZaOyaMPbelaTzbeiaTBaRFaTCaTDaMWaMTaMTaMTaMTaMWaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaTEaTFaXRaGmaJJaJJaJJaJJaQMaSEaJJaJJaJJaTsaTHaTIaTJaTKaTLaTMaTNaTxaTOaTOaTOaTOaTxaTPaTQaTRaMPaMPaMPaMPaMPaOHaSbaQGaTSaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTTaTUaOXaSZaRiaMPaMraMraMraMraMraMraTVaMWaWAaMWaMWaMWaMWaMTaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaSUaTqaTjaQMaQMaQMaQMaQMaQMaSXaQMaJJaJJaTsaTWaTXaTYaTsaTZaTvaUaaTxaTOaTOaTOaTOaTOaOsaUbaUcaUcaUdaUeaUfaUgaUhaSbaUiaUjaUjaUjaUjaUjaUjaUjaUjaUjaUjaUjaUjaUjaUjaUjaUjaUjaUkaSZaUlbfJaUnaUoaUpaUqaMWbgVaTVaMWaMTaMTaMTaMTaMTaMTaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbiBaSUaSUaUtaQMbjGbjjbjzbkEaSXaSXaQMaJJaJJaTsaUyaUzaUAaUBaUCaUDaUEaTxaTOaTOaTOaTOaTOaOsaOsaOsaOsaOsaOsaOsaOoaUFaUGaUHaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUJaUKaULaUMbkFaUOaUOaUPaUOaUObldaURaMWaMraJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaSUaSUaUtaQMbjGbjjbjzbkEaSXaSXaQMaJJaJJaTsaUyaUzaUAaUBaUCaUDaUEaTxaTOaTOaTOaTOaTOaOsaOsaOsaOsaOsaOsaOsaOoaUFaUGaUHaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUIaUJaUKaULaUMbkFaUOaUOaUPaUOaUObldaURaMWaMraJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaUSaSUaUTaUUaUVaSEbljaUVaSEaUWaQMaJJaJJaUXaUXaUXaUYaUYblOaVaaVbaTxaTOaTOaTOaTOaTxaVcaVdaVeaVfaVfaVfaVfaVgaVhaSjaViaVjaVkaVlaVfaVfaVmaVfaVfaVeaVfaVnaVfaVkaVfaVfaVgaVoaVpaVfaVqaMPaMraMraMraMraMraMraVraMWaMraJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaSUaSUaVsaVtaVtaVtaVtaVtaUXaUXaUXaUXaUXaUXaUXaUXaUYaVuaVvaVaaVwaTxaTxaTxaTxaTxaTxaVfaVxaTRaMPaMPaVyaVyaVyaVzaVAaVBaVyaVyaVCaVCaVCaVCaVCaVCaVCaVCaVDaVEaVEaVEaVEaVEaVFaVEaVGaVEaVEaVHaVIaMWaMWbpsaMraVraMWaMraJJaJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaVKaSUaSUbpwaVtaVLaVMaVNaVtaVOaVPaVQaVRaVSaVQaVPaVQaUYaVTaVUaVaaVVaVWaVWaVWaVWaVXaTmaMPaMPaMPbqUbqWaVyaWaaWbaWcaWdaWeaWfaWgaWhaWiaWjaWkaWlaWmaWnaVCaNeaVEaWoaWpaWqaWraWsaWtaWuaWvaVEaWwaWxaMWaPIaMWaWyaVraMWaMraJJaJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaVKaSUaSUbpwaVtaVLaVMaVNaVtaVOaVPaVQaVRaVSaVQaVPaVQaUYaVTaVUaVaaVVaVWaVWaVWaVWaVXaTmaMPaMPaMPbbubczaVyaWaaWbaWcaWdaWeaWfaWgaWhaWiaWjaWkaWlaWmaWnaVCaNeaVEaWoaWpaWqaWraWsaWtaWuaWvaVEaWwaWxaMWaPIaMWaWyaVraMWaMraJJaJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaWzaSUaSUaTjaVtaWBaWCaWDaVtaWEaWFaWFaWGaWHaWFaWFaWIaUYaWJaVUaVaaVaaVaaVaaVaaVaaWKaWLaQMaJJaJJaJJaJJaVyaWMaWNaWOaWPaWQaWRaWSaWTaWUaWVaWVaWUaWWaWXaVCaMPaVEaWYaWZaXaaXaaXbaXaaXaaXcaVEaXdaWxaMWaMWaMWaMraVraMWaMraJJaJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaWzaTqaUSaTjaVtaXeaXfaXgaVtaXhaXiaXjaXkaXlaXmaXnaXoaUYaXpaXqaXraXsaXtaXuaXvaVaaXwaXxaXyaJJaJJaJJaJJaVyaWMaXzaXAaXBaXCaXDaXEaWTaXFaXGaXHaXIaWWaXJaVCbFbaVEaXLaXaaXaaXaaXMaXNaXNaXOaVEaXPaWxaPHaMWaXQaMraVraMWaMraJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaWzaTqaUSaTjaVtaXeaXfaXgaVtaXhaXiaXjaXkaXlaXmaXnaXoaUYaXpaXqaXraXsaXtaXuaXvaVaaXwaXxaXyaJJaJJaJJaJJaVyaWMaXzaXAaXBaXCaXDaXEaWTaXFaXGaXHaXIaWWaXJaVCblraVEaXLaXaaXaaXaaXMaXNaXNaXOaVEbqUaWxaPHaMWaXQaMraVraMWaMraJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaSUaSUbFwaVtaXSaXTaXUaXVaXWaXXaXYaXZaXZaYaaYbaYcaYdaYeaYfaYgaYhaYiaYiaYjaVaaYkaYlaQMaJJaJJaJJaJJaVyaYmaWRaYnaYoaYpaXDaYqaWhaYraXGaXGaXIaWWaYsaVCaYtaVEaYuaYvaYvaYwaYxaYyaYzaYAaVEaXdaYBaPHaPHaYCaYCbKWbKZaYCaYCaJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaYFaSUaSUaTjaVtaYGaYHaYIaYJaYKaYLaYMaYNaYOaYaaYPaYQaYRaYSaYTaYUaYVaYWaYiaYXaVabLcaYZaQMaJJaJJaJJaJJaVyaZaaZbaZcaWRaZdaWRaZeaWTaZfaZgaZgaWUaZhaZiaVCaYtaVEaVEaVEaVEaVEaVEaVEaZjaVEaVEbNDaZlaMWaMWaYCaZmaZnaZoaZpaYCaJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaZqaTFaTGaVtaZraYHaZsaZtaZuaZvaZwaYNaYOaYaaYPaZxaZyaZzaZAaZBaZCaZBaZDaZEaVaaZFaZGaQMaJJaJJaJJaJJaVyaZaaZHaZIaZJaZKaZLaZMaZNaZOaZPaZQaZRaZSaZTaVCbPIaZUaZUaZVaYtaYtaYtaYtaYtaZWaYCaYCaYCaYCaYCaYCaZXaZYaZZbaaaYCaJJaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbabaUSaSUaTjaVtbacbadbaeaVtbafbagbahbaibajbakaYPbalaUYbambanbaobapbaqbarbasaVabatbQnaQMbavbavbavbavaVyaZabawbaxbaybazbaAbaBaVCbaCbaDbaEbaFbaGbaHaVCahvahvahvahvaYCaYCaYCaYCaYCbaIbXXaYCbaKbaLbaMbaNbaObaPaZZbaQaYCaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbXYaSUaTFbaSaVtbaTbaUbaVaVtbaWbaXbaYbaZbaZbaZbbabbbaUYbbcbanbbdbbebbfbarbbgaVabbhbavbavbavbbibavbavbavbavbavbbjbbkbblbavbavbbmbbnbbobbpbbmbbmbbmbbmbbqaisbbrahvaJJaJJaJJaJJaYCaZUaZVaYCbbsbbtbYaaYtbbvbbwbbxbaQaYCaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbabaUSaSUaTjaVtbacbadbaeaVtbafbagbahbaibajbakaYPbalaUYbambanbdybapbaqbarbasaVabatbQnaQMbavbavbavbavaVyaZabawbaxbaybazbaAbaBaVCbaCbaDbaEbaFbaGbaHaVCahvahvahvahvaYCaYCaYCaYCaYCbaIbtqaYCbaKbaLbmzbaNbaObaPaZZbaQaYCaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbtraSUaTFbaSaVtbaTbaUbaVaVtbaWbaXbaYbaZbaZbaZbbabbbaUYbbcbanbbdbbebbfbarbbgaVabbhbavbavbavbbibavbavbavbavbavbbjbbkbblbavbavbbmbbnbbobbpbbmbbmbbmbbmbbqaisbbrahvaJJaJJaJJaJJaYCaZUaZVaYCbbsbbtaYtaYtbbvbbwbbxbaQaYCaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaSUaSUbbyaVtbbzbbAbbBaVtbbCbbDbbEbbFbbGbbHbbEbbIaUYbbJbbKbbLbbMbbNbbObbPaVabbQbbRbbTbbVbbUbbSbbWbbXbbYbbZbcabcbbccbcdbcebbmbcfbcgbchbcibcjbckbclbcmbcnbcoahvaJJaJJaJJaJJaYCaZUbaIbcpbbsbcqbcrbcsbctbbwaZZbaQaYCaJJaJJaJJaJJaJJaJJaJJaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaSgaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbcuaSUaSUbYeaVtbcwbcxbcyaVtaUXbYfaUXaUXaUXaUXaUXaUXaUYbcAbcBbcCbcDbcEbcFbcGaVabcHbcIbcJbcKbcLbcMbcPbcObcNbcQbcRbcSbcTbcUbcVbcWbcXbcYbcZbdabcgbdbbbmajRbdcbddahvaJJaJJaJJaJJaYCbdebYnaYCbbsbcqbdgbdhbdhbdiaZZbaQaYCaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaSUaSUbcvaVtaVtaVtaVtaVtaGmbdjbdkaGmaJJaJJaJJaJJaUYbdlbdlbdmbdnbdmbdlbdlbdlbdobdpbavbavbdtbdvbdWbdvbdtbdrbdsbeFbdYbdZbeJbbobdwbdxbdybdzbdxbdAbbmahvahvahvahvaYCaYCaYCaYCaYCbYraZZaYCbdBbdCbdDaZZbbxaZZaZZbaQaYCaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaSUaSUbYtaGmbdFbdGbdHbdIbdJbdKbdLaGmaJJaJJaJJaJJaJJbdlbdMbdNbdObdPbdQbdRbdlbdSbdTbavbYwbdtbeKbeLbeMbdtbdtbdtbfgbdubcUbfhbbmbeabebbecbedbeebefbbmbYzbYybejbejbejbekbejbdebdebdebYAaYCbembenbeoaZZbepbeqberbesaYCaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaTqaUSaSUaGmbetaGmaGmaGmaGmbdjbeuaGmaJJaJJaJJaJJaJJbdlbevbewbexbeybezbeAbdlbeBbeCbavbeDbdtbfibflbfobfjbfkbdtbfRbfpbcUbfSbbmbbmbbobbobbobbobbmbbmbeNbeNbeNbeNbeNbeNaYCaYCaYCaYCaYCaYCaYCaYCbeObePbYCbeRbYBaYCaYCaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbeTaSUaSUbeUaGmaGmaGmaJJaJJaGmbeVbeWaGmaJJaJJaJJaJJaJJbdlbeXbeYbeZbfabfbbfcbdlbfdbfebavbffbdtbgjbgtbgybgrbgsbgEbfmbfnbgDbgFbfqbfrbfsbfsbfsbfsbfsbftbeNbfubfvbfwbfwbeNaJJaJJaJJaJJaJJaJJaJJbYEbYFbKZbYEaYCaYCaYCaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbfybYGbfAbfAaGmaJJaJJaJJaJJaGmbdjbeuaGmaJJaJJaJJaJJaJJbdlbfBbfCbfDbfEbfFbfGbdlbfHbfIbavbYHbdtbgHbgKbhbbgIbgJbdtbfPbfQbhdbhebfTbfTbfTbfTbfUbfUbfVbfWbfXbfYbfZbgabgbbeNaJJaJJaJJaJJaJJaJJaJJbYEbgcaZZbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbcuaSUaSUbwkaVtbcwbcxbcyaVtaUXbYfaUXaUXaUXaUXaUXaUXaUYbcAbcBbcCbcDbcEbcFbcGaVabcHbcIbcJbcKbcLbcMbcPbcObcNbcQbcRbiObcTbcUbcVbcWbcXbcYbcZbdabcgbdbbbmajRbdcbddahvaJJaJJaJJaJJaYCbdebYnaYCbbsbcqbdgbdhbdhbdiaZZbaQaYCaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaSUaSUbcvaVtaVtaVtaVtaVtaGmbdjbdkaGmaJJaJJaJJaJJaUYbdlbdlbdmbdnbdmbdlbdlbdlbdobdpbavbavbdtbdvbdWbdvbdtbdrbdsbeFbdYbdZbeJbbobeabdxbefbedbdxbecbbmahvahvahvahvaYCaYCaYCaYCaYCbYraZZaYCbdBbdCbdDaZZbbxaZZaZZbaQaYCaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaSUaSUbYtaGmbdFbdGbdHbdIbdJbdKbdLaGmaJJaJJaJJaJJaJJbdlbdMbdNbdObdPbdQbdRbdlbdSbdTbavbOVbdtbeKbeLbeMbdtbdtbdtbfgbdubcUbfhbbmbmkbebbQObWebeebCVbbmbXXbYybejbejbejbekbejbdebdebdebYAaYCbembenbeoaZZbepbeqberbesaYCaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaThaTqaUSaSUaGmbetaGmaGmaGmaGmbdjbeuaGmaJJaJJaJJaJJaJJbdlbevbewbexbeybezbeAbdlbeBbeCbavbeDbdtbfibflbfobfjbfkbdtbfRbfpbcUbfSbbmbbmbbobbobbobbobbmbbmbeNbeNbeNbeNbeNbeNaYCaYCaYCaYCaYCaYCaYCaYCbeObePbYCbeRbXYaYCaYCaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbeTaSUaSUbeUaGmaGmaGmaJJaJJaGmbeVbeWaGmaJJaJJaJJaJJaJJbdlbeXbeYbeZbfabfbbfcbdlbfdbfebavbffbdtbgjbgtbgybgrbgsbgEbfmbfnbgDbgFbfqbfrbYSbfsbYTbfsbfsbftbeNbfubfvbfwbfwbeNaJJaJJaJJaJJaJJaJJaJJbYEbYFbKZbYEaYCaYCaYCaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbfybYebfAbfAaGmaJJaJJaJJaJJaGmbdjbeuaGmaJJaJJaJJaJJaJJbdlbfBbfCbfDbfEbfFbfGbdlbfHbfIbavbYibdtbgHbgKbhbbgIbgJbdtbfPbfQbhdbhebfTbfTbfTbfTbfUbfUbfVbfWbfXbfYbfZbgabgbbeNaJJaJJaJJaJJaJJaJJaJJbYEbgcaZZbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaGmaGmaGmaGmaGmaJJaJJaJJaJJaGmbdjbeubgdbgdbgdbgdbgdbgdbdlbdlbdlbdlbdlbdlbdlbdlbgebgfbggbggbggbggbggbggbggbggbggbggbghbhjbhkbggbggbggbggbggbggbggbavbeNbgkbfZbgabgabeNaJJaJJaJJaJJaJJaJJaJJbYEbgcbYEbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbdjbeubgdbglbgmbgnbgobgpbgdaJJbggbgqbhlbhzbhHbgubgvbgwbgxbiDbgzbgAbgBbgCbjfbjhbjTbkobjPbhcbZvbZwbgLbgMbgNbgObgPbggaJJbeNbgQbfZbgRbgSbeNaJJaJJaJJaJJaJJaJJaJJbYEbgcbYEbgTaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbgUbYIbgdbgWbgXbgYbgYbgZbgdaJJbggbhabZxbhGbhGbZzbZybhfbhgbhhbifbhhbhhbhhbhhbhgbhgbhhbZAbhhbZBbhhbigbhmbhnbhmbhobggaJJbeNbeNbhpbhqbeNbeNaJJaJJaJJaJJaJJaJJaJJbYEbgcbYEbgTaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmbhrbhsbYLbhubhvbhwbgYbhxbgdaJJbggbhybZCbjEbiCbZDbhBbhDbhEbhFbhGbhGbhGbhGbhGbZEbZGbhGbZFbhcbhcbhcbhZbhNbhNbhJbhObggaJJaJJbeNbeNbeNbeNaJJaJJaJJaJJaJJaJJaJJaJJbYEbgcbYEbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaGmaGmaGmbgdbhPbhQbhRbhSbhTbgdaJJbggbhUbhVbhWbhXbhXbhXbhYbhZbiabibbibbicbicbicbidbhnbhcbhcbhcbhcbhcbhZbihbiibijbikbggaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbgcbilbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJJaJJaJIaJJaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbgdbgdbgdbgdbgdbgdbgdaJJbggbimbhVbZHbiobipbiqbirbhZbisbjwbitbiubiubiubiubiibibbibbibbibbicbivbiwbixbZIbizbggaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbiAbcrbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbggbiCbZJbiEbiFbiGbiHbiIbhZbisbhcbiJbiKbiKbiKbiKbiKbiKbiLbiMbiNbihbiObjgbiQbiRbiSbggaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbiAbcrbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJJaJJaJIaJJaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbgdbgdbgdbgdbgdbgdbgdaJJbggbimbhVbZHbiobipbiqbirbhZbisbjwbitbiubiubiubiubiibibbibbibbibbicbivbiwbixbZIbizbggaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbiAbYmbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbggbiCbZJbiEbiFbiGbiHbiIbhZbisbhcbiJbiKbiKbiKbiKbiKbiKbiLbiMbiNbihblvbjgbiQbiRbiSbggaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbiAbcrbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbggbiTbiUbiIbiVbiWbiEbiPbiXbiYbiZbjabjbbjbbjbbjbbjbbjbbjcbjdbjebhmbZKbjgbjgbjibiSbggaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbYQbjkbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbggbiTbjlbjmbjnbjobjpbjpbjqbjrbjsbjabjbbjbbjbbjbbjbbjbbjtbigbjubjvbhZbjwbiIbjxbjybggaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbYRaZZbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJJaJJaJJaJJaJJaJJaJJbggbiTbiUbiIbiVbiWbjBbiPbjCbjDbjsbjabjbbjbbjbbjbbjbbjbbjcbhZbjubjvbhZbhcbiIbjEbjFbggaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbYSbjHbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJJaJJaJJaJJaJJaJJaJJbggbiTbiUbiIbiVbiWbjBbiPbjCbjDbjsbjabjbbjbbjbbjbbjbbjbbjcbhZbjubjvbhZbhcbiIbjEbjFbggaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbYqbjHbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJJaJJaJJaJJaJJaJJaJJbggbjIbjJbjBbjKbjLbjMbiIbhZbjNbiJbjbbjbbjbbjbbjbbjbbjbbjcbhZbjubjObZLbjQbjQbjRbjSbggaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbYEbYEbgcbYEaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJJaJJaJJaJJaJJaJJaJJbggbimbZMbZNbjUbjVbjWbjXbhZbjYbjZbkabkabkabkabkabkabkabkbbhZbjubhcbkcbjQbkdbkebjSbggaJJaJJaJJaJJaJJaJJbYEbYEbYEbYEbYEbYEbYEbYEbkfbYEbgcbYEaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJJaJJaJJaJJaJJaJJaJJbggbhabiubkgbkhbkhbkhbhYbiebhfbhhbhhbhhbhhbhhbhhbhhbhhbhhbkibkjbkkbklbkmbknbZObkpbggaJJaJJaJJaJJaJJaJJbYEbkqaZZbkraZZaZZaZZbYEbksbYEbgcbYEaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJJaJJaJJaJJaJJaJJaJJbggbktbkubjxbkvbkvbkvbkwbhcbjYbhcbkxbiZbiZbiZbiZbiZbiZbZtbhKbkzbkAbkBbkCbkBbkubkDbggaJJaJJaJJaJJaJJaJJbYEaZZbYUbeqbYTbkGaZZbYEbkHbYEbgcbYEaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJJaJJaJJaJJaJJaJJaJJbggbktbkubjxbkvbkvbkvbkwbhcbjYbhcbkxbiZbiZbiZbiZbiZbiZbZtbhKbkzbkAbkBbkCbkBbkubkDbggaJJaJJaJJaJJaJJaJJbYEaZZbYUbeqbYubkGaZZbYEbkHbYEbgcbYEaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJJaJJaJJaJJaJJbggbkIbhcbhcbhcbhcbhcbhcbhcbjYbhcbkJbkKbkLbkMbkNbkObkPbkQbkRbkSbYVbYVbkTbYVbYVbYVbYVbYEbYEbYEbYEbYEbYEbYEbkUbkVbkWbkWbkXbkYbYEbYEbYEbgcbYEaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJJaJJaJJaJJaJJbggbkZbhcbhcbhcbhcbhcbhcbhcblablbbkJbkKbkLbkMbkNbkObkPbkQbkRblcbYVbYWbleblfblgblgblhbliblgbYXblkbllblmblmblnbloblpblqblrblsblmblmblmbltbYEaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJJaJJaJJaJJaJJbggblublvblwblxblyblzblAblBblCblDblEbkKbkLbkMblFbkObkPbkQblGblHbYVaZZblIaZZaZZaZZaZZaZZblJblKaZZaZZbYEbYEbYEbYEbYEbYEbYEbYEbYEbYEbYEbYEbYEaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJJaJJaJJaJJaJJbggbkZbhcbhcbhcbhcbhcbhcbhcblablbbkJbkKbkLbkMbkNbkObkPbkQbkRblcbYVbYwbleblfblgblgblhbliblgbYXblkbllblmblmblnbloblpblqbYzblsblmblmblmbltbYEaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJJaJJaJJaJJaJJbggblublwbmiblxblyblzblAblBblCblDblEbkKbkLbkMblFbkObkPbkQblGblHbYVaZZblIaZZaZZaZZaZZaZZblJblKaZZaZZbYEbYEbYEbYEbYEbYEbYEbYEbYEbYEbYEbYEbYEaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJJaJJaJJbggbggbggbggbggbggbggbggbggbggbggbggbggbggbggbggbggbggbggbggbggbYEaZZblLbYEbYEbYEbYEbYZblNbYYbmabmabmaaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEaZZblQbYEaJJaJJaJJbmablRblSblTblUbmaaJJaJJaJJblVblVblVblVblVblVblVblVaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEaZZbZabYEaJJaJJaJJbmablWblXblYblZbmabmbbmbbmbblVbmcbmdbmebmfbmgbmhblVaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEaZZblQbmbbmbbmbbmbbmbbmbbmbbmibmjbmbbmkbmlbmmblVbmnbmobmpbmobmqbmrblVaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEaZZbZbbmtbmubmvbmwbmbbmxbmybmzbmAbmBbmCbmCbmDblVbmEbmFbmGbmHbmIbmJblVaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbmKbmLbmMbmNbmObmPbmQbmRbmPbmSbmTbmUbmVbmWbmXbmYbmZbnabnbbncbndbnebnebnebneaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbnfbngbmjbnhbnibnjbmbbnkbmCbnlbmCbnmbnnbnobnpblVbnqbnrbnsbmGbntbnubnvbnwbneaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbYEbYEbmbbmbbmbbmbbmbbnxbnybnzbnAbnebnebnebnebnebnBbnCbnDbnEbnFbnebnebnGbnebneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbnHbnIbnIbnIbnIbnIbnIbnIbnIbnIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbmbbnJbnJbnKbnJbnebnLbnLbnLbnMbnNbnObnPbnQbnRbnSbnTbnUbnVbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbmbbnWbnXbnYbnZbnebnLbnUbnUbnUboabnUbobbnUboabnUbnUbnUbnLbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbmbbocbodboebofbnebnLbogbohboiboabnUbnLbnUboabnUbojbokbnLbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbmbbolbombombonbneboobnUbnUbnUboabnUbopbnUboabnUbnUbnUboqbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbmbborbosbotbmbbneboubovbowboxbnRboybozboAbnRboBboCboDboEbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH -aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbmbbmbbmbbmbbmbbnebnLboFboGbnUboabnUbnLbnUboabnUboHboIbnLbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEaZZbZabYEaJJaJJaJJbmablWblXblYblZbmabmDbmDbmDblVbmcbmdbmebmfbmgbmhblVaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEaZZblQbmMbmMbmMbmMbmDbmDbmDbmNbmQbmDbmObmPbmRblVbmnbmobmpbmobmqbmrblVaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEaZZbZbbmUbmVbmSbmTbmDbnhbmWbmXbnjbnkbnibnibnlblVbmEbmFbmGbmHbmIbmJblVaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbmKbmLbnobnpbnmbnnbnzbnAbnxbnybnKbnWbnGbnJbnXbmYbmZbnabnbbncbndbnebnebnebneaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbnfbngbodboebnYbnZbmDbolbnibofbniborbombonbosblVbnqbnrbnsbmGbntbnubnvbnwbneaJJaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbjAaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbYEbYEbYEbmMbmMbmMbmMbmDbDEbotbDDbDEbnebnebnebnebnebnBbnCbnDbnEbnFbnebnebocbnebneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIbnHbnIbnIbnIbnIbnIbnIbnIbnIbnIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbEcbDFbDFbEbbDFbnebnLbnLbnLbnMbnNbnObnPbnQbnRbnSbnTbnUbnVbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbEcbERbEdbEQbESbnebnLbnUbnUbnUboabnUbobbnUboabnUbnUbnUbnLbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbEcbFtbETbFsbQjbnebnLbogbohboiboabnUbnLbnUboabnUbojbokbnLbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbEcbUWbQkbQkbYabneboobnUbnUbnUboabnUbopbnUboabnUbnUbnUboqbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbEcbYHbYBbYGbEcbneboubovbowboxbnRboybozboAbnRboBboCboDboEbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH +aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbEcbEcbEcbEcbEcbnebnLboFboGbnUboabnUbnLbnUboabnUboHboIbnLbneaJJaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbneboJbnUbnUbnUboabnUboKbnUboabnUbnUbnUbnLbneaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbnebnLboLboMboNboObnUboPbnUboQboRboSboTbnLbneaJJaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH aJHaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJaJJbnebnQboUbnLboVbnLbnLboWbnLbnLboXbnLboUbnQbneaJJaJJaJJaJJaJJaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJIaJH @@ -5674,7 +5672,7 @@ boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabp boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabqgbqtbqtbqgbqubrgbrhbribrjbrkbrlbqhbrmbrnbrobrpbrqbrrbrsbrtbrubrvbrwbrxbrybrzbrAbrBbrCbrDbrDbrEbqkbrFbrGbrHbrIbpebrJbpYbrKbrLbrMbrNbrObprbpabpabpabpabpabpabqdbrPbqdbqdbrQbqdbqdbrRbqdbqdbpabpabpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabqgbqtbqtbqgbrSbrTbrUbrVbrTbrUbrWbqhbrXbrnbrYbrZbsabqhbsbbscbsdbsebsfbsgbqkbshbsibuMbskbslbrDbsmbqkamCbsobspbsqbpebsrbssbstbsubsvbswbsxbpebpabpabpabpabpabpabqqbrebsybszbrebsAbsBbrebsCbqdbpabpabpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabqgbqtbqtbqgbsDbrTbrUbrVbrTbrUbrWbqhbsEbsFbsGbsHbsIbqhbsJbsebsKbsebsfbsLbqkbsMbsibsjbsNbsObsObsPbqkbsQbsRbpcbpcbpebpebpebsSbsSbsTbsUbpebpebpabpabpabpabpabpabqqbsVbsWbsXbsXbsXbsYbsZbtabqdbpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabqgbtbbtbbqgbtcbrTbrUbrVbrTbrUbtdbqhbqhbqhbqhbqhbqhbqhbtebsebsKbynbtfbtgbqkbthbtibtjbtkbtlbtmbtnbqkbtobtpapoapkbtsbttbtubtvbtwbtxbtybtzbtsbpabpabpabpabpabpabqqbtAbtBbrebtCbtDbtEbtFbtGbtHbpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabqgbtbbtbbqgbtcbrTbrUbrVbrTbrUbtdbqhbqhbqhbqhbqhbqhbqhbtebsebsKbynbtfbtgbqkbthbtibtjbtkbtlbtmbtnbqkbtobtpaplanSbtsbttbtubtvbtwbtxbtybtzbtsbpabpabpabpabpabpabqqbtAbtBbrebtCbtDbtEbtFbtGbtHbpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabqgbtIbtJbtKbtLbtMbtNbtObtMbrUbtPbtQbtRbtSbtRbtSbtRbqibtTbtUbtVbsebsfbtWbqkbqkbtXbtYbtZbtZbuabqkbqkbubbucbudbuebtsbufbugbuhbuibujbukbulbumbpabpabpabpabpabunbqdbuobupbuobqdbqdbqdbqdbuqburbpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabqgbusbutbutbutbutbutbuubtJbrUbuvbtQbuwbtSbuxbtSbuybqibuzbuAbuBbsebuCbuDbuEbuFbuGbuHbuIbuJbuKbuLbywbuNbpcbucbuObtsbuPbuQbuRbuSbuTbukbuUbumbpabpabpabpabpabpabuVbuWbuXbuYbuZbpabpabpabpabpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabqgbqgbqgbvabvbbvbbvbbvbbvcbvdbtJbvebvfbtQbvgbvhbvibvjbvibqibvkbsebvlbvmbvnbvobvpbvqbvrbvsbvtbvubvvbvwbvxbpcbpcbvybvzbtsbvAbvBbvBbvBbvBbvCbvDbumbpabpabpabpabpabpabuVbvEbvFbvGbuZbpabpabpabpabpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboZboY @@ -5689,13 +5687,13 @@ boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabp boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbAVbAWbAXbAYbAYbAZbAZbAZbAZbAZbBabBbbBcbBdbBebBfbBgbBgbBgbBhbBgbBibBjbBkbpabpabpabpabzrbzrbBlbzrbBmbBnbBobBpbBqbzwbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbBrbBsbBtbBubBvbBwbwSbBxbBybBzbBAbwSbBBbBCbBDbxSbwSbpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbBEbAWbBFbBGbBGbBHbBHbBHbBHbBHbBIbBJbAFbAGbBKbBLbAHbAHbAHbPybAHbBNbBObBkbpabpabBPbpabzrbBQbBRbBSbBnbBnbzrbBTbBqbzwbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbBUbBVbwSbBWbBXbBYbBZbCabCbbCcbCdbCebCdbCfbCgbChbwSbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabqfbzhbCibAWbBFbBGbBGbBHbBHbBHbBHbBHbBIbBJbAFbAGbCjbznbCkbClbClbCmbCnbAHbCobznbpabpabpabpabzrbBnbCpbzrbCqbCqbzrbCrbBqbzwbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbCsbCtbCubCubCubCvbCubCwbCxbCwbCwbCwbCwbCybCybCybCybpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbCzbAWbBFbBGbBGbCAbzObCBbBHbBHbBIbBJbAFbAGbCCbznbCDbCEbCFbCGbCHbAHbCIbznbpabpabpabpabzrbCJbCKbzrbCqbCqbzrbCLbBqbzwbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbBUbCMbCNaOhaNybCQbCRbCSbCTbCUbCVbCWbCSbCXbCYbCZbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbAVbAWbBFbBGbBGbDbbDcbDdbBHbBHbBIbBJbAFbAGbCjbznbznbznbznbDebDfbzobznbznbwObwObtSbtSbzrbzrbzrbzrbzrbzrbzrbDgbDhbzwbIIbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbDibDjbDkbDlbDmbDnbDobCSbDpbCTbCTbDqbCSbDrbDsbDtbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbDubDvbBFbBGbBGbBGbBGbBGbBHbBHbBIbBJbAFbAGbAGbzibDwbwVbDxbDybDzbxbbxobDAbDBbDCbtSbDDbvibDEbDFbwsaPTaPFbwsbDIbBqaQRaQQbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbBUbDJbwsbwsbDKbDLbDMbCSbDNbCTbCTbDObCSbDsbDsbDPbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbAVbDQbBFbBGbBGbBGbBGbBGbBHbBHbBIbDRbDSbDTbDUbDVbDWbyobyobDXbDYbyxbyxbDZbygbEabtSbEbbEcbEcbEdbwsbEebEfbEgbEhbEiaRsaRrbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEkbElbEmbEnbEobEpbEqaRGbCSbEsbEtbEubEvbCSbEwbExbDsbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbEybDQbEzbEAbEAbEAbEAbEAbEBbEBbECbEDbEEbEFbEGbEHbEIbEJbEJbEJbEKbELbEMbENbEObEPbEQbERbESbESbETbwsaRZbDHbwsbEVbzvaSdaSabAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEXbBUbEYbEZbwsaSCbCQaSBbCSbFcbFdbFebFfbCSbFgbFhbFibDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbFjbFkbFlbFlbFlbFlbFlbFlbFlbFlbFlbFmbFnbFobFpbzhbwsbzZbzZbzZbwsbwsbvEbyVbFqbFrbtSbDDbFsbFtbDFbwsbwsbwsbwsbFubzvaTeaTabAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEXbBUbFvbDkbDkbDkaTybDkbCSbCSbFxbFybCSbCSbFzbFAbFzbFBbpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbFCbFDbFDbFDbFDbFEbFDbFDbFDbFFbFDbFGbFHbFIbFJbFKbpabpabpabpabpabuVbvEbyVbFqbvGbtSbtSbtSbtSbtSbtSbFLbFMbwsbDIbzvbEWbzxbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEXbBUbFNbFObFPbFQbFRbFSbFTbFBbFUbFVbFWbFXbFYbFZbGabFBbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbCzbAWbBFbBGbBGbCAbzObCBbBHbBHbBIbBJbAFbAGbCCbznbCDbCEbCFbCGbCHbAHbCIbznbpabpabpabpabzrbCJbCKbzrbCqbCqbzrbCLbBqbzwbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbBUbCMbCNaMZaNybCQbCRbCSbCTbCUaopbCWbCSbCXbCYbCZbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbAVbAWbBFbBGbBGbDbbDcbDdbBHbBHbBIbBJbAFbAGbCjbznbznbznbznbDebDfbzobznbznbwObwOaHnaHnbzrbzrbzrbzrbzrbzrbzrbDgbDhbzwbIIbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbDibDjbDkbDlbDmbDnbDobCSbDpbCTbCTbDqbCSbDrbDsbDtbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbDubDvbBFbBGbBGbBGbBGbBGbBHbBHbBIbBJbAFbAGbAGbzibDwbwVbDxbDybDzbxbbxobDAawkbDCaHnbmbbdqbaMaHobwsaPTaPFbwsbDIbBqaQRaQQbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbvEbBUbDJbwsbwsbDKbDLbDMbCSbDNbCTbCTbDObCSbDsbDsbDPbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzGbAVbDQbBFbBGbBGbBGbBGbBGbBHbBHbBIbDRbDSbDTbDUbDVbDWbyobyobDXbDYbyxbyxbDZbygbEaaHnbmmbmlbmlbmjbwsbEebEfbEgbEhbEiaRsaRrbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEkbElbEmbEnbEobEpbEqaRGbCSaHtbEtbEubEvbCSbEwbExbDsbDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbEybDQbEzbEAbEAbEAbEAbEAbEBbEBbECbEDbEEbEFbEGbEHbEIbEJbEJbEJbEKbELbEMbENbEObEPbmtbmwbmvbmvbmubwsaRZbDHbwsbEVbzvaSdaSabAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEXbBUbEYbEZbwsaSCbCQaSBbCSbFcbFdbFebFfbCSbFgbFhbFibDabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbFjbFkbFlbFlbFlbFlbFlbFlbFlbFlbFlbFmbFnbFobFpbzhbwsbzZbzZbzZbwsbwsbvEbyVbFqbFraHnbmbbmybmxaHobwsbwsbwsbwsbFubzvaTeaTabAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEXbBUbFvbDkbDkbDkaTybDkbCSbCSaKJbFybCSbCSbFzbFAbFzbFBbpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabzhbFCbFDbFDbFDbFDbFEbFDbFDbFDbFFbFDbFGbFHbFIbFJbFKbpabpabpabpabpabuVbvEbyVbFqbvGaHnaHnaHnaHnaHnaHnbFLbFMbwsbDIbzvbEWbzxbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbEXbBUbFNbFObFPbFQbFRbFSbFTbFBbFUbFVbFWbFXbFYbFZbGabFBbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabGbbGcbzhbzhbzhbGcbGcbGcbzhbzhbzhbGcbGcbGcbzhbzhbzhbpabpabpabpabpabuVbvEbyVbGdbGebGfbGgbxjbGhbGibGjbGibGibGkbGlbGmbGnbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbGobBUbygbGpbGqbFQbGrbGsbGubFBbGtbGvbGwbGwbGxbGybGzbFBbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabwsbGAbGBbyobGCbGDbyubGEbGFbyobyobyobyobGGbyobGHbEWbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbGIbGJbyubGKbGLbGMbGNbGObGObGPbGQbGRbGSbGTbGUbGVbGWbGXbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabwsbGYbyQbyQbyQbyQbyQbyQbyQbyQbyQbyQbyQbyTbGZbzvbEWbAhbAibAibAibAibAibAibAibAibAibAibAibAibAibAibAibAjbHabBUbygbygbHbbHcbHdbHebHebHfbHgbFVbHhbFBbHibGVbHjbGXbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY @@ -5708,26 +5706,26 @@ boYboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabp boYboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabIrbJrbHXbHXbHXbJsbJsbJtbJsbIWbHXbJubHJbJvbIgbIybIybIybIybIybIZbJwbJxbJybJzbJAbJAbJAbyubJBbykbJCbyxbyxbyxbyxbyxbyxbyxbJDbyobyobJEbyobyobyobyobyobyobZlbJmbJGbJHbJIbJobHebHebJJbJKbJKbJKbJKbJKbJKbJKbJLbpabpabpaboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabIrbHXbJMbJNbJObJObJObJObJObJPbJQbJRbmsbJTbIgbIybIybIybIybIgbJUbJwbJVbJWbJXbJYbJYbJYbyQbJZbyRbKabKbbKcbKdbKebKfbyQbyQbKgbJZbKhbKibKhbKhbKhbKjbKhbKkbKlbJmbJGbKmbIQbJobHebHebKnbKobKobKobKobKobKobKobJLbpabpabpaboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabHGbKpbKqbKrbHXbHXbHXbHXbHXbKsbKtbKubKvbKwbIgbIgbIgbIgbIgbIgbKxbKybJVbKzbKAbKBbKBbKBbKBbKBbKBbKCbKBbKBbKDbKBbKEbKFbKBbKGbKHbKHbKIbKJbKJbKJbKHbKHbKKbJwbKLbJGbIlbIlbJobHebHebHebHebHebHebHebHebHebKMbJLbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabHGbHGbKNbKNbKObKNbKNbKNbKNbKPbKQbKQbHJbHJbKRbKRbKRbKRbKRbKRbKSbKTbKUbKVbKBbsnbKXbKYbtqbLabKBbLbbtrbKBbwjbKBbLdbKBbwkbLfbKHbLgbLhbLibLjbLkbLlbLmbLnbJwbKLbJGbHebHebJobHebHebHebIlbIQbIlbHebHebHebLobJLbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbLpbLqbLrbLsbLtbLubLqbLrbLvbLwbLxbLybLzbLAbLBbLCbLDbLEbLFbKSbLGbJVbKzbLHbLIbDGbLIbLIbLIbLJbLbbEjbKBbKBbKBbLdbKBbErbLfbKHbLMbLNbLObLObLPbLQbKJbLRbLSbLTbGMbHpbHebLUbLVbLVbLVbLWbLXbIlbHebHebHebIlbJLbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabHGbHGbKNbKNbKObKNbKNbKNbKNbKPbKQbKQbHJbHJbKRbKRbKRbKRbKRbKRbKSbKTbKUbKVbKBbsnbKXbKYbdfbLabKBbLbbdfbKBbwjbKBbLdbKBbfzbLfbKHbLgbLhbLibLjbLkbLlbLmbLnbJwbKLbJGbHebHebJobHebHebHebIlbIQbIlbHebHebHebLobJLbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbLpbLqbLrbLsbLtbLubLqbLrbLvbLwbLxbLybLzbLAbLBbLCbLDbLEbLFbKSbLGbJVbKzbLHbLIbDGbLIbLIbLIbLJbLbbinbKBbKBbKBbLdbKBbiBbLfbKHbLMbLNbLObLObLPbLQbKJbLRbLSbLTbGMbHpbHebLUbLVbLVbLVbLWbLXbIlbHebHebHebIlbJLbpabpaboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbbcbLYbLZbLZbLZbLZbMabLZbMbbMcbMdbMebLzbMfbMgbMhbMibMhbMjbKSbLGbJVbMkbMlbMlbMlbMlbMlbMlbMlbLbbMmbKBbMnbMobMpbKBbDGbLfbKHbMqbNdbMsbMtbLObLQbKJbLnbIZbKLbFQbMubHebMvbMwbMwbMwbMxbZQbIlbHebHebHebMybFQbpabpabpaboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbMzbMAbMBbMCbMCbMDbMEaYibMFbMGbMHbMIbMJbMKbMLbMMbMNbMObMPbKSbMQbJVbMRbMlbMSbMTbMUbMSbMSbMlbMVbMWbKBbMXbMYbMZbKBbNabNbbKHbNcbNdbMsbMtbLObNebNfbNgbIZbKLbNhbNibHebJobHebHebHebIlbIQbIlbHebHebHebNjbFQbpabpabpabpaboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbNkbMAbNlbNmbNmbNnbNoaYibNpbNqbMAbNraUYbNsbNtbNtbNubNvbNwbNxbMQbNybNzbMlbNAbNBbNBbNBbNCbMlbLKbNEbKBbNFbNGbNHbKBbNIbNJbKHbNKbNdbMsbMtbNLbNMbNNbNObNPbNQbFQbNRbHebJobHebHebHebHebZnbHebHebHebHebNTbFQbJGbFQbpabpaboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbNUbMAbZSbNmbNmbNnaYUbNVbNWbNXbNYbbgaUYbNZbNZbNZbKSbOabNZbKSbMQbJVbObbMlbOcbOdbOebOfbOgbOUbLIbNEbOibOibOibOibOibOjbOkbOlbOmbOnbOobOpbOqbOrbKJbOsbIZbKLbJGbOtbOtbJobHebHebHebIlbIQbIlbHebHebHebHebOubLobJLbpabpaboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabOvaUYbOwbMAbZSbOxbOybOzbZobOBbOCbNqbODbOEaUYbOFbOGbOHbOIbOJbOKbOLbOMbJVbONbMlbOObOPbOQbORbOSbMlbOTbRkbRgbOWbOXbOYbOibKBbOZbKHbPabNdbMsbMtbPbbPcbPdbPebIZbKLbJGbPfbPgbPhbLVbLVbLVbLWbZRbIlbHebHebHebHebIlbKmbJLbpaboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbPibMAbPjaYibPkbPlbPmbPlbPnbPobPpbPqbPrbPsbPtbPubPvbPwbPxbPxbJdbZpbPzbMlbOObPAbOQbPBbPCbMlbLIbPDbPEbPFbPGbPHbOibXZbOZbKHbPJbNdbMsbMtbLObPKbNfbPLbIZbKLbJGbPgbPgbPMbMwbMwbMwbMxbIPbIlbHebHebHebHebIlbIQbJLbpaboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbPNbPOaYiaYibNqaYibPPbPQbPRbPSbPTbPUaUYbPVbPWbPXbOIbPYbPZbQabQbbQcbQdbMlbQebQfbQgbQhbQibYbbLIbPDbOibQjbQkbQlbYdbYcbQobKHbMqbNdbMsbMtbLObQpbKJbLnbIZbKLbJGbPgbPgbQqbHebHebHebIlbKmbIlbHebHebHebHebIlbIQbJLbpaboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbQrbQsaYiaYibNqaYibQtbQubQubQvbQwbQxbQubQubQybQybQybQybQybQybQzbQAbQBbMlbQCbQDbQEbQDbQFbMlbYlbPDbOibOibOibOibOibQHbYmbKHbQJbLNbLObLObLPbLQbKJbLnbIZbKLbJGbQKbQKbJobHebHebHebHebHebHebHebQLbQMbQNbQObLobJLbpaboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYaUYaUYbQPbQsaYibQQbQRaYibQSbQubQTbQUbQVbQWbQXbQubQYbQZbRabRbbRcbQybRdbQcbQdbMlbRebRebRfbRebRebMlbYpbPDbKBbRhbKBbRibKBbRjbYqbKHbRlbRmbRnbRobRpbRqbKHbKKbIZbRrbFQbRsbHobRtbHebHebHebHebHebHebHebFQbFQbFQbFQbFQbFQbpaboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbNUbMAbZSbNmbNmbNnaYUbNVbNWbNXbNYbbgaUYbNZbNZbNZbKSbOabNZbKSbMQbJVbObbMlbOcbOdbOebOfbOgbOUbLIbNEanTanTanTanTanTbOjbOkbOlbOmbOnbOobOpbOqbOrbKJbOsbIZbKLbJGbOtbOtbJobHebHebHebIlbIQbIlbHebHebHebHebOubdwbJLbpabpaboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabOvaUYbOwbMAbZSbOxbOybOzbZobOBbOCbNqbODbOEaUYbOFbOGbOHbOIbOJbOKbOLbOMbJVbONbMlbOObOPbOQbORbOSbMlbOTbRkbOWbOibcSbOXanTbKBbOZbKHbPabNdbMsbMtbPbbPcbPdbPebIZbKLbJGbPfbPgbPhbLVbLVbLVbLWbZRbIlbHebHebHebHebHebdzbJLbpaboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbPibMAbPjaYibPkbPlbPmbPlbPnbPobPpbPqbPrbPsbPtbPubPvbPwbPxbPxbJdbZpbPzbMlbOObPAbOQbPBbPCbMlbLIbPDbPFbPEbOYbPGanTbXZbOZbKHbPJbNdbMsbMtbLObPKbNfbPLbIZbKLbJGbPgbPgbPMbMwbMwbMwbMxbIPbIlbHebHebHebHebHebLobJLbpaboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbPNbPOaYiaYibNqaYibPPbPQbPRbPSbPTbPUaUYbPVbPWbPXbOIbPYbPZbQabQbbQcbQdbMlbQebQfbQgbQhbQibYbbLIbPDanTbQlbPHbYdbRgbYcbQobKHbMqbNdbMsbMtbLObQpbKJbLnbIZbKLbJGbPgbPgbQqbHebHebHebIlbKmbIlbHebHebHebHebIlbKmbJLbpaboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbQrbQsaYiaYibNqaYibQtbQubQubQvbQwbQxbQubQubQybQybQybQybQybQybQzbQAbQBbMlbQCbQDbQEbQDbQFbMlbErbPDanTanTanTanTanTbQHbfzbKHbQJbLNbLObLObLPbLQbKJbLnbIZbKLbJGbQKbQKbJobHebHebHebHebHebHebHebQLbQMbQNbdAbIQbJLbpaboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYaUYaUYbQPbQsaYibQQbQRaYibQSbQubQTbQUbQVbQWbQXbQubQYbQZbRabRbbRcbQybRdbQcbQdbMlbRebRebRfbRebRebMlbYpbPDbKBbRhbKBbRibKBbRjbFbbKHbRlbRmbRnbRobRpbRqbKHbKKbIZbRrbFQbRsbHobRtbHebHebHebHebHebHebHebFQbFQbFQbFQbFQbFQbpaboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYbRubRvbRwbRxbRybRzbRAaYibRBbRCbRDbREbRFbRGbRHbQubRIbRJbRKbRLbRMbQybRNbQcbQdbRObMlbMlbMlbMlbMlbRPbKBbRQbKBbRRbKBbKBbKBbRSbKBbRTbKHbKJbKJbKJbKJbKHbKHbLnbRUbRVbFQbRWbHebZqbRYbRZbRZbRZbRZbRZbSabFQbSbbScbSdbFQbpabpaboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYaUYaUYbSebSfbSfbcCbSgbShbSibRCbSjbSkbSlbSmbSnbSobSpbSqbSrbSsbStbSubSvbSwbSxbSybSzbSAbSBbSCbSDbSybSEbSFbSGbSHbSIbSJbSKbSLbSMbSNbSObSPbSPbSPbSPbSQbSRbSSbSTbSUbSVbSWbHebSXbSYbSZbTabTabTabTbbTcbFQbTdbHebTebFQbpabpaboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaaUYaUYbTfbTgbTgbThbTgbTgbTfbTibTjbTkbTlbTmbTnbTobRKbRKbRKbTpbTqbTrbTsbTtbTtbTubTtbTtbTtbTvbTwbTxbTybTzbTAbTBbTCbTAbTDbTtbTtbTtbTtbTtbTtbTtbTEbTFbIZbIZbTGbTHbTIbTJbTKbTLbTMbTMbTMbTMbTMbTMbTNbTObTPbTQbJLboZboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabTfbTRbTSbTTbTUbTVbTfbTWbTXbTkbTlbTmbTnbTYbTZbUabTZbUbbTqbTrbUcbUdbUebUfbJYbJYbJYbUgbUhbUibUjbUjbUjbUkbUlbUmbUjbUjbUjbUjbUjbUnbUlbUobUjbUjbUjbUjbUpbFQbUqbUrbUsbSYbUtbUubUvbUwbUxbUybFQbUzbHebUAbJLboZboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabTfbUBbUCbUDbUEbUFbTfbUGbTXbTnbUHbUIbQubQubRCbRCbRCbQubQubQubUJbRCbQubHzbUKbUKbULbUMbIZbUNbULbUKbUKbHzbHzbHzbUKbUKbUKbUKbUKbHzbHzbHzbUKbUKbUKbUKbUKbFQbFQbFQbFQbUObUObUObUObUObFQbFQbFQbUObUObUObUPboZboZboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabUQbURbUSbUTbUUbUVbUWbUXbUYbUZbVabVbbVcbVdbVebVfbVgbVhbVibVjbVkbVlbQubpabpabpabVmbUMbIZbUNbVnbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabUQbVobVpbVqbUUbVrbUWbVsbTnbVtbZrbVvbVwbVvbVvbVvbVvbVvbVxbTnbTnbVybQubpabpabpabVmbUMbIZbUNbVnbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpaboZboZboZboZbpabpabpabpabpabpaboZboZboZbpabpabpabpabpabpabpabpabUQbVzbVAbUUbUUbVBbUWbVCbTnbTnbTnbTnbVDbVEbVEbVEbVEbVEbVFbTnbVGbVHbQubpabpabpabHzbVIbVJbVKbHzbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpbbpabpabpabpabpabpabpabpabpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY -boYboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpaboZboZboZboZboZboZbpabpabpabpaboZboZboZboZboZbpabpabpabpabpabpabpabpabTfbVLbVMbVNbVObVPbTfbVQbVRbVSbVTbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebQubpabpabpabHzbWfbIZbUNbHzbpabpabpabpabpabpabpabpabpabpabpabWgbWgbWhbWhbWhbWhbWhbWgbWgbWgbWhbWhbWhbWhbWhbWgbWgbpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabUQbURbUSbUTbUUbUVbTgbUXbUYbUZbVabVbbVcbVdbVebVfbVgbVhbVibVjbVkbVlbQubpabpabpabVmbUMbIZbUNbVnbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabUQbVobVpbVqbUUbVrbTgbVsbTnbVtbZrbVvbVwbVvbVvbVvbVvbVvbVxbTnbTnbVybQubpabpabpabVmbUMbIZbUNbVnbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpaboZboZboZboZbpabpabpabpabpabpaboZboZboZbpabpabpabpabpabpabpabpabUQbVzbVAbUUbUUbVBbTgbVCbTnbTnbTnbTnbVDbVEbVEbVEbVEbVEbVFbTnbVGbVHbQubpabpabpabHzbVIbVJbVKbHzbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpbbpabpabpabpabpabpabpabpabpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY +boYboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpaboZboZboZboZboZboZbpabpabpabpaboZboZboZboZboZbpabpabpabpabpabpabpabpabTfbVLbVMbVNbVObVPbTfbVQbVRbVSbVTbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbYWbQubpabpabpabHzbWfbIZbUNbHzbpabpabpabpabpabpabpabpabpabpabpabWgbWgbWhbWhbWhbWhbWhbWgbWgbWgbWhbWhbWhbWhbWhbWgbWgbpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpaboZboZboZboZboZboZbpabpaboZbpaboZboZboZboZboZboZboZboZboZboZbpabpabpabTfbTfbWibWibWibTfbTfbQubWjbWjbWjbQubQubWjbWjbWjbQubQubWjbWjbWjbQubQubpabpabpabHzbWkbIZbWlbHzbpabpabpabpabpabpabpabpabpabpabpabWgbWmbWnbWnbWnbWnbWnbWobWpbWqbWnbWnbWnbWnbWnbWmbWgbpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabVmbUMbIZbUNbVnbpabpabpabpabpabpabpabpabpabpabpabWrbWsbWtbWtbWtbWtbWtbWubWnbWsbWtbWtbWtbWtbWtbWubWvbpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY boYboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZboZbpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabpabVmbUMbIZbUNbVnbpabpabpabpabpabpabpabpabpabpabpabWrbWwbWxbWybWybWybWxbWzbWnbWwbWnbWnbWnbWnbWnbWzbWvbpabpabpabpabpabpaboZboZboZboZboZboZboZboZboZboZboZboZboZboY diff --git a/maps/tether/tether-02-transit.dmm b/maps/tether/tether-02-transit.dmm index 33abb4f0366..72afaa9efc0 100644 --- a/maps/tether/tether-02-transit.dmm +++ b/maps/tether/tether-02-transit.dmm @@ -131,3 +131,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/maps/tether/tether-03-station.dmm b/maps/tether/tether-03-station.dmm index 047d97de6f7..8cecfed6a52 100644 --- a/maps/tether/tether-03-station.dmm +++ b/maps/tether/tether-03-station.dmm @@ -12,7 +12,7 @@ "aal" = (/obj/structure/bed/chair,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "aam" = (/obj/machinery/sleep_console{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "aan" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) -"aao" = (/obj/structure/table/standard,/obj/item/bodybag/cryobag,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) +"aao" = (/obj/structure/table/standard,/obj/item/bodybag/cryobag,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/device/defib_kit,/obj/item/device/defib_kit,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "aap" = (/obj/structure/bed/chair,/obj/machinery/vending/wallmed1{layer = 3.3; name = "Emergency NanoMed"; pixel_x = 28; pixel_y = 0},/obj/structure/closet/walllocker/emerglocker{pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "aaq" = (/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) "aar" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod2/station) @@ -56,7 +56,7 @@ "abd" = (/obj/structure/bed/chair/comfy/black{dir = 8},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_8) "abe" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_8) "abf" = (/obj/structure/table/woodentable,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_8) -"abg" = (/obj/structure/sink{pixel_y = 22},/obj/item/frame/mirror{layer = 2.9; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_8) +"abg" = (/obj/structure/sink{pixel_y = 22},/obj/structure/mirror{dir = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_8) "abh" = (/obj/structure/toilet{pixel_y = 10},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_8) "abi" = (/obj/structure/closet/secure_closet/engineering_personal,/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "abj" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) @@ -96,8 +96,8 @@ "abR" = (/obj/structure/closet/secure_closet/atmos_personal,/obj/machinery/camera/network/engineering{dir = 8},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "abS" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) "abT" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/gun/projectile/sec/wood,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/item/weapon/gun/projectile/sec/wood,/obj/item/weapon/gun/projectile/sec/wood,/obj/item/weapon/gun/projectile/sec/wood,/obj/item/weapon/gun/projectile/sec/wood,/obj/item/weapon/gun/projectile/sec/wood,/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) -"abU" = (/obj/structure/closet,/obj/random_multi/single_item/netgun,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/contraband,/turf/simulated/floor,/area/maintenance/station/eng_lower) -"abV" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/turf/simulated/floor,/area/maintenance/station/eng_lower) +"abU" = (/obj/structure/closet,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/contraband,/turf/simulated/floor,/area/maintenance/station/eng_lower) +"abV" = (/obj/random/trash_pile,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/eng_lower) "abW" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/white/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/white/bordercorner2{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals6{dir = 8},/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/machinery/camera/network/northern_star{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "abX" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "abY" = (/turf/simulated/wall,/area/crew_quarters/sleep/Dorm_6) @@ -124,7 +124,7 @@ "act" = (/obj/structure/bed/chair/comfy/black{dir = 8},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_6) "acu" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_6) "acv" = (/obj/structure/table/woodentable,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_6) -"acw" = (/obj/structure/sink{pixel_y = 22},/obj/item/frame/mirror{layer = 2.9; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_6) +"acw" = (/obj/structure/sink{pixel_y = 22},/obj/structure/mirror{dir = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_6) "acx" = (/obj/structure/toilet{pixel_y = 10},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_6) "acy" = (/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 26},/obj/machinery/camera/network/engineering{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos/backup) "acz" = (/obj/machinery/atmospherics/pipe/tank/nitrogen{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos/backup) @@ -137,7 +137,7 @@ "acG" = (/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/grille,/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/engineering/atmos/backup) "acH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/orange/border{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 10},/obj/item/device/radio/intercom{pixel_y = 24; req_access = list()},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "acI" = (/obj/machinery/atm{pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/orange/border{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"acJ" = (/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/red/border{dir = 9},/obj/machinery/camera/network/security{dir = 4},/obj/structure/table/steel,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/device/retail_scanner/security,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 30},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/security/warden) +"acJ" = (/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/red/border{dir = 9},/obj/machinery/camera/network/security{dir = 4},/obj/structure/table/steel,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/device/retail_scanner/security,/obj/machinery/newscaster/security_unit{pixel_x = 0; pixel_y = 30},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/obj/item/weapon/hand_labeler,/turf/simulated/floor/tiled/dark,/area/security/warden) "acK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "acL" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "acM" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) @@ -254,7 +254,7 @@ "aeT" = (/obj/structure/bed/chair/comfy/black{dir = 8},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_4) "aeU" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_4) "aeV" = (/obj/structure/table/woodentable,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_4) -"aeW" = (/obj/structure/sink{pixel_y = 22},/obj/item/frame/mirror{layer = 2.9; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_4) +"aeW" = (/obj/structure/mirror{pixel_x = 30},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) "aeX" = (/obj/structure/toilet{pixel_y = 10},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_4) "aeY" = (/obj/structure/sign/department/atmos,/turf/simulated/wall/r_wall,/area/engineering/atmos/backup) "aeZ" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/orange/border{dir = 8},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) @@ -269,7 +269,7 @@ "afi" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "afj" = (/obj/structure/cable/green{icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/orange/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "afk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/orange/border{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"afl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/orange/border{dir = 5},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 5},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) +"afl" = (/obj/structure/sink{pixel_y = 22},/obj/structure/mirror{dir = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_4) "afm" = (/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/engineering/workshop) "afn" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "afo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) @@ -362,7 +362,7 @@ "agX" = (/obj/structure/bed/chair/comfy/black{dir = 8},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_2) "agY" = (/obj/structure/table/woodentable,/obj/item/weapon/storage/box/donkpockets,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_2) "agZ" = (/obj/structure/table/woodentable,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/Dorm_2) -"aha" = (/obj/structure/sink{pixel_y = 22},/obj/item/frame/mirror{layer = 2.9; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_2) +"aha" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/orange/border{dir = 5},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 5},/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "ahb" = (/obj/structure/toilet{pixel_y = 10},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_2) "ahc" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/white/border{dir = 8},/obj/item/device/radio/intercom{dir = 4; pixel_x = -24},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "ahd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) @@ -631,7 +631,7 @@ "amg" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{dir = 8},/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{dir = 1},/obj/machinery/door/blast/regular{dir = 4; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room) "amh" = (/obj/structure/grille,/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{dir = 1},/obj/machinery/door/blast/regular{dir = 4; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room) "ami" = (/obj/structure/grille,/obj/structure/window/phoronreinforced{dir = 4},/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{dir = 1},/obj/machinery/door/blast/regular{dir = 4; id = "SupermatterPort"; layer = 3.3; name = "Reactor Blast Door"},/turf/simulated/floor/reinforced/nitrogen{nitrogen = 82.1472},/area/engineering/engine_room) -"amj" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/flashlight,/obj/item/weapon/wrench,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/turf/simulated/floor/tiled,/area/engineering/workshop) +"amj" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/flashlight,/obj/item/weapon/wrench,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/item/weapon/storage/box/nifsofts_engineering,/turf/simulated/floor/tiled,/area/engineering/workshop) "amk" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engineering/engine_room) "aml" = (/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/glass,/obj/structure/grille,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "EngineBlast"; name = "Engine Monitoring Room Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/engineering/engine_monitoring) "amm" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/table/standard,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) @@ -1086,7 +1086,7 @@ "auT" = (/obj/machinery/computer/cryopod{pixel_y = 32},/obj/effect/floor_decal/techfloor{dir = 5},/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/sleep/cryo) "auU" = (/obj/machinery/cryopod/robot,/obj/effect/floor_decal/corner_techfloor_grid{dir = 5},/obj/effect/floor_decal/corner_techfloor_grid{dir = 10},/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/sleep/cryo) "auV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/crew_quarters/sleep/cryo) -"auW" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_security{name = "Security Cells"; req_access = list(1)},/turf/simulated/floor/tiled/steel_grid,/area/security/hallway) +"auW" = (/obj/structure/closet/secure_closet/brig{id = "Cell 3"},/obj/effect/floor_decal/industrial/outline,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/brig) "auX" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eng_starboard_airlock"; pixel_x = 0; pixel_y = -25; req_access = list(13); req_one_access = null; tag_airpump = "eng_starboard_pump"; tag_chamber_sensor = "eng_starboard_sensor"; tag_exterior_door = "eng_starboard_outer"; tag_interior_door = "eng_starboard_inner"},/turf/simulated/floor/tiled/dark,/area/engineering/engine_eva) "auY" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1379; id_tag = "eng_starboard_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_starboard_sensor"; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/engineering/engine_eva) "auZ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eng_starboard_inner"; locked = 1; name = "Engineering Starboard Internal Access"; req_access = list(13)},/turf/simulated/floor/tiled/dark,/area/engineering/engine_eva) @@ -1158,7 +1158,7 @@ "awn" = (/turf/simulated/wall/r_wall,/area/bridge) "awo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/bridge) "awp" = (/obj/structure/sign/department/bridge,/turf/simulated/wall/r_wall,/area/bridge_hallway) -"awq" = (/obj/structure/table/marble,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/obj/machinery/floor_light/prebuilt{on = 1},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "cafe"; name = "Cafe Shutters"; pixel_x = -10; pixel_y = 10; req_access = list(); req_one_access = list(25)},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) +"awq" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower/security,/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) "awr" = (/obj/structure/sign/nanotrasen,/turf/simulated/wall/r_wall,/area/bridge_hallway) "aws" = (/obj/structure/table/marble,/obj/machinery/cash_register/civilian{dir = 1},/obj/machinery/door/blast/shutters{dir = 2; id = "cafe"; layer = 3.1; name = "Cafe Shutters"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) "awt" = (/turf/simulated/wall/r_wall,/area/bridge_hallway) @@ -1171,7 +1171,7 @@ "awA" = (/obj/machinery/door/firedoor/glass/hidden/steel,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) "awB" = (/obj/machinery/door/firedoor/glass/hidden/steel{dir = 2},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) "awC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass/hidden/steel{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) -"awD" = (/obj/structure/closet{name = "Lost and Found"},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/obj/random_multi/single_item/teleport,/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) +"awD" = (/obj/structure/closet{name = "Lost and Found"},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) "awE" = (/turf/simulated/floor/tiled,/area/tether/station/stairs_one) "awF" = (/obj/machinery/door/airlock/multi_tile/glass{name = "Stairwell"},/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/steeldecal/steel_decals_central1{dir = 8},/turf/simulated/floor/tiled/monofloor{dir = 8},/area/tether/station/stairs_three) "awG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals6,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) @@ -1195,7 +1195,7 @@ "awY" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "awZ" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "axa" = (/obj/structure/cable{icon_state = "1-2"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/bridge) -"axb" = (/obj/structure/closet,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/obj/random_multi/single_item/netgun,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/turf/simulated/floor,/area/maintenance/station/eng_lower) +"axb" = (/obj/structure/closet,/obj/effect/floor_decal/rust,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/turf/simulated/floor,/area/maintenance/station/eng_lower) "axc" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) "axd" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) "axe" = (/obj/machinery/door/airlock/maintenance/common,/obj/structure/cable/green{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/machinery/door/firedoor/glass,/turf/simulated/floor,/area/crew_quarters/sleep/cryo) @@ -1345,14 +1345,14 @@ "azS" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "azT" = (/turf/simulated/wall,/area/library) "azU" = (/obj/structure/sign/department/biblio,/turf/simulated/wall,/area/library) -"azV" = (/obj/structure/closet,/obj/random/maintenance/cargo,/obj/random/maintenance/research,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/junk,/obj/random/tool,/obj/random_multi/single_item/netgun,/turf/simulated/floor,/area/maintenance/cargo) +"azV" = (/obj/random/trash_pile,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/cargo) "azW" = (/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals_central1{dir = 4},/turf/simulated/floor/tiled/monofloor{dir = 4},/area/library) "azX" = (/turf/simulated/wall,/area/crew_quarters/toilet) "azY" = (/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{name = "Unisex Restrooms"},/turf/simulated/floor/tiled/steel_grid,/area/crew_quarters/toilet) "azZ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/light{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/machinery/door/firedoor/glass/hidden/steel,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 10},/turf/simulated/floor/tiled,/area/hallway/station/docks) "aAa" = (/obj/machinery/door/firedoor/glass/hidden/steel{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/station/docks) "aAb" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/machinery/door/firedoor/glass/hidden/steel{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 5},/turf/simulated/floor/tiled,/area/hallway/station/docks) -"aAc" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/tool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) +"aAc" = (/obj/random/trash_pile,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) "aAd" = (/obj/structure/closet,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/contraband,/obj/random/maintenance/engineering,/obj/random/toy,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) "aAe" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donut,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -28},/turf/simulated/floor/tiled/dark,/area/bridge) "aAf" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/bridge) @@ -1380,7 +1380,7 @@ "aAB" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) "aAC" = (/obj/machinery/door/airlock{name = "Unit 1"},/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) "aAD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) -"aAE" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/frame/mirror{pixel_x = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) +"aAE" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/clothing/suit/storage/apron,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) "aAF" = (/obj/structure/reagent_dispensers/water_cooler/full,/obj/machinery/computer/guestpass{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/station/docks) "aAG" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/obj/machinery/status_display{pixel_y = 30},/turf/simulated/floor/tiled,/area/hallway/station/docks) "aAH" = (/obj/structure/bed/chair,/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/station/docks) @@ -1436,7 +1436,7 @@ "aBF" = (/obj/structure/bed/chair/comfy/brown,/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/library) "aBG" = (/obj/machinery/door/airlock{name = "Unit 2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) "aBH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) -"aBI" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/frame/mirror{pixel_x = 30},/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) +"aBI" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/item/weapon/reagent_containers/glass/bucket,/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) "aBJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/camera/network/northern_star{dir = 4},/turf/simulated/floor/tiled,/area/hallway/station/docks) "aBK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/hallway/station/docks) "aBL" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/hallway/station/docks) @@ -1447,7 +1447,7 @@ "aBQ" = (/obj/structure/table/reinforced,/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/item/device/radio{pixel_x = 2; pixel_y = 3},/obj/item/device/radio,/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = -32},/turf/simulated/floor/tiled/dark,/area/bridge) "aBR" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 0},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled/dark,/area/bridge) "aBS" = (/obj/item/device/aicard,/obj/item/weapon/storage/box/PDAs{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/box/ids,/obj/structure/table/reinforced,/turf/simulated/floor/tiled/dark,/area/bridge) -"aBT" = (/obj/structure/table/standard,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = -26; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/briefing_room) +"aBT" = (/obj/structure/table/standard,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = -26; pixel_y = 0},/obj/item/weapon/storage/box/nifsofts_security,/turf/simulated/floor/tiled,/area/security/briefing_room) "aBU" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled/dark,/area/bridge) "aBV" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light_switch{pixel_y = -26},/turf/simulated/floor/tiled/dark,/area/bridge) "aBW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "bridge blast"; name = "Bridge Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/bridge) @@ -1496,7 +1496,7 @@ "aCN" = (/obj/structure/bookcase{name = "bookcase (Religious)"},/turf/simulated/floor/wood,/area/library) "aCO" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/library) "aCP" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/carpet,/area/library) -"aCQ" = (/obj/structure/bookcase{name = "bookcase (Religious)"},/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/wood,/area/library) +"aCQ" = (/obj/structure/sink{pixel_y = 22},/obj/structure/mirror{dir = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/Dorm_2) "aCR" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 8; pixel_x = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) "aCS" = (/obj/machinery/door/airlock{name = "Unit 3"},/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) "aCT" = (/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/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/lightgrey/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/machinery/firealarm{dir = 2; layer = 3.3; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) @@ -1530,7 +1530,7 @@ "aDv" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/tether/station/dock_two) "aDw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/tether/station/dock_two) "aDx" = (/turf/simulated/floor/tiled,/area/tether/station/dock_two) -"aDy" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/tiled/white,/area/crew_quarters/captain) +"aDy" = (/obj/structure/railing,/obj/machinery/light/small{dir = 1},/obj/random/trash_pile,/turf/simulated/floor,/area/maintenance/cargo) "aDz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/crew_quarters/captain) "aDA" = (/obj/structure/toilet{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled/white,/area/crew_quarters/captain) "aDB" = (/obj/machinery/computer/communications,/turf/simulated/floor/wood,/area/crew_quarters/captain) @@ -1575,8 +1575,8 @@ "aEo" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/maintenance/substation/command) "aEp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/multi_tile/metal/mait{dir = 1; name = "Command Substation"; req_one_access = list(11,24,47)},/turf/simulated/floor,/area/maintenance/substation/command) "aEq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/maintenance/station/bridge) -"aEr" = (/obj/structure/cable{icon_state = "1-8"},/obj/random/junk,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/station/bridge) -"aEs" = (/turf/simulated/floor,/area/maintenance/station/bridge) +"aEr" = (/obj/structure/closet,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/tech_supply,/obj/random/maintenance/cargo,/obj/random/toy,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/sec_upper) +"aEs" = (/obj/random/trash_pile,/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) "aEt" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -32},/obj/structure/cable,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/station/bridge) "aEu" = (/obj/structure/bed/chair/comfy/black,/turf/simulated/floor/carpet,/area/library) "aEv" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/library) @@ -1923,8 +1923,8 @@ "aKY" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/obj/structure/stairs/south,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/security/prison) "aKZ" = (/obj/machinery/cryopod{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/brig) "aLa" = (/obj/structure/closet/secure_closet/brig,/obj/effect/floor_decal/industrial/outline,/turf/simulated/floor/tiled/dark,/area/security/brig) -"aLb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled/dark,/area/security/brig) -"aLc" = (/obj/structure/closet/secure_closet/brig,/obj/effect/floor_decal/industrial/outline,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/brig) +"aLb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/flasher{id = "Cell 3"; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/security/brig) +"aLc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/flasher{id = "Cell 4"; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/security/brig) "aLd" = (/obj/item/weapon/stool/padded,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) "aLe" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) "aLf" = (/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) @@ -1976,7 +1976,7 @@ "aLZ" = (/obj/machinery/seed_storage/garden,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/camera/network/security{dir = 8},/turf/simulated/floor/tiled,/area/security/brig) "aMa" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower/security,/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) "aMb" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) -"aMc" = (/obj/structure/mirror{pixel_x = 30},/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) +"aMc" = (/obj/machinery/telecomms/relay/preset/tether/station_low,/obj/effect/floor_decal/techfloor/orange{dir = 9},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/westleft{req_access = list(56); req_one_access = list(19)},/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/heads/chief) "aMd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/station/sec_lower) "aMe" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/dark,/area/chapel/chapel_morgue) "aMf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/chapel/chapel_morgue) @@ -1995,7 +1995,7 @@ "aMs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) "aMt" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) "aMu" = (/obj/structure/table/steel,/obj/item/clothing/head/greenbandana,/obj/item/weapon/material/minihoe,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) -"aMv" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower/security,/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) +"aMv" = (/obj/effect/floor_decal/techfloor/orange{dir = 8},/obj/machinery/telecomms/relay/preset/tether/station_mid,/obj/machinery/door/window/brigdoor/westleft{req_access = list(56); req_one_access = list(19)},/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/heads/chief) "aMw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) "aMx" = (/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) "aMy" = (/turf/simulated/wall,/area/chapel/office) @@ -2015,7 +2015,7 @@ "aMM" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals3{dir = 1},/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,/turf/simulated/floor/tiled,/area/security/prison) "aMN" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/obj/structure/stairs/north,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/security/prison) "aMO" = (/obj/machinery/cryopod{dir = 2},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/dark,/area/security/brig) -"aMP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/dark,/area/security/brig) +"aMP" = (/obj/structure/closet/secure_closet/brig{id = "Cell 4"},/obj/effect/floor_decal/industrial/outline,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/brig) "aMQ" = (/obj/structure/cable/green,/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "west bump"; pixel_x = -28},/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) "aMR" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) "aMS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) @@ -2042,7 +2042,7 @@ "aNn" = (/obj/item/weapon/pen/crayon,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/dark,/area/security/brig) "aNo" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/dark,/area/security/brig) "aNp" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/obj/item/device/taperecorder{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) -"aNq" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe,/obj/item/clothing/suit/storage/apron,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) +"aNq" = (/obj/effect/floor_decal/techfloor/orange{dir = 10},/obj/structure/window/reinforced,/obj/machinery/telecomms/relay/preset/tether/station_high,/obj/machinery/door/window/brigdoor/westleft{req_access = list(56); req_one_access = list(19)},/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/heads/chief) "aNr" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/obj/item/weapon/deck/cards,/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) "aNs" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/clothing/head/soft/orange,/obj/item/clothing/shoes/sandal,/obj/machinery/light,/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) "aNt" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) @@ -2050,7 +2050,7 @@ "aNv" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled/steel_dirty,/area/security/brig) "aNw" = (/obj/structure/toilet{dir = 1},/obj/machinery/light/small,/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) "aNx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) -"aNy" = (/obj/structure/mopbucket,/obj/item/weapon/mop,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/freezer,/area/security/brig/bathroom) +"aNy" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/obj/structure/plasticflaps/mining,/turf/simulated/floor,/area/quartermaster/delivery) "aNz" = (/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/lino,/area/chapel/office) "aNA" = (/obj/structure/bed/chair,/obj/effect/landmark/start{name = "Chaplain"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/lino,/area/chapel/office) "aNB" = (/obj/structure/cable/pink{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/lino,/area/chapel/office) @@ -2120,7 +2120,7 @@ "aON" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/security{name = "Evidence Storage"; req_access = list(1)},/turf/simulated/floor/tiled/steel_grid,/area/security/evidence_storage) "aOO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) "aOP" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) -"aOQ" = (/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) +"aOQ" = (/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor,/area/maintenance/station/eng_lower) "aOR" = (/turf/simulated/wall/r_wall,/area/security/evidence_storage) "aOS" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/lino,/area/chapel/office) "aOT" = (/obj/structure/cable/pink{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/lino,/area/chapel/office) @@ -2213,7 +2213,7 @@ "aQC" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled/dark,/area/chapel/main) "aQD" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/highsecurity{name = "AI Upload"; req_access = list(16); req_one_access = list()},/turf/simulated/floor/tiled/techfloor,/area/ai_upload) "aQE" = (/obj/structure/catwalk,/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/simulated/open,/area/engineering/engine_balcony) -"aQF" = (/obj/structure/closet,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/tech_supply,/obj/random/maintenance/cargo,/obj/random/toy,/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/sec_upper) +"aQF" = (/obj/random/trash_pile,/turf/simulated/floor,/area/maintenance/station/sec_upper) "aQG" = (/turf/simulated/wall/r_wall,/area/crew_quarters/heads/chief) "aQH" = (/obj/machinery/light{dir = 8},/obj/structure/table/steel,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled,/area/security/security_processing) "aQI" = (/obj/structure/table/steel,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled,/area/security/security_processing) @@ -2234,7 +2234,7 @@ "aQX" = (/obj/effect/floor_decal/corner_techfloor_grid{dir = 5},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/techfloor,/area/ai_upload) "aQY" = (/obj/effect/floor_decal/techfloor{dir = 5},/obj/effect/floor_decal/techfloor/hole/right{dir = 1},/turf/simulated/floor/tiled/techfloor,/area/ai_upload) "aQZ" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 0},/obj/machinery/porta_turret/ai_defense,/turf/simulated/floor/bluegrid,/area/ai_upload) -"aRa" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) +"aRa" = (/obj/structure/disposalpipe/segment,/obj/random/trash_pile,/turf/simulated/floor,/area/maintenance/station/elevator) "aRb" = (/obj/machinery/button/remote/driver{id = "enginecore"; name = "Emergency Core Eject"; pixel_x = 0; pixel_y = 21},/obj/structure/window/basic,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/heads/chief) "aRc" = (/obj/structure/closet/secure_closet/engineering_chief,/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "aRd" = (/obj/structure/table/reinforced,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) @@ -2267,7 +2267,7 @@ "aRE" = (/obj/structure/table/reinforced,/obj/item/weapon/stamp/ce,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/flame/lighter/zippo,/obj/item/device/megaphone,/obj/item/weapon/folder/yellow_ce,/obj/item/weapon/pen/multi,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/carpet/oracarpet,/area/crew_quarters/heads/chief) "aRF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/carpet/oracarpet,/area/crew_quarters/heads/chief) "aRG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/carpet/oracarpet,/area/crew_quarters/heads/chief) -"aRH" = (/obj/machinery/telecomms/relay/preset/tether/station_low,/obj/effect/floor_decal/techfloor/orange{dir = 9},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/window/brigdoor/westleft,/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/heads/chief) +"aRH" = (/obj/structure/sink{dir = 8; icon_state = "sink"; pixel_x = -12; pixel_y = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) "aRI" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled,/area/security/security_processing) "aRJ" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/security/security_processing) "aRK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/junction,/turf/simulated/floor/tiled,/area/security/security_processing) @@ -2299,7 +2299,7 @@ "aSk" = (/obj/structure/table/reinforced,/obj/machinery/button/remote/blast_door{id = "atmoslockdown"; name = "Atmospherics Lockdown"; pixel_x = 6; pixel_y = -12; req_access = list(10)},/obj/machinery/button/remote/blast_door{id = "englockdown"; name = "Engineering Lockdown"; pixel_x = -6; pixel_y = -12; req_access = list(10)},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/item/device/radio{pixel_x = -4},/turf/simulated/floor/carpet/oracarpet,/area/crew_quarters/heads/chief) "aSl" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/carpet/oracarpet,/area/crew_quarters/heads/chief) "aSm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/carpet/oracarpet,/area/crew_quarters/heads/chief) -"aSn" = (/obj/effect/floor_decal/techfloor/orange{dir = 8},/obj/machinery/door/window/brigdoor/westleft,/obj/machinery/telecomms/relay/preset/tether/station_mid,/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/heads/chief) +"aSn" = (/obj/structure/table/marble,/obj/item/weapon/hand_labeler,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/obj/machinery/floor_light/prebuilt{on = 1},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "cafe"; name = "Cafe Shutters"; pixel_x = -10; pixel_y = 10; req_access = list(); req_one_access = list(25)},/obj/item/weapon/reagent_containers/glass/rag,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) "aSo" = (/obj/structure/table/steel,/obj/item/device/taperecorder,/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/turf/simulated/floor/tiled,/area/security/security_processing) "aSp" = (/obj/structure/table/steel,/obj/item/weapon/hand_labeler,/obj/item/weapon/folder/red{pixel_x = 2; pixel_y = 4},/obj/item/weapon/folder/red,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/turf/simulated/floor/tiled,/area/security/security_processing) "aSq" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/security/security_processing) @@ -2332,7 +2332,7 @@ "aSR" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/clothing/glasses/welding/superior,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/book/manual/supermatter_engine,/turf/simulated/floor/carpet/oracarpet,/area/crew_quarters/heads/chief) "aSS" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet/oracarpet,/area/crew_quarters/heads/chief) "aST" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet/oracarpet,/area/crew_quarters/heads/chief) -"aSU" = (/obj/effect/floor_decal/techfloor/orange{dir = 10},/obj/structure/window/reinforced,/obj/machinery/door/window/brigdoor/westleft,/obj/machinery/telecomms/relay/preset/tether/station_high,/turf/simulated/floor/tiled/techfloor,/area/crew_quarters/heads/chief) +"aSU" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/tiled,/area/quartermaster/storage) "aSV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/multi_tile/metal/mait{name = "Security Processing"; req_access = list(1); req_one_access = list(12)},/obj/structure/disposalpipe/segment,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "security_lockdown"; name = "Security Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/security_processing) "aSW" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "security_lockdown"; name = "Security Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/security_processing) "aSX" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/sec_lower) @@ -2466,7 +2466,7 @@ "aVv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/structure/disposalpipe/segment,/obj/structure/railing,/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) "aVw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) "aVx" = (/obj/structure/railing{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) -"aVy" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/cargo,/obj/random/maintenance/medical,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/sec_upper) +"aVy" = (/obj/structure/closet,/obj/random/maintenance/security,/obj/random/maintenance/security,/obj/random/maintenance/clean,/obj/random/contraband,/obj/random/action_figure,/obj/random/action_figure,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/security_starboard) "aVz" = (/turf/simulated/floor/holofloor/tiled/dark,/area/hallway/station/starboard) "aVA" = (/turf/simulated/floor/tiled,/area/hallway/station/starboard) "aVB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/station/starboard) @@ -2659,7 +2659,7 @@ "aZg" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/white,/area/medical/virology) "aZh" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor/tiled/white,/area/medical/virology) "aZi" = (/obj/random/junk,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/medical/virology) -"aZj" = (/obj/structure/disposalpipe/segment,/obj/structure/closet,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/junk,/obj/random/tech_supply,/obj/random/maintenance/clean,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random_multi/single_item/netgun,/turf/simulated/floor,/area/maintenance/station/elevator) +"aZj" = (/obj/effect/floor_decal/rust,/obj/random/trash_pile,/turf/simulated/floor,/area/maintenance/security_starboard) "aZk" = (/obj/random/junk,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/medical/virology) "aZl" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/medical/virology) "aZm" = (/obj/structure/catwalk,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/evahallway) @@ -2680,7 +2680,7 @@ "aZB" = (/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "englockdown"; name = "Engineering Lockdown"; opacity = 0},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Mezzenine"; req_one_access = list()},/turf/simulated/floor/tiled/steel_grid,/area/engineering/foyer_mezzenine) "aZC" = (/obj/machinery/door/airlock/maintenance/engi,/obj/structure/cable{icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/hallway/station/port) "aZD" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/simulated/floor/tiled,/area/hallway/station/port) -"aZE" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/simulated/floor/tiled,/area/hallway/station/starboard) +"aZE" = (/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/machinery/vending/nifsoft_shop,/turf/simulated/floor/tiled,/area/hallway/station/starboard) "aZF" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/simulated/floor/tiled,/area/hallway/station/starboard) "aZG" = (/turf/simulated/wall/r_wall,/area/hallway/station/starboard) "aZH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/turf/simulated/floor/tiled,/area/hallway/station/starboard) @@ -2970,11 +2970,11 @@ "bff" = (/obj/structure/extinguisher_cabinet{pixel_x = -27},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/lightgrey/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/lightgrey/bordercorner2{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/turf/simulated/floor/tiled,/area/tether/station/stairs_two) "bfg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/tether/station/stairs_two) "bfh" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/tether/station/stairs_one) -"bfi" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/cargo,/obj/random/maintenance/medical,/obj/random/maintenance/clean,/obj/random/action_figure,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/sec_upper) +"bfi" = (/obj/structure/closet,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/drinkbottle,/obj/random/tool,/obj/random/maintenance/cargo,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/station/sec_upper) "bfj" = (/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/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/station/micro) "bfk" = (/turf/simulated/wall/r_wall,/area/medical/chemistry) "bfl" = (/obj/structure/table/glass,/obj/item/weapon/folder/white,/obj/item/weapon/hand_labeler,/obj/structure/extinguisher_cabinet{pixel_x = -27},/obj/item/device/radio{pixel_x = -4},/turf/simulated/floor/tiled/white,/area/medical/virology) -"bfm" = (/obj/structure/closet,/obj/random/maintenance/security,/obj/random/maintenance/security,/obj/random/maintenance/clean,/obj/random/contraband,/obj/random/action_figure,/obj/random/action_figure,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random_multi/single_item/netgun,/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/security_starboard) +"bfm" = (/obj/random/trash_pile,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/security_starboard) "bfn" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/red/border{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/lobby) "bfo" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/black,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/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/virology) "bfp" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Engine Output"; name_tag = "Engine Output"},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/engineering/engine_room) @@ -3006,7 +3006,7 @@ "bfP" = (/obj/machinery/light/small,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/tether/station/stairs_one) "bfQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/tether/station/stairs_two) "bfR" = (/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/tether/station/stairs_one) -"bfS" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/security,/obj/random/maintenance/clean,/obj/random/junk,/obj/effect/floor_decal/rust,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/security_starboard) +"bfS" = (/obj/structure/closet,/obj/random/maintenance/security,/obj/random/maintenance/clean,/obj/random/contraband,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/security_starboard) "bfT" = (/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/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/station/micro) "bfU" = (/turf/simulated/wall/r_wall,/area/maintenance/security_starboard) "bfV" = (/obj/machinery/door/window/brigdoor/westleft,/obj/machinery/door/window/brigdoor/eastleft,/obj/structure/table/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/monotile,/area/security/lobby) @@ -3302,7 +3302,7 @@ "blz" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/bridge_hallway) "blA" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/computer/crew{dir = 8},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 6},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 6},/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) "blB" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 5},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 5},/obj/item/weapon/storage/firstaid/regular{pixel_x = 0; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/reception) -"blC" = (/obj/structure/table/glass,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/white,/area/medical/reception) +"blC" = (/obj/structure/table/glass,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/item/device/sleevemate,/turf/simulated/floor/tiled/white,/area/medical/reception) "blD" = (/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 5; icon_state = "intact"; tag = "icon-intact (NORTHEAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/hallway/secondary/escape/medical_escape_pod_hallway) "blE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/plating,/area/hallway/secondary/escape/medical_escape_pod_hallway) "blF" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/medical/virologyaccess) @@ -3353,7 +3353,7 @@ "bmy" = (/obj/structure/shuttle/window,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/large_escape_pod1/station) "bmz" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) "bmA" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = -4; pixel_y = 0},/obj/item/weapon/wrench,/obj/random/medical/lite,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) -"bmB" = (/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,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) +"bmB" = (/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,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/item/weapon/reagent_containers/blood/empty,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/item/device/defib_kit,/obj/item/device/defib_kit,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) "bmC" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) "bmD" = (/obj/machinery/sleep_console,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) "bmE" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/light,/turf/simulated/shuttle/floor,/area/shuttle/large_escape_pod1/station) @@ -3368,7 +3368,7 @@ "bmN" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/flasher/portable,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) "bmO" = (/obj/machinery/camera/network/security,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) "bmP" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) -"bmQ" = (/obj/machinery/light{dir = 1},/obj/structure/table/rack,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) +"bmQ" = (/obj/machinery/light{dir = 1},/obj/structure/table/rack,/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/rubber,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) "bmR" = (/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) "bmS" = (/obj/structure/table/steel,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/security/lobby) "bmT" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/item/clothing/suit/storage/vest/heavy/officer,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) @@ -3460,9 +3460,9 @@ "boB" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) "boC" = (/obj/structure/table/rack,/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) "boD" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/seccarts{pixel_x = 3; pixel_y = 2},/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/tiled/dark,/area/security/security_equiptment_storage) -"boE" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(1)},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/security/armoury) +"boE" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/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/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(1)},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/security/armoury) "boF" = (/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/brigdoor/northright{name = "Ammo"},/obj/structure/table/rack,/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/stunshells,/obj/item/weapon/storage/box/stunshells,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/security/armoury) -"boG" = (/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/table/rack,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/structure/window/reinforced{dir = 8},/obj/item/ammo_magazine/mc9mmt,/obj/machinery/door/window/brigdoor/northleft{name = "LETHALS"; req_access = list(1)},/turf/simulated/floor/tiled/dark,/area/security/armoury) +"boG" = (/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/table/rack,/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/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/structure/window/reinforced{dir = 8},/obj/item/ammo_magazine/m9mmt,/obj/machinery/door/window/brigdoor/northleft{name = "LETHALS"; req_access = list(1)},/turf/simulated/floor/tiled/dark,/area/security/armoury) "boH" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/item/weapon/storage/box/shotgunshells,/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunammo,/obj/machinery/door/window/brigdoor/northright{name = "LETHALS"; req_access = list(1)},/turf/simulated/floor/tiled/dark,/area/security/armoury) "boI" = (/obj/machinery/light,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/door/window/brigdoor/eastleft{dir = 1},/obj/item/weapon/gun/projectile/shotgun/pump{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/projectile/shotgun/pump,/turf/simulated/floor/tiled/dark,/area/security/armoury) "boJ" = (/obj/machinery/camera/network/security{dir = 1},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/door/window/brigdoor/northright,/obj/item/weapon/gun/projectile/automatic/wt550,/turf/simulated/floor/tiled/dark,/area/security/armoury) @@ -3824,7 +3824,7 @@ "bvB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/catwalk,/turf/simulated/floor,/area/maintenance/cargo) "bvC" = (/obj/structure/disposalpipe/sortjunction/wildcard/flipped{dir = 1},/obj/structure/railing,/obj/structure/railing{dir = 8},/turf/simulated/floor,/area/maintenance/cargo) "bvD" = (/obj/structure/railing,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/cargo) -"bvE" = (/obj/structure/railing,/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/maintenance/cargo) +"bvE" = (/obj/structure/railing{dir = 8},/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/maintenance/medical,/obj/random/junk,/obj/random/medical/lite,/obj/random/tool,/obj/random/maintenance/security,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) "bvF" = (/obj/structure/railing,/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/obj/structure/cable/green{icon_state = "0-4"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/cargo) "bvG" = (/obj/structure/railing,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/closet/crate,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/junk,/obj/random/tech_supply,/obj/random/maintenance/cargo,/obj/random/action_figure,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/cargo) "bvH" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/security/range) @@ -3839,7 +3839,7 @@ "bvQ" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security"},/obj/machinery/light{dir = 8},/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "bvR" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{dir = 2; pixel_x = 10; pixel_y = 12},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) "bvS" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/hos,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) -"bvT" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills{pixel_y = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) +"bvT" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills{pixel_y = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/item/weapon/paper{desc = ""; info = "The Chief of Security at CentCom is debating a new policy. It's not official yet, and probably won't be since it's hard to enforce, but I suggest following it anyway. That policy is, if a security officer claims they need more than two extra magazines (or batteries) to go on normal patrols, fire them. If they cannot subdue a single suspect using all that ammo, they are not competent as Security.
-Jeremiah Acacius"; name = "note to the Head of Security"},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) "bvU" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "bvV" = (/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor/tiled/white,/area/security/forensics) "bvW" = (/turf/simulated/floor/tiled/white,/area/security/forensics) @@ -3888,7 +3888,7 @@ "bwN" = (/obj/machinery/door/airlock/maintenance/cargo{req_access = list(50); req_one_access = list(48)},/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/quartermaster/delivery) "bwO" = (/turf/simulated/wall,/area/quartermaster/office) "bwP" = (/obj/machinery/door/window/northright,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/camera/network/security{dir = 4},/turf/simulated/floor/tiled/dark,/area/security/range) -"bwQ" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/projectile/shotgun/pump/rifle/practice,/obj/item/ammo_magazine/clip/a762/practice,/obj/item/ammo_magazine/clip/a762/practice,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/security/range) +"bwQ" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/projectile/shotgun/pump/rifle/practice,/obj/item/ammo_magazine/clip/c762/practice,/obj/item/ammo_magazine/clip/c762/practice,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/security/range) "bwR" = (/obj/machinery/door/window/northright,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/security/range) "bwS" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/security/range) "bwT" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/item/weapon/gun/energy/laser/practice,/turf/simulated/floor/tiled/dark,/area/security/range) @@ -3939,7 +3939,7 @@ "bxM" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/red/border,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/closet/secure_closet/hos2,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "bxN" = (/obj/structure/closet/secure_closet/hos,/obj/item/clothing/suit/space/void/security/fluff/hos{armor = list("melee" = 70, "bullet" = 60, "laser" = 60, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 10); species_restricted = null},/obj/item/clothing/head/helmet/space/void/security/fluff/hos{armor = list("melee" = 70, "bullet" = 60, "laser" = 60, "energy" = 50, "bomb" = 50, "bio" = 100, "rad" = 10); species_restricted = null},/obj/effect/floor_decal/borderfloorblack{dir = 6},/obj/effect/floor_decal/corner/red/border{dir = 6},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "bxO" = (/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor/tiled/white,/area/security/forensics) -"bxP" = (/obj/structure/closet,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/drinkbottle,/obj/random/tool,/obj/random/maintenance/cargo,/obj/effect/floor_decal/rust,/obj/random_multi/single_item/netgun,/obj/random_multi/single_item/teleport,/turf/simulated/floor,/area/maintenance/station/sec_upper) +"bxP" = (/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor,/area/medical/virology) "bxQ" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/red/border,/obj/structure/closet{name = "Evidence Closet"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled/white,/area/security/forensics) "bxR" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/red/border,/obj/structure/closet{name = "Evidence Closet"},/turf/simulated/floor/tiled/white,/area/security/forensics) "bxS" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/red/border,/obj/structure/table/reinforced,/obj/item/weapon/hand_labeler,/obj/structure/window/reinforced{dir = 8},/obj/machinery/camera/network/security{dir = 1},/turf/simulated/floor/tiled/white,/area/security/forensics) @@ -3950,7 +3950,7 @@ "bxX" = (/turf/simulated/floor,/area/maintenance/station/sec_upper) "bxY" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/station/sec_upper) "bxZ" = (/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/reception) -"bya" = (/obj/structure/plasticflaps{opacity = 0},/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor,/area/quartermaster/delivery) +"bya" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -32},/obj/structure/closet/secure_closet/chemical{req_access = list(64); req_one_access = list(5)},/turf/simulated/floor/carpet/blue,/area/medical/psych) "byb" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 9},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 9},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled/white,/area/medical/reception) "byc" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; name = "Sorting Office"; sortType = "Sorting Office"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/brown/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/delivery) "byd" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/obj/structure/cable/green{icon_state = "0-8"},/obj/machinery/camera/network/cargo,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/brown/border{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/delivery) @@ -4000,8 +4000,8 @@ "byV" = (/obj/structure/bed/chair/comfy/brown,/obj/structure/noticeboard{pixel_y = 27},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/brown/border{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/office) "byW" = (/obj/effect/floor_decal/steeldecal/steel_decals6{dir = 8},/obj/structure/disposalpipe/junction,/turf/simulated/floor/tiled/white,/area/medical/reception) "byX" = (/obj/structure/table/reinforced,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = -28},/obj/item/clothing/ears/earmuffs{pixel_x = -3; pixel_y = -2},/obj/item/clothing/ears/earmuffs,/obj/item/clothing/ears/earmuffs,/turf/simulated/floor/tiled,/area/security/range) -"byY" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/blanks{pixel_x = 2; pixel_y = -2},/obj/item/weapon/storage/box/blanks,/obj/item/ammo_magazine/clip/a762/practice,/turf/simulated/floor/tiled,/area/security/range) -"byZ" = (/obj/structure/table/reinforced,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/device/radio/intercom{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/security/range) +"byY" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/blanks{pixel_x = 2; pixel_y = -2},/obj/item/weapon/storage/box/blanks,/obj/item/ammo_magazine/clip/c762/practice,/turf/simulated/floor/tiled,/area/security/range) +"byZ" = (/obj/structure/table/reinforced,/obj/item/ammo_magazine/m9mmt/practice,/obj/item/ammo_magazine/m9mmt/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/device/radio/intercom{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled,/area/security/range) "bza" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs{pixel_x = -2; pixel_y = -2},/turf/simulated/floor/tiled,/area/security/range) "bzb" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/security/range) "bzc" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/hallway) @@ -4048,7 +4048,7 @@ "bzR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor/glass,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "security_lockdown"; name = "Security Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/security/hallway) "bzS" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; layer = 2.8; name = "Security Wing"; req_access = list(1)},/turf/simulated/floor/tiled/steel_grid,/area/security/hallway) "bzT" = (/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/glass_security{id_tag = "BrigFoyer"; layer = 2.8; name = "Security Wing"; req_access = list(1)},/turf/simulated/floor/tiled/steel_grid,/area/security/hallway) -"bzU" = (/obj/structure/closet/crate,/obj/random/maintenance/security,/obj/random/maintenance/clean,/obj/random/toy,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/security_starboard) +"bzU" = (/obj/random/trash_pile,/turf/simulated/floor,/area/crew_quarters/sleep/cryo) "bzV" = (/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 6},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 5},/turf/simulated/floor/tiled,/area/security/lobby) "bzW" = (/obj/machinery/computer/security{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 8},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 10},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 8},/turf/simulated/floor/tiled,/area/security/lobby) "bzX" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/security{name = "Briefing Room"; req_access = list(1)},/turf/simulated/floor/tiled/steel_grid,/area/security/briefing_room) @@ -4079,7 +4079,7 @@ "bAw" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/clipboard,/obj/item/weapon/pen/red{pixel_x = 2; pixel_y = 6},/obj/structure/table/standard,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/brown/border{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) "bAx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/quartermaster/office) "bAy" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office) -"bAz" = (/obj/structure/closet,/obj/random/maintenance/security,/obj/random/maintenance/clean,/obj/random/contraband,/obj/random_multi/single_item/netgun,/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/security_starboard) +"bAz" = (/obj/random/trash_pile,/turf/simulated/floor,/area/maintenance/station/cargo) "bAA" = (/obj/structure/catwalk,/obj/effect/decal/cleanable/dirt,/obj/machinery/door/airlock/security{locked = 1; welded = 1},/turf/simulated/floor,/area/maintenance/security_starboard) "bAB" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/reception) "bAC" = (/turf/simulated/wall/r_wall,/area/security/lobby) @@ -4165,7 +4165,7 @@ "bCe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled,/area/security/lobby) "bCf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals6,/obj/effect/floor_decal/steeldecal/steel_decals6{dir = 4},/turf/simulated/floor/tiled,/area/security/lobby) "bCg" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 9},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception) -"bCh" = (/obj/structure/railing{dir = 8},/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/maintenance/medical,/obj/random/junk,/obj/random/medical/lite,/obj/random/tool,/obj/random/maintenance/security,/obj/effect/decal/cleanable/dirt,/obj/random_multi/single_item/netgun,/turf/simulated/floor/plating,/area/maintenance/station/eng_upper) +"bCh" = (/obj/structure/cable{icon_state = "2-8"},/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/station/cargo) "bCi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/lobby) "bCj" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/security/lobby) "bCk" = (/obj/structure/railing{dir = 8},/obj/structure/closet,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/maintenance/medical,/obj/random/tool,/turf/simulated/floor,/area/maintenance/station/eng_lower) @@ -4193,7 +4193,7 @@ "bCG" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/red/border{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/lobby) "bCH" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/security/lobby) "bCI" = (/obj/structure/closet/crate,/obj/random/contraband,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/medical/virology) -"bCJ" = (/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/turf/simulated/floor,/area/crew_quarters/sleep/cryo) +"bCJ" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{icon_state = "4-8"},/obj/structure/closet/crate,/obj/random/maintenance/cargo,/obj/random/maintenance/medical,/obj/effect/floor_decal/rust,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/cargo) "bCK" = (/obj/structure/cable{icon_state = "4-8"},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/research,/obj/random/junk,/obj/random/maintenance/cargo,/obj/effect/floor_decal/rust,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/cargo) "bCL" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/security/lobby) "bCM" = (/obj/structure/table/steel,/obj/item/weapon/storage/box/donut,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/red/border{dir = 4},/turf/simulated/floor/tiled,/area/security/lobby) @@ -4228,13 +4228,13 @@ "bDp" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/red/border{dir = 10},/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/effect/floor_decal/corner/red/bordercorner2{dir = 9},/obj/machinery/computer/guestpass{dir = 4; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled,/area/security/lobby) "bDq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/steeldecal/steel_decals6{dir = 8},/turf/simulated/floor/tiled,/area/security/lobby) "bDr" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals6,/turf/simulated/floor/tiled,/area/security/lobby) -"bDs" = (/obj/structure/closet,/obj/random/maintenance/cargo,/obj/random/maintenance/engineering,/obj/random/junk,/obj/random/tool,/obj/effect/decal/cleanable/dirt,/obj/random_multi/single_item/netgun,/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/cargo) -"bDt" = (/obj/structure/cable{icon_state = "2-8"},/obj/structure/closet/crate,/obj/random/maintenance/cargo,/obj/random/maintenance/medical,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/cargo) -"bDu" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{icon_state = "4-8"},/obj/structure/closet/crate,/obj/random/maintenance/cargo,/obj/random/maintenance/medical,/obj/effect/floor_decal/rust,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/cargo) +"bDs" = (/obj/random/trash_pile,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/station/micro) +"bDt" = (/obj/random/trash_pile,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/bridge) +"bDu" = (/obj/effect/floor_decal/rust,/obj/random/trash_pile,/turf/simulated/floor,/area/teleporter/departing) "bDv" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/junk,/turf/simulated/floor,/area/crew_quarters/sleep/cryo) "bDw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green,/turf/simulated/floor/plating,/area/security/lobby) "bDx" = (/turf/simulated/wall/r_wall,/area/teleporter/departing) -"bDy" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/cargo,/obj/random/maintenance/cargo,/obj/random/junk,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/cargo) +"bDy" = (/obj/random/trash_pile,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/security_starboard) "bDz" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/red/border,/turf/simulated/floor/tiled,/area/security/lobby) "bDA" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/crew_quarters/sleep/cryo) "bDB" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/simple_animal/mouse,/turf/simulated/floor,/area/crew_quarters/sleep/cryo) @@ -4306,7 +4306,7 @@ "bEP" = (/obj/machinery/status_display{pixel_y = 30},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/turf/simulated/floor/tiled,/area/hallway/station/upper) "bEQ" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/turf/simulated/floor/tiled,/area/hallway/station/upper) "bER" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals7,/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 4},/obj/item/device/radio/intercom{pixel_y = 24; req_access = list()},/turf/simulated/floor/tiled,/area/hallway/station/upper) -"bES" = (/obj/structure/closet/crate{icon_state = "crate"; name = "Grenade Crate"; opened = 0},/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/machinery/light_switch{dir = 1; pixel_x = 4; pixel_y = -24},/obj/effect/floor_decal/borderfloorwhite/corner2,/obj/effect/floor_decal/corner/paleblue/bordercorner2,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "chemistry"; name = "Chemistry Shutters"; pixel_x = -6; pixel_y = -24; req_access = list(5)},/turf/simulated/floor/tiled/white,/area/medical/chemistry) +"bES" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/machinery/light_switch{dir = 1; pixel_x = 4; pixel_y = -24},/obj/effect/floor_decal/borderfloorwhite/corner2,/obj/effect/floor_decal/corner/paleblue/bordercorner2,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "chemistry"; name = "Chemistry Shutters"; pixel_x = -6; pixel_y = -24; req_access = list(5)},/turf/simulated/floor/tiled/white,/area/medical/chemistry) "bET" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{dir = 4; pixel_x = -24},/obj/machinery/photocopier,/turf/simulated/floor/tiled/dark,/area/bridge) "bEU" = (/obj/structure/cable{icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/maintenance/common,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/station/elevator) "bEV" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/lightgrey{dir = 6},/obj/effect/floor_decal/corner/lightgrey{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/simulated/floor/tiled,/area/hallway/station/upper) @@ -4404,7 +4404,7 @@ "bGJ" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/wood,/area/medical/psych) "bGK" = (/obj/structure/cable{icon_state = "1-4"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/cargo) "bGL" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/medical,/turf/simulated/floor,/area/crew_quarters/sleep/cryo) -"bGM" = (/obj/structure/closet/crate,/obj/random/maintenance/medical,/obj/random/junk,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/station/micro) +"bGM" = (/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/toy,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/security_starboard) "bGN" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/obj/random/tech_supply,/turf/simulated/floor,/area/hallway/station/docks) "bGO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/techfloor,/area/medical/morgue) "bGP" = (/obj/machinery/computer/supplycomp{dir = 4},/obj/machinery/camera/network/cargo{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/qm) @@ -4442,7 +4442,7 @@ "bHv" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/cargo) "bHw" = (/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/station/cargo) "bHx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/station/cargo) -"bHy" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/medical,/obj/random/maintenance/clean,/obj/random/maintenance/cargo,/obj/random/maintenance/security,/turf/simulated/floor,/area/maintenance/station/bridge) +"bHy" = (/obj/effect/decal/cleanable/dirt,/obj/random/trash_pile,/turf/simulated/floor,/area/hallway/station/docks) "bHz" = (/obj/machinery/computer/security/mining{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/qm) "bHA" = (/turf/simulated/floor/tiled,/area/quartermaster/qm) "bHB" = (/obj/structure/table/standard,/obj/item/weapon/clipboard,/obj/item/weapon/stamp/qm,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/qm) @@ -4480,7 +4480,7 @@ "bIh" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/station/cargo) "bIi" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/station/cargo) "bIj" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/random/junk,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/cargo) -"bIk" = (/obj/structure/closet,/obj/random_multi/single_item/netgun,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/research,/obj/random/medical/lite,/obj/random/junk,/turf/simulated/floor,/area/crew_quarters/sleep/cryo) +"bIk" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/station/medbay) "bIl" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/maintenance/station/cargo) "bIm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/quartermaster/qm) "bIn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/quartermaster/qm) @@ -4539,8 +4539,8 @@ "bJo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/quartermaster/storage) "bJp" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) "bJq" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/storage) -"bJr" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) -"bJs" = (/turf/simulated/floor,/area/quartermaster/storage) +"bJr" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Cargo"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/maintenance/substation/cargo) +"bJs" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Cargo Substation Bypass"},/turf/simulated/floor,/area/maintenance/substation/cargo) "bJt" = (/obj/structure/closet/wardrobe/black,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/newscaster{layer = 3.3; pixel_x = -27; pixel_y = 0},/obj/effect/floor_decal/corner_steel_grid{dir = 6},/turf/simulated/floor/tiled,/area/teleporter/departing) "bJu" = (/obj/effect/floor_decal/techfloor/orange{dir = 8},/turf/simulated/floor/tiled/techfloor,/area/teleporter/departing) "bJv" = (/obj/machinery/cryopod/robot/door/gateway,/turf/simulated/floor/tiled/techfloor,/area/teleporter/departing) @@ -4573,7 +4573,7 @@ "bJW" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/landmark/start{name = "Psychiatrist"},/turf/simulated/floor/carpet/blue,/area/medical/psych) "bJX" = (/obj/machinery/door/airlock/maintenance/medical{req_access = list(64)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor,/area/medical/psych) "bJY" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/cargo) -"bJZ" = (/obj/structure/closet/crate,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/junk,/obj/random/medical/lite,/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/cargo) +"bJZ" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/catwalk,/mob/living/simple_animal/mouse,/turf/simulated/floor,/area/maintenance/station/medbay) "bKa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/cargo) "bKb" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/station/cargo) "bKc" = (/turf/simulated/wall,/area/quartermaster/warehouse) @@ -4598,7 +4598,7 @@ "bKv" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/camera/network/medbay{dir = 4},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/effect/floor_decal/corner/paleblue{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) "bKw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/steeldecal/steel_decals6{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) "bKx" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/steeldecal/steel_decals6,/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) -"bKy" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -32},/obj/structure/closet/secure_closet/chemical,/turf/simulated/floor/carpet/blue,/area/medical/psych) +"bKy" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/light{dir = 1},/obj/structure/mirror{dir = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) "bKz" = (/obj/machinery/camera/network/medbay{dir = 1},/turf/simulated/floor/carpet/blue,/area/medical/psych) "bKA" = (/obj/machinery/light,/turf/simulated/floor/carpet/blue,/area/medical/psych) "bKB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/carpet/blue,/area/medical/psych) @@ -4616,7 +4616,7 @@ "bKN" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/vehicle/train/cargo/trolley,/obj/machinery/light{dir = 8},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/quartermaster/storage) "bKO" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled,/area/quartermaster/storage) "bKP" = (/obj/structure/catwalk,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/security_starboard) -"bKQ" = (/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/medical,/obj/random/junk,/obj/random/maintenance/medical,/obj/random/maintenance/security,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/teleporter/departing) +"bKQ" = (/obj/random/trash_pile,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/medbay) "bKR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bKS" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bKT" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) @@ -4652,7 +4652,7 @@ "bLx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bLy" = (/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/paleblue/bordercorner{dir = 4},/turf/simulated/floor/tiled,/area/medical/biostorage) "bLz" = (/obj/effect/floor_decal/steeldecal/steel_decals4,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) -"bLA" = (/obj/structure/window/basic{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/turf/simulated/floor/tiled,/area/medical/biostorage) +"bLA" = (/obj/structure/window/basic{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/obj/structure/closet/crate{icon_state = "crate"; name = "Grenade Crate"; opened = 0},/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/weapon/grenade/chem_grenade,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/igniter,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/obj/item/device/assembly/timer,/turf/simulated/floor/tiled,/area/medical/biostorage) "bLB" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/adv{pixel_x = 5; pixel_y = 5},/obj/item/weapon/storage/firstaid/adv,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/tiled,/area/medical/biostorage) "bLC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bLD" = (/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},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/tiled,/area/medical/biostorage) @@ -4693,7 +4693,7 @@ "bMm" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_medical{name = "Medbay Equipment"; req_access = list(5)},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bMn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/turf/simulated/floor/tiled/techfloor,/area/medical/morgue) "bMo" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/medical/biostorage) -"bMp" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/item/weapon/storage/toolbox/emergency,/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 8},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) +"bMp" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/item/weapon/storage/toolbox/emergency,/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 8},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 8},/obj/item/weapon/storage/box/nifsofts_medical,/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bMq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/medical/medbay_primary_storage) "bMr" = (/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/paleblue/border{dir = 6},/obj/effect/floor_decal/borderfloorwhite/corner2,/obj/effect/floor_decal/corner/paleblue/bordercorner2,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/flora/pottedplant/minitree,/turf/simulated/floor/tiled/white,/area/medical/reception) "bMs" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/item/weapon/wrench,/turf/simulated/floor/tiled/steel,/area/medical/biostorage) @@ -4737,8 +4737,8 @@ "bNe" = (/obj/machinery/computer/operating{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/surgery) "bNf" = (/obj/machinery/optable,/turf/simulated/floor/tiled/white,/area/medical/surgery) "bNg" = (/obj/item/stack/medical/advanced/bruise_pack{pixel_x = 2; pixel_y = 2},/obj/item/stack/medical/advanced/bruise_pack,/obj/structure/table/standard,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/white/border{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/item/weapon/surgical/bonegel,/obj/item/weapon/surgical/bonegel,/turf/simulated/floor/tiled/white,/area/medical/surgery) -"bNh" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Cargo Substation Bypass"},/turf/simulated/floor,/area/maintenance/substation/cargo) -"bNi" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Surface Civilian"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/maintenance/substation/cargo) +"bNh" = (/obj/structure/bookcase{name = "bookcase (Non-Fiction)"},/turf/simulated/floor/wood,/area/library) +"bNi" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{dir = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/toilet) "bNj" = (/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},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/yellow/full{dir = 4},/turf/simulated/floor/tiled,/area/medical/biostorage) "bNk" = (/obj/structure/closet/crate,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/quartermaster/warehouse) "bNl" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/steel,/area/quartermaster/warehouse) @@ -4749,7 +4749,7 @@ "bNq" = (/obj/machinery/status_display/supply_display{pixel_y = -32},/obj/machinery/conveyor{dir = 4; id = "QMLoad"},/turf/simulated/floor,/area/quartermaster/storage) "bNr" = (/obj/machinery/conveyor{dir = 5; id = "mining_inbound"},/turf/simulated/floor,/area/quartermaster/storage) "bNs" = (/obj/structure/table/glass,/obj/item/device/flashlight/pen{pixel_x = 3; pixel_y = 3},/obj/item/device/flashlight/pen{pixel_x = -3; pixel_y = -3},/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/resleeving) -"bNt" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/resleeving) +"bNt" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/machinery/alarm{pixel_y = 22},/obj/item/device/sleevemate,/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bNu" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bNv" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/medical/resleeving) "bNw" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled/white,/area/medical/resleeving) @@ -4800,7 +4800,7 @@ "bOp" = (/obj/effect/landmark/start{name = "Paramedic"},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bOq" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals4,/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bOr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals10,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 1},/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/simulated/floor/tiled/white,/area/medical/morgue) -"bOs" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/table/standard,/obj/structure/bedsheetbin,/turf/simulated/floor/tiled,/area/medical/biostorage) +"bOs" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/table/standard,/obj/structure/bedsheetbin,/obj/item/device/sleevemate,/turf/simulated/floor/tiled,/area/medical/biostorage) "bOt" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/obj/item/weapon/hand_labeler,/obj/item/weapon/packageWrap,/obj/item/device/radio/intercom{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bOu" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/beakers,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/cable/green{icon_state = "0-4"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -32},/obj/item/weapon/cane,/obj/item/weapon/cane,/turf/simulated/floor/tiled,/area/medical/biostorage) "bOv" = (/obj/effect/floor_decal/borderfloor{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/obj/structure/table/standard,/obj/item/clothing/gloves/sterile/nitrile,/obj/item/clothing/gloves/sterile/nitrile,/obj/item/device/defib_kit,/obj/item/device/defib_kit,/turf/simulated/floor/tiled,/area/medical/biostorage) @@ -4812,7 +4812,7 @@ "bOB" = (/obj/structure/table/standard,/obj/item/stack/nanopaste,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/white/border,/turf/simulated/floor/tiled/white,/area/medical/surgery) "bOC" = (/obj/structure/table/standard,/obj/item/weapon/surgical/cautery,/obj/item/weapon/surgical/FixOVein,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/white/border,/obj/machinery/button/windowtint{id = "surgeryobs"; pixel_y = -26},/turf/simulated/floor/tiled/white,/area/medical/surgery) "bOD" = (/obj/structure/table/standard,/obj/item/weapon/surgical/retractor,/obj/item/weapon/surgical/bonesetter,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/white/border,/turf/simulated/floor/tiled/white,/area/medical/surgery) -"bOE" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/paleblue/border{dir = 6},/obj/random/medical,/obj/random/medical,/obj/item/device/glasses_kit,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) +"bOE" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/paleblue/border{dir = 6},/obj/random/medical,/obj/random/medical,/obj/item/device/glasses_kit,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 28},/obj/item/weapon/storage/box/rxglasses,/obj/item/weapon/storage/box/rxglasses,/turf/simulated/floor/tiled/white,/area/medical/medbay_primary_storage) "bOF" = (/obj/structure/lattice,/obj/structure/cable/green{icon_state = "32-2"},/obj/machinery/door/firedoor/glass,/turf/simulated/open,/area/maintenance/station/medbay) "bOG" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/station/medbay) "bOH" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/engineering,/turf/simulated/floor,/area/hallway/station/docks) @@ -4868,8 +4868,8 @@ "bPF" = (/obj/structure/table/standard,/obj/item/weapon/surgical/retractor,/obj/item/weapon/surgical/bonesetter,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/white/border{dir = 1},/obj/machinery/light_switch{dir = 2; name = "light switch "; pixel_x = 0; pixel_y = 26},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bPG" = (/obj/structure/table/standard,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/hemostat,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/white/border{dir = 1},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bPH" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw,/obj/item/weapon/surgical/surgicaldrill,/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/white/border{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/surgery2) -"bPI" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/station/medbay) -"bPJ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/maintenance/station/medbay) +"bPI" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/catwalk,/turf/simulated/floor,/area/maintenance/station/medbay) +"bPJ" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/structure/railing{dir = 4},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/junk,/obj/random/maintenance/cargo,/obj/random/maintenance/medical,/turf/simulated/floor,/area/maintenance/station/medbay) "bPK" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/effect/floor_decal/rust,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/station/micro) "bPL" = (/obj/machinery/computer/transhuman/resleeving{dir = 1},/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/turf/simulated/floor/tiled/white,/area/medical/resleeving) "bPM" = (/obj/item/weapon/book/manual/resleeving,/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/medical/resleeving) @@ -4894,7 +4894,7 @@ "bQf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bQg" = (/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bQh" = (/obj/structure/table/standard,/obj/item/weapon/surgical/cautery,/obj/item/weapon/surgical/FixOVein,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/white/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/surgery2) -"bQi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/station/medbay) +"bQi" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/structure/catwalk,/turf/simulated/floor,/area/maintenance/station/medbay) "bQj" = (/turf/simulated/wall,/area/crew_quarters/heads/cmo) "bQk" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/machinery/recharger,/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{dir = 4; pixel_x = -24},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bQl" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/medical/sleeper) @@ -4929,7 +4929,7 @@ "bQO" = (/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/white/border{dir = 8},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 8},/obj/effect/floor_decal/corner/white/bordercorner2{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bQP" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bQQ" = (/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/white/border{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/surgery2) -"bQR" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/random/junk,/turf/simulated/floor,/area/maintenance/station/medbay) +"bQR" = (/obj/structure/railing{dir = 8},/obj/random/trash_pile,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/medbay) "bQS" = (/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/machinery/newscaster{layer = 3.3; pixel_x = -27; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bQT" = (/obj/structure/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Chief Medical Officer"},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the CMO's office."; id = "cmodoor"; name = "CMO Office Door Control"; pixel_x = -8; pixel_y = -36},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "virologyquar"; name = "Virology Emergency Lockdown Control"; pixel_x = 0; pixel_y = -28; req_access = list(5)},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "medbayquar"; name = "Medbay Emergency Lockdown Control"; pixel_x = 0; pixel_y = -36; req_access = list(5)},/obj/machinery/button/windowtint{id = "cmooffice"; pixel_x = -6; pixel_y = -28},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bQU" = (/obj/structure/table/glass,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) @@ -4964,8 +4964,8 @@ "bRx" = (/obj/structure/table/standard,/obj/item/device/healthanalyzer,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/white/border,/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},/turf/simulated/floor/tiled/white,/area/medical/surgery2) "bRy" = (/obj/effect/floor_decal/borderfloorblack{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 4},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 4},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled/dark,/area/medical/medbay_emt_bay) "bRz" = (/turf/simulated/floor/tiled,/area/medical/surgery_hallway) -"bRA" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/medbay) -"bRB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/crew_quarters/heads/cmo) +"bRA" = (/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/medbay) +"bRB" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/structure/bookcase{name = "bookcase (Reference)"},/turf/simulated/floor/wood,/area/library) "bRC" = (/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bRD" = (/obj/structure/table/glass,/obj/machinery/photocopier/faxmachine{department = "CMO's Office"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bRE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/mob/living/simple_animal/cat/fluff/Runtime,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) @@ -4980,7 +4980,7 @@ "bRN" = (/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/surgery_hallway) "bRO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) "bRP" = (/obj/structure/railing,/turf/simulated/open,/area/medical/surgery_hallway) -"bRQ" = (/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) +"bRQ" = (/obj/structure/bookcase{name = "bookcase (Reference)"},/turf/simulated/floor/wood,/area/library) "bRR" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bRS" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/machinery/light,/obj/machinery/requests_console{announcementConsole = 1; department = "Medical Department"; departmentType = 5; name = "Chief Medical Officer RC"; pixel_x = 0; pixel_y = -30},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bRT" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -32},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) @@ -5011,7 +5011,7 @@ "bSs" = (/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) "bSt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) "bSu" = (/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 4},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) -"bSv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/crew_quarters/heads/cmo) +"bSv" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/captain) "bSw" = (/obj/structure/sign/nosmoking_1,/turf/simulated/wall,/area/medical/sleeper) "bSx" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 9},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/borderfloorwhite/corner2,/obj/effect/floor_decal/corner/paleblue/bordercorner2,/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bSy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/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/sleeper) @@ -5028,7 +5028,7 @@ "bSJ" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/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 = 9; pixel_y = 0},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) "bSK" = (/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/paleblue/border{dir = 6},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/surgery_hallway) "bSL" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/obj/machinery/door/airlock/maintenance/medical,/turf/simulated/floor,/area/medical/surgery_hallway) -"bSM" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/station/medbay) +"bSM" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/random/junk,/obj/structure/catwalk,/turf/simulated/floor,/area/maintenance/station/medbay) "bSN" = (/turf/simulated/wall,/area/crew_quarters/medical_restroom) "bSO" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{pixel_y = 10},/obj/effect/floor_decal/steeldecal/steel_decals5,/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 6},/turf/simulated/floor/tiled/white,/area/crew_quarters/medical_restroom) "bSP" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/medical_restroom) @@ -5122,9 +5122,9 @@ "bUz" = (/obj/structure/table/glass,/obj/effect/floor_decal/corner/paleblue/diagonal,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bUA" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/corner/paleblue/diagonal,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/landmark/start{name = "Medical Doctor"},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bUB" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) -"bUC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/medical/patient_a) -"bUD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/medical/patient_b) -"bUE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/medical/patient_c) +"bUC" = (/obj/machinery/photocopier,/turf/simulated/floor/wood,/area/bridge/meeting_room) +"bUD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced/polarized{dir = 10; icon_state = "fwindow"; id = "cmooffice_b"},/turf/simulated/floor/plating,/area/crew_quarters/heads/cmo) +"bUE" = (/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/obj/machinery/button/windowtint{id = "cmooffice_b"; pixel_x = -20; pixel_y = -25},/turf/simulated/floor/tiled/white,/area/crew_quarters/heads/cmo) "bUF" = (/obj/structure/grille,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced/polarized{dir = 10; icon_state = "fwindow"; id = "mrecovery-tint"},/turf/simulated/floor/plating,/area/medical/sleeper) "bUG" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals10,/obj/machinery/door/airlock/medical{id_tag = "MedicalRecovery"; name = "Recovery Room"},/turf/simulated/floor/tiled/white,/area/medical/sleeper) "bUH" = (/obj/effect/floor_decal/corner/paleblue/diagonal,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) @@ -5220,7 +5220,7 @@ "bWt" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 8},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/ward) "bWu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/crew_quarters/medical_restroom) "bWv" = (/obj/structure/undies_wardrobe,/turf/simulated/floor/tiled/white,/area/medical/recoveryrestroom) -"bWw" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/medical/exam_room) +"bWw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced/polarized{dir = 10; icon_state = "fwindow"; id = "cmooffice_b"},/turf/simulated/floor/plating,/area/crew_quarters/heads/cmo) "bWx" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/turf/simulated/floor/plating,/area/medical/recoveryrestroom) "bWy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/medical_restroom) "bWz" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/ward) @@ -5235,23 +5235,31 @@ "bWI" = (/obj/machinery/camera/network/medbay{dir = 1},/obj/effect/floor_decal/corner/paleblue/diagonal,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bWJ" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/corner/paleblue/diagonal,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bWK" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) -"bWL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/medical/ward) +"bWL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced/polarized{dir = 10; icon_state = "fwindow"; id = "exam_room"},/turf/simulated/floor/plating,/area/medical/exam_room) "bWM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/crew_quarters/medbreak) "bWN" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled/monotile,/area/bridge_hallway) "bWO" = (/obj/structure/closet,/obj/random/maintenance/medical,/obj/random/junk,/obj/random/tool,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/station/micro) "bWP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/sortjunction/flipped{dir = 4; name = "Morgue"; sortType = "Morgue"},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals4{dir = 4},/turf/simulated/floor/tiled/white,/area/hallway/secondary/escape/medical_escape_pod_hallway) "bWQ" = (/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/medical,/obj/random/junk,/obj/random/firstaid,/obj/random/medical/lite,/obj/random/maintenance/medical,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/security_starboard) "bWR" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/clean,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/medical/lite,/obj/random/tool,/obj/random/maintenance/medical,/obj/effect/decal/cleanable/dirt,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/security_starboard) -"bWS" = (/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/medical,/obj/random/junk,/obj/random/firstaid,/obj/random/tool,/obj/random/maintenance/medical,/obj/random/plushie,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random_multi/single_item/netgun,/obj/random_multi/single_item/teleport,/turf/simulated/floor,/area/maintenance/security_starboard) -"bWT" = (/obj/structure/closet,/obj/random/maintenance/clean,/obj/random/maintenance/medical,/obj/random/maintenance/medical,/obj/random/toy,/obj/effect/decal/cleanable/dirt,/obj/random_multi/single_item/netgun,/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/security_starboard) +"bWS" = (/obj/random/trash_pile,/turf/simulated/floor,/area/maintenance/station/bridge) +"bWT" = (/obj/structure/cable{icon_state = "1-8"},/obj/effect/floor_decal/rust,/turf/simulated/floor,/area/maintenance/station/bridge) "bWU" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/lightgrey/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/turf/simulated/floor/tiled,/area/hallway/station/docks) -"bWV" = (/obj/structure/closet/crate,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/obj/random/maintenance/medical,/obj/random/toy,/obj/random/tech_supply,/turf/simulated/floor,/area/hallway/station/docks) +"bWV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/obj/structure/catwalk,/turf/simulated/floor,/area/maintenance/station/medbay) "bWW" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/clean,/obj/random/maintenance/medical,/obj/random/tool,/turf/simulated/floor,/area/hallway/station/docks) -"bWX" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/cargo,/obj/random/maintenance/clean,/obj/random/junk,/obj/random/maintenance/cargo,/obj/random/maintenance/medical,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/station/medbay) +"bWX" = (/obj/structure/railing{dir = 8},/obj/effect/decal/cleanable/dirt,/obj/random/junk,/turf/simulated/floor,/area/maintenance/station/medbay) "bWY" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/maintenance/medical,/obj/random/junk,/obj/random/maintenance/medical,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/medbay) -"bWZ" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/mob/living/simple_animal/mouse,/turf/simulated/floor,/area/maintenance/station/medbay) -"bXa" = (/obj/structure/closet,/obj/random/maintenance/medical,/obj/random/junk,/obj/random/maintenance/medical,/obj/random/toy,/obj/random/action_figure,/obj/effect/decal/cleanable/dirt,/obj/effect/floor_decal/rust,/obj/random_multi/single_item/netgun,/obj/random_multi/single_item/teleport,/obj/random/maintenance/clean,/obj/random/maintenance/clean,/turf/simulated/floor,/area/maintenance/station/medbay) +"bWZ" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/floor_decal/rust,/obj/structure/catwalk,/turf/simulated/floor,/area/maintenance/station/medbay) "bXb" = (/obj/machinery/alarm{pixel_y = 22},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/mouse,/turf/simulated/floor,/area/maintenance/substation/command) +"bXc" = (/obj/structure/closet/secure_closet/brig{id = "Cell 1"},/obj/effect/floor_decal/industrial/outline,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/brig) +"bXd" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/flasher{id = "Cell 1"; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/security/brig) +"bXe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/flasher{id = "Cell 2"; pixel_x = -28; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/security/brig) +"bXf" = (/obj/structure/closet/secure_closet/brig{id = "Cell 2"},/obj/effect/floor_decal/industrial/outline,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/security/brig) +"bXg" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_security{name = "Security Cells"; req_access = list(1)},/turf/simulated/floor/tiled/steel_grid,/area/security/prison) +"bXh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced/polarized{dir = 10; icon_state = "fwindow"; id = "pr1_window_tint"},/turf/simulated/floor/plating,/area/medical/patient_a) +"bXi" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced/polarized{dir = 10; icon_state = "fwindow"; id = "pr2_window_tint"},/turf/simulated/floor/plating,/area/medical/patient_b) +"bXj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced/polarized{dir = 10; icon_state = "fwindow"; id = "pr3_window_tint"},/turf/simulated/floor/plating,/area/medical/patient_c) +"bXk" = (/obj/structure/grille,/obj/machinery/door/firedoor/glass,/obj/structure/window/reinforced,/obj/structure/window/reinforced/polarized{dir = 10; icon_state = "fwindow"; id = "mrecovery-tint"},/turf/simulated/floor/plating,/area/medical/ward) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -5290,11 +5298,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZabZabZabZabZabZabZab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZacyaczacAacBacCacDacEacFacGacHacIadEaaUabiacKacLaaUacMacNacOacPacQaaVacRacRacRacRacRacRacRacRacRachabCaacaacaacaacaacaclacmacmacmacmacmacmacSacTaclacUacVabYacWacXacYacZacYadaadbadcabYaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabZaddadeadfadgadhadiadjadkadladmadnadoaaUadpadqadradsadtaduabnabnabnaaVadvadwadxadyadzadAadBadCacRacjabCaacaacaacaacaacaclacmacmacmacmacmacmadDadJadFadGadHadIafXadKadLadMadNabYadOadPabYaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQadRadSadTadUadVadWadXadYadZaeaaebaecaaUaaUaedaeeaaUaefaegabnaehaeiaaVaejaekaelaemaemaenaemaeoacRaciabCaacaacaacaacaacaclaclaclaclaclaclaclaclaclaclaepaeqaeraeraeraeraeraeraeraeraeraeraacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaesaetaeuaevaewaewaexaeyaezaeAaeBaeCaeDaeEaecaaUaaUaeFaaUaaUaaVaeGaaVaaVaaVaaVaeHaemaeIaemaemaeJaemaeKacRaciabCaacaacaacaacaacaeLaeMaeMaeMaeMaeMaeMaeNaeOaeLaePaeQaeraeRaeSaeTaeUaeVaeraeWaeXaeraacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacabZabZabZabZabZabZabZabZabZaeYaeZafaafbafcafdafeaffafgafhafiafjafkaflafmafnafoafoafpafqafrafsaftacRaciabCaacaacaacaacaacaeLaeMaeMaeMaeMaeMaeMafuafvaeLafwafxaerafyafzafAafBafAafCafDafEaerafFafFafFafFafFafFafFafFafFaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaesaetaeuaevaewaewaexaeyaezaeAaeBaeCaeDaeEaecaaUaaUaeFaaUaaUaaVaeGaaVaaVaaVaaVaeHaemaeIaemaemaeJaemaeKacRaciabCaacaacaacaacaacaeLaeMaeMaeMaeMaeMaeMaeNaeOaeLaePaeQaeraeRaeSaeTaeUaeVaeraflaeXaeraacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacabZabZabZabZabZabZabZabZabZaeYaeZafaafbafcafdafeaffafgafhafiafjafkahaafmafnafoafoafpafqafrafsaftacRaciabCaacaacaacaacaacaeLaeMaeMaeMaeMaeMaeMafuafvaeLafwafxaerafyafzafAafBafAafCafDafEaerafFafFafFafFafFafFafFafFafFaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaikafGafHafIafJafKafHafHafLafHafHafHafHafMafNafOafPafQafRaemaemafSafSafTafUafVacRaciabCaacaacaacaacaacaeLaeMaeMaeMaeMaeMaeMafWaiXafYadGadHafZaluagbagcagdageaeragfaggaeraghagiagjagkaglagmagnagoafFaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacacaafGafHagpagpagqagpagpagragpagpagpagqagsagtaguagvagwagxagxagyagxagxagzaemamjacRacjabCaacaacaacaacaacaeLaeLaeLaeLaeLaeLaeLaeLaeLaeLagBagCaeraeraeraeraeraeraeraeraeraeragDagEagEagEagEagEagFagGafFaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacagHagHagHagHagHagHagHagHagHagHagHagHagHagHagHagHagHagIagJafHagKagLagMaemaemaemaemaemaemagNacRaciabCaacaacaacaacaacagOagPagPagPagPagPagPagQagRagOagSagTagUagVagWagXagYagZagUahaahbagUahcahdaheahfahgahhagFahiafFaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacagHagHagHagHagHagHagHagHagHagHagHagHagHagHagHagHagHagIagJafHagKagLagMaemaemaemaemaemaemagNacRaciabCaacaacaacaacaacagOagPagPagPagPagPagPagQagRagOagSagTagUagVagWagXagYagZagUaCQahbagUahcahdaheahfahgahhagFahiafFaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagHahjahkahlahjahmahjahlahjahnahoahpahqahrahsahtagHahuagJafHahvahwahxaemahyahzahAahBahCahCacRacjabCaacaacaacaacaacagOagPagPagPagPagPagPahDahEagOacUacVagUahFahGahHahIahHahJahKahLagUahMahNahOahPahQahRagFahSafFaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTahTahTahTahTahTahUagHahjahjahjahVahWahWahWahWahXahYahZahWaiaaibaicaidaieaifafHaigaihaihaihaihaihaihaihaihaihaiiacjabCaacaacaacaacaacagOagPagPagPagPagPagPaijaqFailadGadHaimavTaioaipaiqairagUaisaitagUaiuahNaivahPahQaiwagFaixafFaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaahTaiyaizaizaizaizaiAaiBaiCaiDaiEaiFaiGahVaiHaiIaiJaiKaiKaiKaiKaiKaiKaiKaiLaiMaiNaiOaiPaiQaiRaiSaiTaiUaiVaiWaihaxbaciabCaacaacabCabCabCagOagOagOagOagOagOagOagOagOagOaiYaiZagUagUagUagUagUagUagUagUagUagUajaahNajbajcajdajeagFajfafFaacaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -5306,33 +5314,33 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagHamgamhamiag aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamMagHamNamOamPamQamRamSamTahjamUamVamWamXamYamZanaanbancandaneanfaihanganhanianianjankanlaihalNalPanmannalOanoanpanqanransalVamGantanuamGamGanvanwanxamGamGanyanzanuanAamGamGanBanCamKameameameameameameameameameameanDamfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanEanFanGanHanIanJanKanLanManNanOanPaqZanRanSanTanUanVanWanXanYaihaihaihaihanZaihaihaihaihaoaaobaocaodalOaoeaofaogalRaohalVamGaoiaojamGamGamGamGamGamGamGamGaokaolanwamGamGanBaomamKameameameameameameameameameamealyamfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamMagHaonamOaooaopaoqaoraosahjaotamVaouamXaovaowaoxanbaoyaozaoAaoBaoCaoDaoEaoFaoGaoHaoIaoJaRzaoLalOalOalOalOaoMaoMalRalRaoNalVamGamGamFaoOaoPaoQaoPaoQaoQaoPaoPamFamGaoRamGamGanBaoSaoTameameameameameameameameameamealyaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagHamgamhamiagHaoUalBaoVahjamkamVaoWaoXaoYaoZapaamrapbapcanXaoBapdaoGapeapfaoGaoHaciapgacjaphapiapiapiapiapiapiapjapkaplalVamGamGamGaoPatDarYavzarYarYavBaoPamGamGamGamGamGanBapoappameameameameameameameameameamealyaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagHamgamhamiagHaoUalBaoVahjamkamVaoWaoXaoYaoZapaamrapbapcanXaoBapdaoGapeapfaoGaoHaOQapgacjaphapiapiapiapiapiapiapjapkaplalVamGamGamGaoPatDarYavzarYarYavBaoPamGamGamGamGamGanBapoappameameameameameameameameameamealyaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahUahTahTahTahTahTahTahTahUagHapqapraprapsaptalBapuapvapwalDalDalDalDapxalDapyapzapAapBapCapDapEapFapGapHapIapJapKapLapMapiapNapNapNapNapialValValValVamGamGamGaoQatDalValVapOalVavBaoQamGanvanwanxamGanBapPamKameameameameameameameameameamealyamfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaiyaizapQapQaizapRaaaaaaagHapSalzapTapUamSapVapWapXapYapZaqaaqbaqcaqdaqeaqfaqgaqhaqiaqjaqkaqlaoGapfaqmaoHaqnaqoaqpaqqapiapNapNapNapNapNalValValValVamGamGamGaoQatDalVaqraqsalVavBaoQamGanvaqtanxamGanBaquamKameameameameameameameameameameaqvamfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaqwapQaqxaqyapQaqzaaaaaaagHaqAaqBaqCaqDaqBaqCaqEbfpaqGaqHaqIaqJaqKaqLaqMapZaqNaqOaqPaqQaqRaqPaqPaqSaqTaoHbvKaqVaqWaqXapiapNapNapNapNapNalValValValVamGamGamGaoQatDalVaqYawqalVavBaoQamGanvanwanxamGanBaraamKameameameameameameameameameamearbamfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaiyaizapQapQaizapRaaaaaaagHapSalzapTapUamSapVapWapXapYapZaqaaqbaqcaqdaqeaqfaqgaqhaqiaqjaqkaqlaoGapfaqmaoHaqnaqoaqpaqqapiapNapNapNapNapNalValValValVamGamGamGaoQatDalVaqraqsaRHavBaoQamGanvaqtanxamGanBaquamKameameameameameameameameameameaqvamfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaqwapQaqxaqyapQaqzaaaaaaagHaqAaqBaqCaqDaqBaqCaqEbfpaqGaqHaqIaqJaqKaqLaqMapZaqNaqOaqPaqQaqRaqPaqPaqSaqTaoHbvKaqVaqWaqXapiapNapNapNapNapNalValValValVamGamGamGaoQatDalVaqYaSnalVavBaoQamGanvanwanxamGanBaraamKameameameameameameameameameamearbamfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaiyaizaqzaqwaizapRaaaaaaarcardarearfargarharfariarjarkarlarlarmarlarlarlarlarnaroarpaoBarqarrarsaoHaoHaoHartaruarvarwapiapNapNapNapNarxalValValValVamGamGamGaoQatDalValValValVavBaoQamGanvanwanxamGanBaraamKameameameameameameameameameamealyamfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTajgaizaqxaqyaizaryahUahTagHarzarAarBarCarAarDarEahjarFarGarHarIarJarKarLarMarNarOaoGarParQarQarRarSarSaoHarTbAlarVarWapiapiapiapiapiapiarXalValValVamGamGamGaoPatDawsawUawUawUavBaoPamGamGamGamGamGanBarZasaasaasaasaasaasaasaasaasbamKasbalyaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaiyaizaqzaqwapQapQapQaiAascasdaseasfasgashasiasjaskaskarGaslasmasnasoaspasqasrassastaoGaoGaoGasuaoGaqmaoHbByaswasxbBAaszaszaszaszaszaszasAalValValVamGamGamFaoPaoPaoPaoQaoQaoQaoPaoOamFamGanAamGamGanBaraasBasCasDasEasFasGasHasBasIasJasKalyaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaqwapQaqxaqyapQapQapQaiAasLasMasNasOasPasQasRasSaskaskarGasTasUasVasWasXarGasYasZataatbatcatdateatfatgaoHaqnbCkbCFbClaszatkatlatmatnaszaoNalValValVamGanzanuamGamGamGamGamGamGamGamGatoanuanwamGamGanBatpasBasCasDatqatrasGasHasBatsattatualyaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahUaiyaizaqzaqwaizapRahUahTagHagHagHagHagHagHagHagHagHagHarGarGarGarGarGarGatvatwatxatyatzaoHaoHaoHaoHaoHatAaszaszaszaszaszatBatCatCatCbhaaplalValValVamGaokaolaxvamGamGanvanwanxamGamGaokaolaoRamGamGanBaquasBasCasDatqatrasGasHasBatEalyalyalyaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTajgaizaqxaqyaizaryaaaatFatGatGatGatGatGatHatIatJatKatLatMatNatOatPatQatRatSatTatUatVatWatXatSatSatSatSatYatZauaaubatYaucaplaudalValValValValValVaueamFamGamGamHamGamGamGamGamGamGamGamGamGamGamGamFamIaufasBasBasBaugauhasBasBasBauibCJaukaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTajgaizaqxaqyaizaryaaaatFatGatGatGatGatGatHatIatJatKatLatMatNatOatPatQatRatSatTatUatVatWatXatSatSatSatSatYatZauaaubatYaucaplaudalValValValValValVaueamFamGamGamHamGamGamGamGamGamGamGamGamGamGamGamFamIaufasBasBasBaugauhasBasBasBauibzUaukaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaiyaizaryajgaizapRaaaaulaumaunauoaupauqaurausausautauuauvauwauwauxauyauzauAauBauCalXalXalXalXalXalXauDauEalXalXalXalXauFauGauHalXalXalXalXalXalXauIauDalXalXaxwalVauKalXalXalXalXalXalXalXalXalXauLauMauNauOauPauQauRauSauTauUasBauVbDvaukaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaahTaqwapQaqxaqyapQaqzaaaaulaulaunauXauYauZavaausausavbavcavdaveaveavfavgavhawGavjavkavlavmbieavnavoavpavqavravsavtavtavtavuavvavwavxavxavxavxavxavxavvavyaJQavAaOBavCavDavEavFavFavGavHavIavJavKavLavMavNavOavPavQavQavRavSbivauUasBbDBbDAaukaacaacaacaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaiyaizaqzaqwaizapRaacaulavVatGatGatGatGatGavWavXavYbiwawaawbawcawdaweaxmaxlawhawiawiawiawjawjawjawjawkawlawmaktaktaktawnawoawoawoawoawoawoawoawoawoawpaODawraYhawtawuawvawvawvawvawwawxawyawzawzawAawBawCasBasBasBasBasBasBasBasBauVbGLaukaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTajgaizaqxaqyaizaryaacaacaacaacaacaacaacatGatGatGatGatGatGatGatGatGaweaxoaxnbcEbcDbcFawiawJawKawLawjawMawNawOawPbGNawRawnawSawSawSawSawSawSawSawSawTawtaYNawVaDjawtawXawYawZawZawZawZawxaxabHyawzaxcanBaxdaxeaxfaxfaxgaxhaxgaxfaxfaxibIkaukaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTajgaizaqxaqyaizaryaacaacaacaacaacaacaacatGatGatGatGatGatGatGatGatGaweaxoaxnbcEbcDbcFawiawJawKawLawjawMawNawOawPbGNawRawnawSawSawSawSawSawSawSawSawTawtaYNawVaDjawtawXawYawZawZawZawZawxaxabDtawzaxcanBaxdaxeaxfaxfaxgaxhaxgaxfaxfaxibzUaukaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaqyapQaqzaqwapQaqxaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacawibfMbfhbfPbfObfRawiaxpaxqaxrawjaxsawNawOawPaxtbjSawnawSawTawSawSawSawSawSawSawSawtazhbWNblzawtaxyaxzaxAaxAaxAaxBawxaxabMhawzaxDalWaxEaukaukaukaukaukaukaukaukaukaukaukaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTajgaizaqxaqyaizaryaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacawiaxGawiaxFawEawEawiaxHaxIaxJaxKaxLaxMaxNawPaxObMiawnaxQaxRaxRaxRaxRaxRaxRaxRaxSawnaxTaxUaxVawxaxWaxXaxYaxZayaaybawxaycaydawzayeauJayfaygatCayhatCatCayiatCatCayjaktaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahUaiyaizaqzaqwaizapRaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacawiaylaymawiaykaykawiaynayoaypayqayraysaytayuayvbOHawnayxayyayzayAayBayCayDayEayFawnayGayHaxxawxayIayJayKayKayKayLawxayMayNawzayOayPayQayRalValValValValValValVaySaktaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaqwapQaqxaqyapQaqzaaaaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacawiawEayTawiawiawiawiayUayoayVawjayWawNawOawPayXayYawnayZazaazbazcazaazdazeazaazfazgazhaziazjazkazlayJazmaznazoazpawxaxaawzawzazqazrazsaztazuazvazwazvazvazxazyazzaktaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaiyaizaqzaqwaizapRaaaaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacawiazAazBawiawiawiawiazCazCazDawjazEawNbWUawPazFayYawnbETazHazIazHazHazHazJazHazKawnazLayHazMazNazOayJazPazQazRazSawxaxaawzazTazTazUbFBazWazTazTazTazXazXazXazYazXazXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTajgaizaqxaqyaizaryaaaaacaacaacaacaacawPawPawPawPawPawPawPawPawPawPawiawiawiawiawiawiawiawjawjawjawjazZaAaaAbawPbWWbWVawnaAeaAfaAgaAhaAiaAhaAjaAkaAlaAmaAnaAoaApaAqaAraAsayKaAtayKaAuawxaxaawzaAvaAwaAxaAyaAzaAAaAwaAvazXaABaACaADaAEazXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTajgaizaqxaqyaizaryaaaaacaacaacaacaacawPawPawPawPawPawPawPawPawPawPawiawiawiawiawiawiawiawjawjawjawjazZaAaaAbawPbWWbHyawnaAeaAfaAgaAhaAiaAhaAjaAkaAlaAmaAnaAoaApaAqaAraAsayKaAtayKaAuawxaxaawzaAvaAwaAxaAyaAzaAAaAwaAvazXaABaACaADbKyazXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaiyaizaqzaqwaizapRaaaaacaacaacaacaacawPaAFaAGaAHaAIaAIaAJaAIaAKaALaAMaANaAOaAPaAIaAIaAQaAKaARaASaATaAUawNaAVawPawPawPawnaAWazHaAXaAYazHazHaAZazHaBaawnaBbaBcaBdawxaBeaBfaBgaBhaBiaBjawxayMawzaBkaBkaBkaAyaAzaBkaBkaBlazXazXazXaBmaBnazXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaqwapQaqxaqyapQaqzaaaaacaacaacaacaacawPaAVaBoaBpaBqaBqaBqaBqaBqaBqaBraBqaBsaBqaBqaBqaBqaBqaBtaBsaBqaBuaBvaAVawPaacaacawnaBwaBxazHaByazHazHaBzazHazHaBAaBBaBcaBCawxawxawxawxawxawxawxawxayMawzaBDaBDaBkaBEaBFaBkaBDaBDazXaABaBGaBHaBIazXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaqwapQaqxaqyapQaqzaaaaacaacaacaacaacawPaAVaBoaBpaBqaBqaBqaBqaBqaBqaBraBqaBsaBqaBqaBqaBqaBqaBtaBsaBqaBuaBvaAVawPaacaacawnaBwaBxazHaByazHazHaBzazHazHaBAaBBaBcaBCawxawxawxawxawxawxawxawxayMawzaBDaBDaBkaBEaBFaBkbNhbNhazXaABaBGaBHbNiazXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTaiyaizaqzaqwaizapRaaaaaaaacaacaacaacawPaBJaBKaBLaBMaBLaBLaBLaBLaBLaBLaBLaBLaBLaBLaBLaBLaBLaBLaBLaBMaBNawNaBOawPaacaacawnaBPaBQaBRaBSbMgazHaBUazaaBVaBWaBXaBYaBZaCaaCbaCcaCdaCeaCfaCgawtayMawzaChaCiaCjaCkaClaCmaBkaCnazXazXazXaCoaCpazXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTajgapQaCqaCqapQaqzaaaaaaaacaacaacaacaCraCsaCtaCuaCrawPaCvaCvaCvawPawPaCvaCvaCvawPawPaCvaCvaCvawPaCwaCxaCyaCzaCwaacaCAaCAaCAaCAaCAaCAaCAaCBaCCaCDaCAaCAaCEaCFaCGaCHaCIaCJaCKaCLaCfaCgawtaxaawzaCMaCNaBkaCOaCPaBkaCNaCQazXaCRaCSbNLaBIazXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTajgapQaCqaCqapQaqzaaaaaaaacaacaacaacaCraCsaCtaCuaCrawPaCvaCvaCvawPawPaCvaCvaCvawPawPaCvaCvaCvawPaCwaCxaCyaCzaCwaacaCAaCAaCAaCAaCAaCAaCAaCBaCCaCDaCAaCAaCEaCFaCGaCHaCIaCJaCKaCLaCfaCgawtaxaawzaCMaCNaBkaCOaCPaBkbRQbRBazXaCRaCSbNLbNiazXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahTahUahTahTahTahTahTahTahTaacaacaacaacaCraCUaCVaCWaCraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaCwaCXaCYaCZaCwaacaCAaDaaDbaDcaCAaDdaDeaDfaDfaDgaDhaDiazhaBcaDjaDkaDlaDlaDlaDlaDmaDmaDmaxaawzaDnaBkaBkaAyaAzaBkaBkaDoazTazTazTazTazTazXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDpaDqaDraDsaDtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaDvaDwaDxaCwaacaCAaDyaDzaDAaCAaDBaDCaDDaDfaDfaDEaDFazLaBcaDGawtaDHbXbaDJaDKaDLaDMaDNaDOawzaDPaDQaDQaDRaAzaDSaDTaDUazTaDVaDWaDWazTaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDpaDqaDXaDYaDtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaDvaDZaEaaCwaacaCAaCAaEbaCAaCAaEcaEdaEeaEfaEgaEhaEiaEjaEkaElawtaEmaEnaEoaEpaEqaEraEsaEtawzaEuaEuaBkaEvaAzaEwaExaExaEyaExaExaExazTaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDpaDqaDraDsaDtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaDvaDwaDxaCwaacaCAbSvaDzaDAaCAaDBaDCaDDaDfaDfaDEaDFazLaBcaDGawtaDHbXbaDJaDKaDLaDMaDNaDOawzaDPaDQaDQaDRaAzaDSaDTaDUazTaDVaDWaDWazTaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDpaDqaDXaDYaDtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaDvaDZaEaaCwaacaCAaCAaEbaCAaCAaEcaEdaEeaEfaEgaEhaEiaEjaEkaElawtaEmaEnaEoaEpaEqbWTbWSaEtawzaEuaEuaBkaEvaAzaEwaExaExaEyaExaExaExazTaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDpaDqaEzaDraDtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDuaDvaEAaDwaCwaacaCAaEBaECaEDaCAaEEaEFaDfaDfaDfaEGaCAaEHaEIaEJaEKaELaEMaENaDlaEOawzawzawzawzaEPaEQaBkaERaESaETaEUaEUaEVaEWaEXaEYazTaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaEZaEZaEZaFaaFaaEZaEZaFaaFaaFaaEZaEZaEZaaaaaaaCraFbaFcaFdaCraaaaFeaFeaFeaFeaFeaFeaFeaFeaFeaFeaFeaaaaaaaaaaCwaDvaFfaFgaCwaacaCAaFhaFiaFjaFkaFlaDfaDfaDfaDfaFmaCAaFnaFoaFpawtaDlaDlaDlaDlaacaacaacaacazTaFqaFqaBkaEvaAzaFraExaExaEyaFsaFtaFuazTaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFvaFwaFxaFxaFxaFyaFxaFzaFAaFBaFCaFDaEZaFEaFFaFGaFHaFIaDraDtaaaaFeaFeaFeaFeaFeaFeaFeaFeaFeaFeaFeaFeaFJaFKaFLaFMaFNaDwaCwaacaCAaFOaFPbSXaCAaFRaFSaFTaFUaFVaFWaCAaFnaFoaxxaFXawtaacaacaacaacaacaacaacazTaFYaBkaBkaEvaAzaFZaGaaGbazTaGcaGdazTazTaacaacaacaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -5411,12 +5419,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaJeaJnaJoaJiaJ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaJeaJEaJnaJFaJGaJHaJIaJeaacaacaacaJlaJJaJKaJLaJMaJNaJOaJMaJPanQaJMaJRaJSaJTaJUaJUaJUaJUaJVaJWaJXaJYaJZaKaaJmaKbaJDaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaJeaKcaKcaKdaKeaKfaKgaJeaacaacaacaJlaKhaKiaKjaKkaKjaKjaKlaKmaKjaKnaKoaKjaKpaKqaKqaKqaKqaKqaKraJmaKsaKtaKuaJmaKvaJDaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaKwaKwaKwaKwaKwaKwaacaacaacaacaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaJeaKcaKcaKxaKyaKzaKzaJeaacaacaacaJlaKAaKBaKjaKCaKDaKjaKEaKFaKjaKEaKFaKjaKGaKHaKIaKJaKKaKLaKMaJmaKNaKOaKPaJmaKvaJDaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaKwaKwaKQaKRaKSaKSaKwaacaacaataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaJeaKTaKUaKVaKWaKzaKXaJeaacaacaacaJlaKhaKYaKjaKZaLaaKjaLbaLcaKjaLbaLcaKjaLdaLeaLfaLgaLfaLhaLiaLjaLkaLlaLmaJmaKvaJDaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaKwaLnaLoaLpaKSaKSaKwaacaataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaJeaKTaKUaKVaKWaKzaKXaJeaacaacaacaJlaKhaKYaKjaKZaLaaKjaLbauWaKjaLcaMPaKjaLdaLeaLfaLgaLfaLhaLiaLjaLkaLlaLmaJmaKvaJDaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaKwaLnaLoaLpaKSaKSaKwaacaataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaJeaLqaLraKdaLsaLtaLuaJeaacaacaacaJlaKhagaagAaKjaKjaKjaLwaLxaKjaLyaLxaKjaLzaLeaLfaLAaLBaLCaLDaLEaLEaLEaLEaLEaKvaJDaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaKwaLnaLoaLFaKwaKwaKwaataataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaJeaLGaLHaKxaLIaLJaLKaJeaacaacaacaJlaLLaLMaLNaLOaLPaLQaLOaLRaLSaLOaLRaLTaLUaLVaLOaLWaLXaLYaLZaLEaMaaMbaMcaLEaMdaJDaacaacaacaacaacaKwaKwaKwaKwaKwaKwaKwaKwaKwaKwaKwaKwaKwaMeaMfaMgaMhaMiaataataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaJeaJeaJeaMjaMkaJeaJeaJeaacaacaacaJlaMlaMmaKjaKjaKjaKjaMnaMoaKjaMpaMqaKjaMraLeaLfaMsaMtaLCaMuaLEaMvaMwaMxaLEaMdaJDaMyaMyaMyaMyaMyaMyaMzaMAaMAaMAaMBaMCaMAaMAaMDaMAaMAaMEaMFaMGaKwaKwaKwaataataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaJeaMHaMIaMJaMKaMLaMLaJeaacaacaacaJlaMMaMNaKjaMOaLaaKjaMPaLcaKjaMPaLcaKjaMQaLeaLfaMRaLfaMSaMTaMUaMVaMWaMXaLEaKvaJDaMYaMZaNaaNbaNcaMyaNdaKwaKwaNeaNeaNeaNeaNeaNeaNeaNeaNeaNfaNgaNhaNiaNjaataataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaJeaMHaMHaNkaNlaMLaMLaJeaacaacaacaJlaNmaKBaKjaNnaKDaKjaNoaKFaKjaNoaKFaKjaNpaNqaNraNsaNtaNuaNvaLEaNwaNxaNyaLEaKvaJDaNzaNAaNBaNCaNDaMyaNdaKwaNEaNeaNFaNGaNHaNIaNJaNGaNKaNeaNLaNMaNhaNNaNjaataataataataataataataabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaJeaLGaLHaKxaLIaLJaLKaJeaacaacaacaJlaLLaLMaLNaLOaLPaLQaLOaLRaLSaLOaLRaLTaLUaLVaLOaLWaLXaLYaLZaLEaMaaMbaeWaLEaMdaJDaacaacaacaacaacaKwaKwaKwaKwaKwaKwaKwaKwaKwaKwaKwaKwaKwaMeaMfaMgaMhaMiaataataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaJeaJeaJeaMjaMkaJeaJeaJeaacaacaacaJlaMlaMmaKjaKjaKjaKjaMnaMoaKjaMpaMqaKjaMraLeaLfaMsaMtaLCaMuaLEawqaMwaMxaLEaMdaJDaMyaMyaMyaMyaMyaMyaMzaMAaMAaMAaMBaMCaMAaMAaMDaMAaMAaMEaMFaMGaKwaKwaKwaataataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaJeaMHaMIaMJaMKaMLaMLaJeaacaacaacaJlaMMaMNaKjaMOaLaaKjbXdbXcaKjbXebXfaKjaMQaLeaLfaMRaLfaMSaMTaMUaMVaMWaMXaLEaKvaJDaMYaMZaNaaNbaNcaMyaNdaKwaKwaNeaNeaNeaNeaNeaNeaNeaNeaNeaNfaNgaNhaNiaNjaataataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaJeaMHaMHaNkaNlaMLaMLaJeaacaacaacaJlaNmaKBaKjaNnaKDaKjaNoaKFaKjaNoaKFaKjaNpaAEaNraNsaNtaNuaNvaLEaNwaNxaBIaLEaKvaJDaNzaNAaNBaNCaNDaMyaNdaKwaNEaNeaNFaNGaNHaNIaNJaNGaNKaNeaNLaNMaNhaNNaNjaataataataataataataataabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaNOaNOaNOaNPaNQaNOaNOaNOaNOaNOaNOaJlaNmaNRaKjaNSaKjaKjaNTaNUaKjaNVaNWaKjaNXaNYaNZaNZaNZaNZaOaaLEaLEaLEaLEaLEaKvaJDaObaOcaOdaOeaOfaMyaNdaKwaOgaNeaOhaOiaOjaOkaOlaOmaOnaNeaLoaLoaOoaNNaNjaataataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaNOaOpaOpaOqaOraOsaOtaOtaOuaOvaNOaJlaOwaOxaOyaOzaOAapnaOzaOCapmaOzaOEaOFaOGaOHaOIaOJaOKaOLaOMaONaOOaOPawDaORaKvaJDaOeaOSaOTaOUaOVaMyaOWaOXaOXaNeaOYaOZaPaaPbaPcaPdaPeaNeaKwaKwaKwaKwaKwaataataataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaNOaOpaOpaOpaOpaOpaOpaOpaOpaPfaNOaJlaPgaPhaPiaPjaPkaPkaPkaPkaPkaPkaPjaPlaPkaPmaPnaPnaPoaPpaPqaORaPraPsaPtaORaPuaJDaPvaPvaPwaPxaPvaMyaPyawQaPAaNeaOhaPBaPCaPDaPCaPBaOnaNeaacaacaacaacaacaacaacaataataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -5424,11 +5432,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaNOaOpaOpaPEaP aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNOaOpaOpaQaaQbaQbaQbaQcaOpaQdaNOaxjaQfaQgaQgaxCaQhaQiaQgaQgaQhaQgaQhaQgaQjaQkaQlaQmaQnaQoaQpaORaQqaQraPraORaQsaQtaQuaQvaQwaQxaQyaQzaQAaQBaQCaNeaNeaNeaNeaQDaNeaNeaNeaNeaacaacaacaacaacaacaacaacaataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNOaQEaOpaQaaQbaQbaQbaQcaOpaPfaNOaxPaQgaQGaQGaQGaQGaQGaQGaQGaQGaQGaQGaQGaQhaQkaQHaQIaQJaQKaQLaORaPraQMaPraORaQNaOXaQOaQPaQQaQRaQSaQTaQUaNeaNeaNeaNeaQVaQWaQXaQYaQZaNeaNeaNeaNeaacaacaacaacaacaacaacaataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNOaOpaOpaQaaQbaQbaQbaQcaOpaPfaNOaAcaQhaQGaQGaRbaQGaRcaRdaReaRfaRgaRhaQGaQhaQkaRiaRjaQJaQKaQLaORaORaRkaORaORaQNaOXaRlaRmaRnaRoaRpaRqaRmaNeaRraRsaNeaRtaRuaRvaRwaPBaNeaRxaRyaNeaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNOaOpaOpaQaaQbaQbaQbaQcaOpaPfaNOaAdaQhaQGaRAaRBaRCaRDaREaRFaRGaRBaRHaQGaQhaQkaRIaRJaRJaRKaRLaRMaRNaROaRPaQkaRQaOXaRRaRSaRnaRoaRpaRTaRUaNeaRVaRWaRXaRYaRZaSaaSbaRYaRXaScaSdaNeaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNOaSeaSeaSfaSgaQbaQbaQcaOpaPfaNOaDIaQgaQGaSiaRBaRDaSjaSkaSlaSmaRBaSnaQGaQgaQkaSoaSpaSqaSraSsaStaSuaSvaSwaQkaQNaOXaSxaSyaSzaSAaSBaSCaSDaNeaSEaSFaNeaSGaSHaPDaSIaSJaNeaSKaSLaNeaSMaSMaSMaSMaSMaSMaSMaSMaSMaSMaSMaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNOaSNaSeaSfaSgaQbaQbaQcaOpaPfaNOaOQaQgaQGaSPaRBaRDaSQaSRaSSaSTaRBaSUaQGaQgaQkaQkaQkaQkaQkaQkaQkaSVaSWaQkaQkaSXaOXaSYaSZaRnaRoaRpaPMaSZaNeaNeaNeaNeaPCaTaaTbaTcaPCaNeaNeaNeaNeaSMaTdaTeaTfaTgaLvaTiaTjaTeaTkaSMaSMaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNOaOpaOpaQaaQbaQbaQbaQcaOpaPfaNOaAdaQhaQGaRAaRBaRCaRDaREaRFaRGaRBaMcaQGaQhaQkaRIaRJaRJaRKaRLaRMaRNaROaRPaQkaRQaOXaRRaRSaRnaRoaRpaRTaRUaNeaRVaRWaRXaRYaRZaSaaSbaRYaRXaScaSdaNeaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNOaSeaSeaSfaSgaQbaQbaQcaOpaPfaNOaDIaQgaQGaSiaRBaRDaSjaSkaSlaSmaRBaMvaQGaQgaQkaSoaSpaSqaSraSsaStaSuaSvaSwaQkaQNaOXaSxaSyaSzaSAaSBaSCaSDaNeaSEaSFaNeaSGaSHaPDaSIaSJaNeaSKaSLaNeaSMaSMaSMaSMaSMaSMaSMaSMaSMaSMaSMaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNOaSNaSeaSfaSgaQbaQbaQcaOpaPfaNOaAcaQgaQGaSPaRBaRDaSQaSRaSSaSTaRBaNqaQGaQgaQkaQkaQkaQkaQkaQkaQkaSVaSWaQkaQkaSXaOXaSYaSZaRnaRoaRpaPMaSZaNeaNeaNeaNeaPCaTaaTbaTcaPCaNeaNeaNeaNeaSMaTdaTeaTfaTgaLvaTiaTjaTeaTkaSMaSMaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNOaTlaSeaSfaSgaQbaQbaQcaOpaTmaNOaPzaQiaQGaToaTpaTqaTraTsaTtaTuaRBaTvaQGaQfaQhaTwaTxaTyaTyaTzaTAaTBaTCaTDaTEaQeaOXaTGaTHaRnaRoaRpaTGaTHaTIaTIaTIaTIaTIaTJaTKaTLaTMaTMaTMaTMaTMaTNaTNaTOaTNaTNaTNaTNaTNaTOaTNaTPaSMaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNOaSeaSeaSfaSgaQbaQbaQcaOpaPfaNOaRaaTRaQGaQGaQGaQGaTSaTTaTUaTVaTWaTXaQGaTYaTYaTYaTZaUaaUaaUaaUbaUbaUbaUbaUbaUbaOXaUcaUdaUeaUdaUfaUdaUcaTIaUgaUhaUiaTIaUjaUkaUlaTMaUmaUnaUoaTMaUpaUqaUraUsaUtaUuaUvaUwaUxaUqaUyaSMaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNOaSeaSeaSfaSgaQbaQbaQcaOpaPfaNOaEsaTRaQGaQGaQGaQGaTSaTTaTUaTVaTWaTXaQGaTYaTYaTYaTZaUaaUaaUaaUbaUbaUbaUbaUbaUbaOXaUcaUdaUeaUdaUfaUdaUcaTIaUgaUhaUiaTIaUjaUkaUlaTMaUmaUnaUoaTMaUpaUqaUraUsaUtaUuaUvaUwaUxaUqaUyaSMaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNOaSeaSeaSfaSgaQbaQbaQcaOpaUzaUAaUBaUCaUDaUEaUDaUFaUGaUHaUIaUJaUKaUKaUKaULaUMaUNaUOaUPaUQaURaUSaUSaUSaUSaUSaUSaUTaUUaUVaUWaUXaUYaUZaVaaTIaVbaVcaVdaVeaVfaVgaVfaVhaViaVjaVkaTMaTNaTNaVlaTNaTNaVmaTNaTNaVlaTNaTNaSMaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaNOaOpaOpaQaaQbaQbaQbaQcaOpaVnaVoaVoaVoaVoaVoaVoaVoaVpaVqaVraVsaVtaVtaVtaVtaVuaUNaVvaVwaVxbdmaUSaVzaVzaVzaVzaUSaVAaVAaVAaVBaVAaVCaVAaVDaTIaVEaVFaVGaTIaVHaVIaVJaTMaVKaVLaVMaTMaVNaVOaVPaTNaVQaVRaVSaTNaTNaTNaVTaSMaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaacaacaNOaOpaOpaQaaQbaQbaQbaQcaOpaVnaVoaVUaVVaVWaVXaVYaVZaVpaWaaWbaWcaWcaWcaWdaWeaWfaUNaWgaWhaWiaWjaUSaVzaVzaVzaVzaVzaVAaVAaVAaVBaWkaVCaVAaWlaTIaTIaTIaTIaTIaTJaWmaWnaTMaTMaTMaTMaTMaSMaSMaWoaWpaSMaWqaSMaWpaWpaSMaSMaSMaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -5436,13 +5444,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaNOaQEaOpaQaaQ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaNOaOpaOpaQaaQbaQbaQbaQcaOpaXdaVoaXeaXfaXgaXhaXiaWxaVpaWaaWyaWzaWzaWzaWAaXjaXkaXlaXmbzmaXnaXoaUSaVzaVzaVzaVzaXpaVAaXqaXraXsaXtaXtaXtaXtaXuaXtaXtaXtaXtaXtaXsaXvaXvaXvaXvaXwaXvaXvaXvaXvaXvaXvaXxaVAaXyaXzaXAaXBaXcaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaNOaOpaOpaXCaXDaXDaXDaXEaOpaVnaVoaXFaXGaWuaXHaXIaWxaVpaWaaXJaXKaXKaXKaXLaWzaWzaUNaXMaQgaXNaXOaUSaUSaUSaUSaUSaUSaXPaVAaXQaXRaXSaXSaXSaXTaXUaXVaXVaXWaXXaXVaXVaXVaXVaXVaXVaXYaXZaXZaXZaXZaYaaYbaYcaYdaYeaYfaXVaYgaXcaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaNOaOpaOpaOpaOpaOpaOpaOpaOpaVnaVoawWaYiaYjaYkaYlaYmaYnaYoaWeaWeaWeaWeaYpaWzaWzaUNaYqaYraWDaYsaYtaYtaYuaYvbBYaYxaYyaYzaYAaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYBaYCaYDaYDaYDaYDaYEaYFaYGaYHaYEaYDaYDaYDaYDaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNOaYIaYIaYIaYIaYJaOpaYKaYLaYMaxuaYOaYPaYQaYRaYSaYTaYUaYVaYWaVraYXaWeaYpaWzaWzaUNaWgbChaYZaZabCnaYxaYxaYxaYxaYxaZcaZdaZeaYBaZfaZgaZhaYBaZfaZgaZhaYBaZibCIaZkaZlaZkaZlaYBaZmaYDaZnaZnaZoaZpaZqaZraZsaZtaZuaZvaZvaYDaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaNOaYIaYIaYIaYIaYJaOpaYKaYLaYMaxuaYOaYPaYQaYRaYSaYTaYUaYVaYWaVraYXaWeaYpaWzaWzaUNaWgbvEaYZaZabCnaYxaYxaYxaYxaYxaZcaZdaZeaYBaZfaZgaZhaYBaZfaZgaZhaYBaZibCIaZkaZlaZkbxPaYBaZmaYDaZnaZnaZoaZpaZqaZraZsaZtaZuaZvaZvaYDaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaYxaNOaNOaNOaNOaNOaNOaNOaNOaNOaNOaVoaZwaZxaZxaZxaZyaVoaZzaZzaZAaZzaZBaZzaZzaUNaUNaUNaTYaTYaTYaZCaYxaYxaZDaZEaZFaZGaZHaVBaZIaYBaZJaZKaZLaYBaZJaZMaZLaYBaZNaZNaZNaZNaZNaZNaZNaZOaYDaZPaZQaZRaZSaZQaZTaZUaZVaZWaZQaZXaYDaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZYaZZbaababbacbadbaabaabaabaabaebafbagbafbadbaabahbaibaabajbakbalbambanbaobapbaqbarbasbatbaubavbawbaxbaybazbaAbaBbaCbaDaZIaYBbaEbaFbaEaYBbaEbaGbaEaYBbaHbaIbaJbaKbaLbaMaZNaZmaYDaYDaYDaYDbaNbaObaPbaQbaRaYDaYDaYDaYDaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaZYbaSbaTbaUbaVbaWbaXbaYbaYbaYbaZbbabbbbbcbbdbaYbbebbfbaYbbgbbhbbibbjbbkbblbbabbmbaYbaYbbgbaYbbnbaYbbobbpaXAbbqbbraXvbbsaZIaYBbbtbbubbvbbwbbvbbxbibaYBbbzbbAbbBbbCbbDbbEaZNbbFaYDbbGbbHaZobbIaZqbbJbbKbbLbbMbbNbbOaYDaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZYbbPbbQbbRbbSbbTbbUbbVbbWbbWbbWbbWbbWbbWbbWbbWbbXbbYbbQbbRbbRbbRbbZbcabcbbccbcdbccbccbccbccbcebcfbcgbbRbchbchbcibchbchbcjaYBbihbcnbigbdxaZLaZLbcobaEbcpbcqbcqbcrbcsbiiaZNaZmaYDaZPaZQbcuaZSaZQaZTaZUbcvbcwaZQaZQaYDaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbcxbcxbcybcybcybcybczbcybcybcybcybcAbcAbcAbcAbcBbcBbcBbcBbcBbcBbcCbdibdjbdkbcBbcxbcxbcxbcxbcxbcxbcxbcGbcHbcHbcHaYBaYBaYBaYBaYBbcIbcJaYBbcKbcLbbtbcMbcNbcObcPbcPbcQbcsbcRaZNaZmaYDaYDaYDaYDbcSaZQbcTbcUbcVbcWaZQbcXaYDaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbcybcYbcZbdabdbbdcbddbdebcyaatbdfaataatbcBbcBbcBbcBbdgbdhbcBbdibdjbdkbcBaacaacaacaacaacbdlbGMbdnbdobdpbdqaYBbdraYBbdsbdtbdubdvbdwbdxaZLbckaZLbaEbdybcqbcqbdzbdAbdBaZNaZmaYDbdCaZQaZobdDbdEbdFbdGbdHbdIaZQbcXaYDaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbcybcYbcZbdabdbbdcbddbdebcyaatbdfaataatbcBbcBbcBbcBbdgbdhbcBbdibdjbdkbcBaacaacaacaacaacbdlbDsbdnbdobdpbdqaYBbdraYBbdsbdtbdubdvbdwbdxaZLbckaZLbaEbdybcqbcqbdzbdAbdBaZNaZmaYDbdCaZQaZobdDbdEbdFbdGbdHbdIaZQbcXaYDaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbcybdJbdKbdKbdLbdKbdKbdMbdNbdObdObdPaatbcBbcBbcBbcBbdhbdhbcBbdQbdjbdRbcBaacaacaacaacaacbdlbdSbdTbcHbdUbdVaYBbdWaYBbdXbdYbdZbeabebbbvbecbbxbedaYBbeebefbegbehbeibejaZNbekaYDbelaZQbemaZSaZQaZQaZUaZVbenbeobeoaYDaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbcybepbdKbeqberbesbdKbetbeubevbewbexaatbcBbezbezbcBbeybeybcBbeAbdjbeBbcBaacaacaacaacaacbdlbeCbeDbeEbeFbeGaYBbeHaYBbeIaZLbeJaZLbduaZLaZLbeKbeLaYBbeMbeNbcqbeObcsbePaZNaZmaYDbeQaZQbeRbeSaZqaZqaZsbeTbeUaZQaZQaYDaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbcybeVbeWbeXbeYbeZbeWbeWbfabfbbfcbfdaatbcBbeybeybfebeybeybcBbffbfgbgtbcBaacaacaacaacaacbdlbPKbfjblgblgblgblgblgblRblRblRbflblUbfoblSbfqbfraYBbfsbftbfsbcqbfubfvaZNaZNaZmaYDbfwaZQbdIbfxaZQaZQaZUbfybdIbfzbfzaYDaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -5452,9 +5460,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaacaacbcybcybgUbg aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbcybcybcybcybcybcybcybcybcyaataataataataacaacaacaacaacaacaacaacaacaacbADbIGbIIbIDbIFbILbIObIJbILblibISbIQbIRbJybJzbGzbGAblRbfsbhSbhTbfsbfsbfsbfsbfsbfsbhUbhVbhWbfsbhXbgTbhYbhDbhDbhZbhDbhDbhDbhDbhFaataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaacaacaataataataataacaacaacaacaacaacaacaacaacaacbADbJHbJJbILbILbILbIObIJbJMblgbKqbKmbKobKrbKsbGzbGAblRbijbikbilbimbinbiobWYbgTbgTbgTbgTbgTbgTbiqbgTbirbhDbhDbisbitbitbiubhDbhFaataataaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaacaataataataataacaacaacaacaacaacaacaacaacaacbADbKZbLvbKUbKXbLBbLDbLybLAbMjbMlbLEbLFbMnbKsbGzbGAblRbiEbiFbiGbimbiHbiIbiJbgTbiKbiKbiLbiLbiMbiNbiObiPbiQbiQbiRbiSbiTbiUbiVbhFaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaacaataataataataacaacaacaacaacaacaacaacaacaacbADbMsbMubMobILbMXbNjbILbMwblgbNDbNzbNAbNIbNJbNEbGAblRbjjbjkbjlbimbiHbjmbXabgTbiKbiKbjobjobjpbjqbjrbjsbjsbjsbjtbjubjvbjwbhDbhFaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaacaataataataataacaacaacaacaacaacaacaacaacaacbADbMsbMubMobILbMXbNjbILbMwblgbNDbNzbNAbNIbNJbNEbGAblRbjjbjkbjlbimbiHbjmbKQbgTbiKbiKbjobjobjpbjqbjrbjsbjsbjsbjtbjubjvbjwbhDbhFaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaacaataataataataacaacaacaacaacaacaacaacaacaacbADbNNbILbILbILbILbIObILbOjblgblgblgbOrbliblgblgblgblRbfsbjBbjCbjDbjEbjFbjFbgTbgTbgTbgTbgTbgTbjGbgTbhDbhDbhDbiubjHbjHbiubhDbhFaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaacaataataataataacaacaacaacaacaacaacaacaacaacbADbOvbOwbOsbOubOVbOXbOxbORbADbjQbjRbWPbjTbjUbjVbOZbjXbjYbjZbkabkbbkcbkdbkebkfbkgbkhbkibkibkjbkkbgTbklbkmbhDbknbkobhDbhDbhDbhFaataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaacaataataataataacaacaacaacaacaacaacaacaacaacbADbOvbOwbOsbOubOVbOXbOxbORbADbjQbjRbWPbjTbjUbjVbOZbjXbjYbjZbkabkbbkcbkdbkebkfbkgbkhbkibkibkjbkkbgTbklbUCbkmbknbkobhDbhDbhDbhFaataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPvbPvaacaacaacaacaataataataataacaacaacaacaacaacaacaacaacaacbADbADbADbADbADbADbPxbADbADbADbPybkrbksbPBbkubPzbPAbkwbktbkxbkybkybkzbkAbjFbkBbkBbkBbkBbkBbkBbkBbgTbgTbgTbgTbgTbgTbgTbgTbgTbgTaataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPvbPvaacaacaacaacaataataataataacaacaacaacaacaacaacaacaacaacaacaacaacbjFbkCbkDbkEbkFbkGbkHbkIbkJbjFbMWbQbbPZbQabMWbMWbMWbkNbkNbkObkPbjFaataacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPvbPvbPvbPvaacaacaataataataataacaacaacaacaacaacaacaacaacaacaacaacaacbjFbkQbkRbkSbkTbkUbkVbkWbkXbjFbQMbRnbQsbQtbRybRLbMWbldbldbkOblebjFblfaataataataacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -5540,57 +5548,57 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaacaacbppbrcbrdbrebrfbrgasvbqAbqAbqAbqAbqAbqAbqAbqAbqAbqAbqAbqAbqAbqBbpQbpQbpQbpQasybrhbribrjbrkbrlbrmbrnbrobrpbrqbrrbpzbpAbnPaacbrsbrtbrubrvbrwbrubrxbrybrsaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacaacaacbppbrzbrAbrBbrCbrDasvbpQbrEbrEbrEbrEbrEbrEbrEbrEbrFbqAbqAbqAbqBbpQbpQbpQbqkbpybqCbrGbrHainbrJbrKbpzbrLbrLbrLbrLbpzbpAbnPaacbrsbrMbrNbrNbrObrNbrNbrPbrsaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacbppbrQbrRbrSbrTbrUasvbpQbrVbpQbpQbpQbpQbpQbpQbrVbrWbqAbqAbqAbqBbpQbpQbpQbpQbpybrXbrYbpybpybpybpybpzbpzbpzbpzbpzbpzbrZbnPaacbrsbsabrNbsbbscbsbbrNbsdbrsaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacbppbppbppbsfbsgbshatiaujaujaujatjatjatjatjatjaujavUatjauWatjavUatjatjatjaujaujbslbsmbsnbsobspbsqbsrbssbstbsubsvbsobpAbnPaacbrsbrMbswbrNbsxbrNbsybrPbrsaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacbppbppbppbsfbsgbshatiaujaujaujatjatjatjatjatjaujavUatjbXgatjavUatjatjatjaujaujbslbsmbsnbsobspbsqbsrbssbstbsubsvbsobpAbnPaacbrsbrMbswbrNbsxbrNbsybrPbrsaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbszbszbszbszbszbszbszbszbsAbsBbsCbsDbsEbsFbsGbsHbsIbsHbsJbsKbsLbsKbsMbsNbsObsPbsQbsQbsRbsKbsMbsSbsTbsUbsobspbsVbsWbsXbsYbsZbtabsobpAbnPaacbrsbtbbtcbtdbtebtfbtgbthbrsaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbszbszbszbszbszbszbszbszbtibtjbtkbtlbtmbtlbtnbtobtpbtqbtrbtlbtlbtlbtlbtsbttbtobtubtvbtwbtxbtlbtybtzbtAbtBbtCbtDbtEbtFbtGbtHbtIbsobpAbnPaacbrsbrsbrsbrsbrsbrsbrsbrsbrsaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbszbtJbtKbtJbtKbtJbtLbszbtMbtNbtObtPbtQbtRavZbtRbtRbtSbtRbtRbtRbtRbtTbtUbtVbtWbtXbtYbtZbtUbuabtRbubbucbudbuebsWbufbugbsYbsZbtabsobpAbnPaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbszbtKbtKbtKbtKbtKbtKbszbuhbsSbuibujbujbujbujbukbukbukbukbukbujbujbujbulbujbumbumbunbuobupbuobuqbumbumburburbusbutbuubuuazGbsvbsobuwbuxbuxbuxbuxbuxbuxaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbszbuybtKbuybtKbuybuzbszbuAbtrbuBbujbuCbuDaywbuFbuGbuHbuIbuFbuEbuJbuKbuLbuMbumbuNbuObuPbuQbuRbuSbuTbumbuUburburbuVbuWbuWburburburbpAbuxbuXbuYbuZazVbuxbuxbuxbuxaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbszbtKbtKbtKbtKbtKbtKbvbbuAbvcbvdbukbvebvfbvgbvgbvgbvgbvgbvgbvhbvgbvibvjbvPbumbvlbvmbvnbvobvpbvqbvrbumbvsbvtbvubvvbvwbvxbvybvzburbpAbuxbvAbvBbvCbvDbvEbvFbvGbuxaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbszbtKbtKbtKbtKbtKbtKbvbbuAbvcbvdbukbvebvfbvgbvgbvgbvgbvgbvgbvhbvgbvibvjbvPbumbvlbvmbvnbvobvpbvqbvrbumbvsbvtbvubvvbvwbvxbvybvzburbpAbuxbvAbvBbvCbvDaDybvFbvGbuxaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaacaacbszbvHbtKbuybtKbuybtKbvbbuAbvIbvJbukaBTbvLbvgbvMbvNbvMbvNbvMbvgbvgbvgbvObvPbumbvQbvmbvRbvSbvTbvmbvUbumbvVbvWbvXbvYbvZbwabvWbwbbwcbwdbuxbwebwfbwgbwhbvBbvBbwibuxaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbszbwjbwkbwjbwlbwjbwjbvbbuAbwmbwnbukbwobvLbvgbwpbwpbwpbwpbwpbvgbvgbvgbwqbwrbwsbwtbwubwvbwwbwxbwubwybwzbwAbwBbwCbwDbwEbwFbwGbwHburbwIbuxbwJbwKbwLbwMbwLbwLbwNbwLaacaacaacaacaacaacaacaacbwObwObwObwObwOaacaacaacaacaacaaaaaabsebsebsebsebseaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbszbwPbwQbwRbwSbwRbwTbszbwUbtwbwVbwWbwXbvLbvgbwpbwpbwpbwYbwZbvgbvgbxabxbbxGbxcbxdbvmbvmbvmbvmbvmbxebxcbvVbvWbxfbvWbxgbxhbvWbxiburbxjbuxbxkbuxbwLbxlbwLbxmbxnbwLbwLbwLbwObwObwObwObwObwObwObxobxpbwObwOaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbszbxqbxrbxsbxtbxsbxubxvbxwbxxbxybxzbxAbxBbvgbxCbxDbxCbxDbxCbvgbvgbxEbxFbxGbumbxHbxIbxJbxKbxLbxMbxNbumbxOaThbxQbxRbxSbxTbxUbxVburbxWbxXbxYaQFbwLbyabwLbbybycbydbyebyfbygbyhbyibyjbykbylbymbynbyobypbwObwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbszbwPbwQbwRbwSbwRbwTbszbwUbtwbwVbwWbwXbvLbvgbwpbwpbwpbwYbwZbvgbvgbxabxbbxGbxcbxdbvmbvmbvmbvmbvmbxebxcbvVbvWbxfbvWbxgbxhbvWbxiburbxjbuxbxkbuxbwLaNybwLbxmbxnbwLbwLbwLbwObwObwObwObwObwObwObxobxpbwObwOaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbszbxqbxrbxsbxtbxsbxubxvbxwbxxbxybxzbxAbxBbvgbxCbxDbxCbxDbxCbvgbvgbxEbxFbxGbumbxHbxIbxJbxKbxLbxMbxNbumbxOaThbxQbxRbxSbxTbxUbxVburbxWbxXbxYaErbwLbxlbwLbbybycbydbyebyfbygbyhbyibyjbykbylbymbynbyobypbwObwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbszbyqbyrbysbytbyubyvbszbywbsSbyxbukbyybyzbvhbvgbyAbvgbvgbvgbvgbvgbyBbyCbxGbumbumbumbumbumbumbumbumbumburburburburburburburburburbyDbyEbxYaShbwLbxlbyGbyHbyIbyJbyKbyLbyMbyNbyObyPbclbyRbySbyTbyUbyobyVbwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbszbcmbyXbyYbyZbzabzbbszbzcbzdbzebujbzfbzgbzhaSObzjbzkaTFaTnbznaTQbzpbzqbzrbzsbztbzubzvbzwbzxbzxbzxbzxbzxbzxbzybzzbzAbzBbzBbzBbzBbzBaYwbzDaVybwLbzFbzGbyHbzHbzIbzJbwLbwObwObzKbzLbwObzMbzNbzObzPbyUbzQbwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbszbszbszbszbszbszbszbszbzRbzSbzTbujbujaZbaYYbujbujbujbujbujbujbujbzXbujbujbujaZjbzZbAabctbzxbAcbAcbAcbAcbzxbAdbAebAfbzBbAgbAhbAibzBbAjbAkbfibwLbzFbAmbyHbAnbAobApbAqbArbAsbAtbAubAvbwObAwbAxbyUbyUbAybwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUbfSbfmbACbfnbAEbAFbfXbicbAIbgybALbptbmSbjzbipbAObAPbAQbARbqQbACbpPbAUbzvbAVbzxbAcbAcbAcbAcbAcbAdbAWbAXbzBbAYbAZbBabzBbBbbxXbsibwLbBdbwLbBebBfbBgbBhbAqbBibBjbBkbBjbBlbBmbBnbBobBpbBpbBqbwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUbBrbsjbACbBtbBubBvbBwbBwbBxbvabskbvkbBwbBwbBDbBwbBwbBwbBwbBEbACbBFbBGbzvbBHbzxbAcbAcbAcbAcbAcbAdbAWbBIbzBbBJbBKbBLbzBbBbbBMbxPbwLbBObwLbBPbBQbBRbBSbAqbBibBjbBkbBjbBTbBUbBVbAxbyUbyUbBWbwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbszbcmbyXbyYbyZbzabzbbszbzcbzdbzebujbzfbzgbzhaSObzjbzkaTFaTnbznaTQbzpbzqbzrbzsbztbzubzvbzwbzxbzxbzxbzxbzxbzxbzybzzbzAbzBbzBbzBbzBbzBaYwbzDaQFbwLbzFbzGbyHbzHbzIbzJbwLbwObwObzKbzLbwObzMbzNbzObzPbyUbzQbwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbszbszbszbszbszbszbszbszbzRbzSbzTbujbujaZbaYYbujbujbujbujbujbujbujbzXbujbujbujaRabzZbAabctbzxbAcbAcbAcbAcbzxbAdbAebAfbzBbAgbAhbAibzBbAjbAkaQFbwLbzFbAmbyHbAnbAobApbAqbArbAsbAtbAubAvbwObAwbAxbyUbyUbAybwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUaZjaVybACbfnbAEbAFbfXbicbAIbgybALbptbmSbjzbipbAObAPbAQbARbqQbACbpPbAUbzvbAVbzxbAcbAcbAcbAcbAcbAdbAWbAXbzBbAYbAZbBabzBbBbbxXbsibwLbBdbwLbBebBfbBgbBhbAqbBibBjbBkbBjbBlbBmbBnbBobBpbBpbBqbwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUbBrbsjbACbBtbBubBvbBwbBwbBxbvabskbvkbBwbBwbBDbBwbBwbBwbBwbBEbACbBFbBGbzvbBHbzxbAcbAcbAcbAcbAcbAdbAWbBIbzBbBJbBKbBLbzBbBbbBMbfibwLbBObwLbBPbBQbBRbBSbAqbBibBjbBkbBjbBTbBUbBVbAxbyUbyUbBWbwOaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUbBXbyFbACbBZbCabCbbCcbCdbCebCfbfVbzlbzibzibCibCjbBwbBwbBwbzCbACbzobCmbzEbCobzxbAcbAcbAcbAcbCpbAdbAWbAXbCqbzBbCrbzBbzBbCsbnPbnPbwLbCtbCubCvbCwbCxbCwbwLbCybCzbCAbCBbBTbBUbCCbAxbyUbyUbCDbwOaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacbfUbfUbfUbfUbCEbzUbACbCGbBubBvbBwbBwbCHbzVbDwbzWbBCbBwbCLbBwbBwbBBbAbbCMbACbCNbCObzvbCPbzxbzxbzxbzxbzxbzxbCQbCRbCSbCTbCTbCUbCVbCWbCXbCYbCZbDabDbbDcbDdbDebDfbDgbDgbDhbBjbBkbBjbDibDjbDkbDlbDmbyUbfWbwOaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacbfUbBXbBXbAAbBXbAzbACbDpbDqbDrbAGbAMbAKbAJbAHbASbANbDzbDzbfYbBsbBcbATbBzbACbDDbDEbzvbzvbDFbDFbDFbDFbDFbDFbDGbDHbDIbDIbDIbDJbDIbDKbDLbDMbDNbDIbDIbDObDPbDQbDRbDSbDSbDTbDSbDRbDSbDUbDVbDWbDXbDYbDZbEabwOaacaacaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacbfUbfUbfUbfUbCEbfmbACbCGbBubBvbBwbBwbCHbzVbDwbzWbBCbBwbCLbBwbBwbBBbAbbCMbACbCNbCObzvbCPbzxbzxbzxbzxbzxbzxbCQbCRbCSbCTbCTbCUbCVbCWbCXbCYbCZbDabDbbDcbDdbDebDfbDgbDgbDhbBjbBkbBjbDibDjbDkbDlbDmbyUbfWbwOaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacbfUbBXbBXbAAbBXbfSbACbDpbDqbDrbAGbAMbAKbAJbAHbASbANbDzbDzbfYbBsbBcbATbBzbACbDDbDEbzvbzvbDFbDFbDFbDFbDFbDFbDGbDHbDIbDIbDIbDJbDIbDKbDLbDMbDNbDIbDIbDObDPbDQbDRbDSbDSbDTbDSbDRbDSbDUbDVbDWbDXbDYbDZbEabwOaacaacaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbfUbBXbDFbDFbDFbDFbACbEdbEebEfbEdbACbEdbEdbACbACbACbACbACbACbACbACbACbACbACbEgbCObEhbEhbEcbEcbEcbEibEibEcbEjbEkbElbEmbEmbEnbgAbEobEpbEqbErbEsbEsbEsbEsbEtbEubEubEvbEwbExbEybEzbEAbwObEBbECbEDbEEbEFbwOaacaataataataaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbfUbEGbDFbgFbgEbDFbgCbEIbEJbEKbELbEMbENbENbENbENbEObEPbENbEQbERbgHbgGbgZbEcbEhbEUbEhbEVbEWbEXbEcbEcbEcbEcbEYbEZbFabFbbFbbFbbFbbFbbFbbFbbFcbFdbFebFfbFgbFhbFibFibFjbFkbFibFjbFlbFlbFmbFnbFobwObFpbFpbwObFlaataataataatahUahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaacaacaacbfUbBXbDFbAdbGGbhcbhbbhgbhfbhebhdbhdbhdbhdbhhbhdbhjbhdbhibhAbhjbhlbhkbhGbFDbFEbFFbFGbFHbFIbFHbFJbFKbFGbFHbFLbFMbFNbFObFPbFQbFRbFRbFSbFbbFTbFUbFUbFUbFUbFjbFVbFWbFXbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGkaataatbGlbGlbGlbGlbGlbGlbGlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbfUbCEbDFbhJbhIbDFbhHbhNbhMbhLbhKbhNbhQawfavibhRbHkbHkbHkbHkbHkbiabEZbHhbGBbGCbGDbDIbGEbGFbDIbDKbDIbDIbDIbDObDPbGGbGHbGIbGIbGIbGIbGJbFbbGKbCKbDubDtbDsbFjbGPbGQbGRbGSbGTbFjbGUbGVbGVbGWbGXbGYbGYbGYbGYbGkaatahUbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbfUbBXbDFbDFbDFbDxbGZbGZbHabHbbHcbHdbHUawFawgawHbHYbHZbHZbHZbIcbifbHmbHnbHobHpbHkbHkbHkbHkbHkbHqbHlbHrbHobHkbHkbHsbFObGIbGIbHtbGIbHubFbbHvbHvbHwbHxbDybFjbHzbHAbHBbHCbHDbHEbHFbHGbHGbHHbHIbGYbGYbHJbHKbHLbHMbHNbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbfUbCEbDFbhJbhIbDFbhHbhNbhMbhLbhKbhNbhQawfavibhRbHkbHkbHkbHkbHkbiabEZbHhbGBbGCbGDbDIbGEbGFbDIbDKbDIbDIbDIbDObDPbGGbGHbGIbGIbGIbGIbGJbFbbGKbCKbCJbChbAzbFjbGPbGQbGRbGSbGTbFjbGUbGVbGVbGWbGXbGYbGYbGYbGYbGkaatahUbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbfUbBXbDFbDFbDFbDxbGZbGZbHabHbbHcbHdbHUawFawgawHbHYbHZbHZbHZbIcbifbHmbHnbHobHpbHkbHkbHkbHkbHkbHqbHlbHrbHobHkbHkbHsbFObGIbGIbHtbGIbHubFbbHvbHvbHwbHxbAzbFjbHzbHAbHBbHCbHDbHEbHFbHGbHGbHHbHIbGYbGYbHJbHKbHLbHMbHNbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacbfUbBXbBXbBXbEGbDxbHObHPbHQbHRbHSbHTbHUaxkawIbHUbiBbiAbizbiCbIcbHZbIabIbbHZbiDbfkbiWbiWbiWbfkbfkbIdbiXbLGbFbbFObFObFObGIbGIbGIbGIbIgbFbbIhbIibIjbDCbIlbFjbFjbHAbImbInbHAbFibIobIpbIqbIrbIsbItbIubIvbIwbIxbIwbIxbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacbfUbfUbfUbfUbBXbDxbIybIzbIAbIAbIAbIBbHUbiZbiYbHUbjbbjablkbjfbjebjdbjcbjibjhbfkbjgbjxbjybjxbjnbfkbITbIUbIVbFObIWbIXbIYbIZbJabJbbJcbJdbFbbJebFUbJfbJgbJebJhbFjbJibJjbJkbJlbFibJmbGYbJnbJobGXbGYbGYbJpbJqbJrbJsbJrbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUbEbbDxbJtbJubJvbJwbJvbJxbHUbjIbjAbHUbjLbjKbjJbjPbjObjNbjMblsbkqbkpbjWbgBbkLbgBbkKbfkbJObJPbJQbJRbJSbJTbJTbJTbJUbJVbJWbIZbJXbJYbFUbJZbKabKbbKcbFjbFjbFjbFibFibFjbKdbGYbJnbJobGXbGYbGYbGYbKebHLbHLbKfbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUbEbbDxbDxbKgbKhbKibKjbkZbHUbkYbkMbHUblbblcblablAblwbljblhbkvblmbgzbllbhOblvblubltbfkbKvbKwbKxbFObKybIZbKzbKAbKBbKCbKDbKEbFbbJYbFUbKFbHxbKGbKHbKIbKJbKKbKLbKMbKcbKNbGYbJnbJobGXbGYbGYbHJbKObJrbJsbJrbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUbKPbKQbDxbDxbDxbDxbDxbDxbNKbKnbKnbHUblyblxblCblBbmtbjKbmdblKblJblIblHblQblPblOblLbfkbIdbLabLbbFbbFbbFbbFbbFbbFbbFbbFbbFbbFbbJYbLcbLcbLdbLebKcbLfbLgbLhbLibLjbKcbLkbLlbLmbLnbLobIqbLpbLqbLrbLsbLtbLsbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacbfUbfUbfUbfUbBXbDxbIybIzbIAbIAbIAbIBbHUbiZbiYbHUbjbbjablkbjfbjebjdbjcbjibjhbfkbjgbjxbjybjxbjnbfkbITbIUbIVbFObIWbIXbIYbIZbJabJbbJcbJdbFbbJebFUbJfbJgbJebJhbFjbJibJjbJkbJlbFibJmbGYbJnbJobGXbGYbGYbJpbJqaSUbGYaSUbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUbEbbDxbJtbJubJvbJwbJvbJxbHUbjIbjAbHUbjLbjKbjJbjPbjObjNbjMblsbkqbkpbjWbgBbkLbgBbkKbfkbJObJPbJQbJRbJSbJTbJTbJTbJUbJVbJWbIZbJXbJYbFUbAzbKabKbbKcbFjbFjbFjbFibFibFjbKdbGYbJnbJobGXbGYbGYbGYbKebHLbHLbKfbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUbEbbDxbDxbKgbKhbKibKjbkZbHUbkYbkMbHUblbblcblablAblwbljblhbkvblmbgzbllbhOblvblubltbfkbKvbKwbKxbFObyabIZbKzbKAbKBbKCbKDbKEbFbbJYbFUbKFbHxbKGbKHbKIbKJbKKbKLbKMbKcbKNbGYbJnbJobGXbGYbGYbHJbKOaSUbGYaSUbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacbfUbKPbDubDxbDxbDxbDxbDxbDxbNKbKnbKnbHUblyblxblCblBbmtbjKbmdblKblJblIblHblQblPblOblLbfkbIdbLabLbbFbbFbbFbbFbbFbbFbbFbbFbbFbbFbbJYbLcbLcbLdbLebKcbLfbLgbLhbLibLjbKcbLkbLlbLmbLnbLobIqbLpbLqbLrbLsbLtbLsbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacbfUbLubBXbEbbEbbKPbEbbEbbEbbNKbLwbLwbHUblXblWblVbmqbmebABbzYblsbmsbkpbmrbhObmvbmubgDbrIbLHbLIbLJbLKbLLbLMbLNbLObLPbLQaacaacbFUbJebLcbLRbLSbLTbKcbLUbLgbLVbLWbLXbLYbLZbMabMabMbbMcbGYbGYbLqbMdbHLbMebMfbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacbfUbfUbfUbfUbfUbWSbWRbWQbWTbNKbLwbLwbHUbyQbybbxZbKWbJEbCgbyWbDnbMrbfkbBNbFrbFqbESbDobFvbMybMzbMAbLKbMBbMCbMDbMDbMEbLQaacaacbFUbJebLcbMFbMGbMHbKcbMIbLgbMJbMKbMLbMMbMNbMObMObMPbGYbMQbMQbMRbMdbGkaaaahUbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacbMSbMSbMSbMSbMSbMSbMSbMSbMTbMTbMTbMTbFCbMTbMTbMTbMUbMVbGobGmbGmbGubGsbGmbGmbGmbMZbJPbNabNbbNcbNdbNebNfbNgbLQaacaacbFUbJebLcbNhbNibHgbKcbNkbLibNlbLgbNmbKcbNnbGYbGYbNobHjbLtbNqbLtbNrbGkaaaahUbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacbfUbfUbfUbfUbfUbDybWRbWQbGMbNKbLwbLwbHUbyQbybbxZbKWbJEbCgbyWbDnbMrbfkbBNbFrbFqbESbDobFvbMybMzbMAbLKbMBbMCbMDbMDbMEbLQaacaacbFUbJebLcbMFbMGbMHbKcbMIbLgbMJbMKbMLbMMbMNbMObMObMPbGYbMQbMQbMRbMdbGkaaaahUbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacbMSbMSbMSbMSbMSbMSbMSbMSbMTbMTbMTbMTbFCbMTbMTbMTbMUbMVbGobGmbGmbGubGsbGmbGmbGmbMZbJPbNabNbbNcbNdbNebNfbNgbLQaacaacbFUbJebLcbJsbJrbHgbKcbNkbLibNlbLgbNmbKcbNnbGYbGYbNobHjbLtbNqbLtbNrbGkaaaahUbGlbGlbGlbGlbGlbGlbGlahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacbMSbNsbNtbNubNvbNwbNxbNybHVbNBbNBbIebHWbICbIfbNFbNGbNHbIHbgxbIEbIPbINbIMbIKbgxbNObNPbNQbLKbNRbNSbMDbMDbMEbLQaacbNTbNTbNUbLcbLcbLcbLcbKcbKcbNVbNWbJAbNXbNYbNZbOabObbFlbFlbFlbFlbFlbFlbFlahUahUahUbGlbGlbGlbGlbGlahUahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacbJBbOcbOdbOebOfbOgbJDbOibJCbOlbOlbOmbJFbOnbOnbOnbOobJKbJIbgxbJGbKlbKkbJNbJLbgxbKpbOybOzbLKbOAbOBbOCbODbKtbLQaacbNTbOFbOGbWXbNTaacaacaacbKcbKcbKcbKcbKcbKcbFlbFlbFlbFlaacaacaacaacaacbOIahUahUahUahUahUahUahUahUahUahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacaacbJBbOcbOdbOebOfbOgbJDbOibJCbOlbOlbOmbJFbOnbOnbOnbOobJKbJIbgxbJGbKlbKkbJNbJLbgxbKpbOybOzbLKbOAbOBbOCbODbKtbLQaacbNTbOFbOGbIkbNTaacaacaacbKcbKcbKcbKcbKcbKcbFlbFlbFlbFlaacaacaacaacaacbOIahUahUahUahUahUahUahUahUahUahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacbMSbOJbOKbOLbOMbONbOObOPbOQbKTbKSbKRbKubOTbOTbOTbOUbLxbOqbKYbKVbKlbLCbKlbLzbMmbMkbPabPbbPcbPdbPdbPdbPdbPdbPdaacbNTbPebPfbPgbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaahUaaaaaaaaaaaaaaaaaaaaaahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacbMSbPhbPibPjbPjbPjbPkbNybPlbPmbPnbPobPpbPqbPrbPsbPtbPubMtbMqbMpbNpbMYbMxbMvbMqbNCbMzbOzbPCbPDbPEbPFbPGbPHbPdaacbNTbPIbPJbWZbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacbMSbPLbPMbPNbPObPPbPQbNybPRbPmbPobPobPSbPTbPTbPUbPVbPWbPXbMqbNMbOpbOkbKlbOhbMqbQcbMzbQdbPCbQebQfbQgbQgbQhbPdbLGbLGbLGbLGbQibNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacahUahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacbQjbQjbQjbQjbQjbQjbQjbQjbQkbPmbQlbPobPpbQmbQnbPsbPVbPWbQobgxbOtbOYbOWbOSbOEbgxbQubJPbNabQvbQwbQxbQzbQybQAbPdbQBbQCbQBbLGbQibNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbQjbQDbQEbQFbQGbQHbQIbQJbQKbPmbPobPobPSbPTbPTbPUbPVbPWbQLbgxbgxbMqbPwbMqbgxbgxbQNbMzbNQbPCbQObQPbQgbQgbQQbPdbQBbQBbQBbLGbQRbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbQjbQSbQTbQUbQVbQWbQXbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibRjbRkbRlbRmbPYbRobRpbRqbRrbRsbRtbPCbRubRvbRwbRxbQpbPdbRzbRzbQBbLGbRAbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRBbRCbQUbRDbREbRFbRGbQJbPlbRHbRIbPobPSbPTbPTbPUbRJbRKbOTbOTbOTbOTbQrbOTbQqbRMbRNbRObOzbPdbPdbPdbPdbPdbPdbPdbRzbRzbRPbLGbRAbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabRBbRQbRRbRRbRSbRTbRUbQjbRVbRWbRXbRYbRYbRZbSabRYbSbbScbSdbSebSebSzbSybSxbSgbShbSibSjbSkbSlbSmbSnbSobSpbSqbSrbSsbStbSubLGbRAbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQjbSvbSvbSvbQjbQjbQjbQjbMTbMTbMTbSwbMTbMTbMTbUFbUFbUGbUFbUFbMTbUNbUPbUNbSwbLGbSAbSBbSCbSDbSEbSFbSGbSHbSEbSFbSIbSJbSKbSLbSMbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacbMSbPhbPibPjbPjbPjbPkbNybPlbPmbPnbPobPpbPqbPrbPsbPtbPubMtbMqbMpbNpbMYbMxbMvbMqbNCbMzbOzbPCbPDbPEbPFbPGbPHbPdaacbNTbPJbPIbJZbNTbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacbMSbPLbPMbPNbPObPPbPQbNybPRbPmbPobPobPSbPTbPTbPUbPVbPWbPXbMqbNMbOpbOkbKlbOhbMqbQcbMzbQdbPCbQebQfbQgbQgbQhbPdbLGbLGbLGbLGbQibQRbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacahUahUaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaacaacaacbQjbQjbQjbQjbQjbQjbQjbQjbQkbPmbQlbPobPpbQmbQnbPsbPVbPWbQobgxbOtbOYbOWbOSbOEbgxbQubJPbNabQvbQwbQxbQzbQybQAbPdbQBbQCbQBbLGbQibRAbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbQjbQDbQEbQFbQGbQHbQIbQJbQKbPmbPobPobPSbPTbPTbPUbPVbPWbQLbgxbgxbMqbPwbMqbgxbgxbQNbMzbNQbPCbQObQPbQgbQgbQQbPdbQBbQBbQBbLGbSMbRAbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbQjbQSbQTbQUbQVbQWbQXbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibRjbRkbRlbRmbPYbRobRpbRqbRrbRsbRtbPCbRubRvbRwbRxbQpbPdbRzbRzbQBbLGbWVbWXbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUDbRCbQUbRDbREbRFbRGbQJbPlbRHbRIbPobPSbPTbPTbPUbRJbRKbOTbOTbOTbOTbQrbOTbQqbRMbRNbRObOzbPdbPdbPdbPdbPdbPdbPdbRzbRzbRPbLGbWVbRAbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUDbUEbRRbRRbRSbRTbRUbQjbRVbRWbRXbRYbRYbRZbSabRYbSbbScbSdbSebSebSzbSybSxbSgbShbSibSjbSkbSlbSmbSnbSobSpbSqbSrbSsbStbSubLGbWVbQRbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQjbWwbWwbWwbQjbQjbQjbQjbMTbMTbMTbSwbMTbMTbMTbUFbUFbUGbUFbUFbMTbUNbUPbUNbSwbLGbSAbSBbSCbSDbSEbSFbSGbSHbSEbSFbSIbSJbSKbSLbWZbNTbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacbUVbUYbUXbUWbUVbVcbVbbVabUZbVfbVebVdbVbbVkbVjbVibVhbTabTbbVlbTbbTdbTebVobTebTgbThbVqbThbTgbTjbNTbNTbNTaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbUVbVubVtbVsbUVbVxbVbbVwbVvbVBbVAbVzbVbbVIbVGbVEbVDbTabTubTvbTwbTdbTxbTybTzbTgbTAbTBbTCbTgaataacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacbUVbUVbVNbUVbUVbVQbVbbVPbVObVTbVSbVzbVbbVXbVWbVVbVUbTabTMbTNbTObTdbTPbTQbTRbTgbTSbTTbTUbTgaataataacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVYbWcbWbbWabVZbWgbWfbWebWdbWkbWjbWibVbbWobWnbWmbWlbTabUjbUkbUlbTdbUmbUnbUobTgbUpbUqbUrbTgaataataacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVYbWsbWrbWqbWpbWvbVbbWtbVAbVAbVAbVzbVbbWwbWwbWwbWwbTabUCbUCbUCbTdbUDbUDbUDbTgbUEbUEbUEbTgaataataataacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabVYbWsbWrbWqbWpbWvbVbbWtbVAbVAbVAbVzbVbbWLbWLbWLbWLbTabXhbXhbXhbTdbXibXibXibTgbXjbXjbXjbTgaataataataacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUVbWxbWxbUVbUVbUVbVbbWzbVAbVAbVAbWCbVbaataataatbWDaataataataataataataataataataataataataataataataataataacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacbVbbWGbWFbWFbWFbWHbVbaataataataataataataataataataataataataataataataataataataataataataataacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbVbbWLbWLbWLbWLbWLbVbaataataataataataataataataataataataataataataataataataataataataataataataacaacaacaacaacaacaacaacaacaacaacaacaacaacaataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacbVbbXkbXkbXkbXkbXkbVbaataataataataataataataataataataataataataataataataataataataataataataataacaacaacaacaacaacaacaacaacaacaacaacaacaacaataataataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaataataataataataataataataataataataataataataataataataataataataataataataataataataataataataataataacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaataataaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaataataataataataataataataataataataataataataataataataataataataataataataataataataataataataacaacaacaacaacaacaacaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaataataataataataataataataataataataataataataataabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaacaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/tether/tether-04-mining.dmm b/maps/tether/tether-04-mining.dmm index 8cf511d3ed9..0846dea5473 100644 --- a/maps/tether/tether-04-mining.dmm +++ b/maps/tether/tether-04-mining.dmm @@ -74,7 +74,7 @@ "bv" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/steel_grid,/area/outpost/mining_main/break_room) "bw" = (/turf/simulated/wall/r_wall,/area/outpost/mining_main/dorms) "bx" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/brown/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10},/obj/effect/floor_decal/corner/brown/bordercorner2{dir = 10},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/mining_main/break_room) -"by" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/brown/bordercorner2{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/structure/closet/excavation,/obj/item/weapon/storage/bag/ore,/turf/simulated/floor/tiled,/area/outpost/mining_main/break_room) +"by" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/item/weapon/storage/bag/ore,/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/tiled,/area/outpost/mining_main/break_room) "bz" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary{frequency = 1379; scrub_id = "mining_outpost_airlock_scrubber"},/turf/simulated/floor/tiled/techfloor/grid,/area/outpost/mining_main/airlock) "bA" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{icon_state = "0-2"},/turf/simulated/floor/bluegrid,/area/outpost/mining_main/airlock) "bB" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/outpost/mining_main/airlock) @@ -88,7 +88,7 @@ "bJ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/effect/floor_decal/techfloor{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics) "bK" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/wood,/area/outpost/mining_main/dorms) "bL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light_switch{dir = 1; pixel_x = 12; pixel_y = 24},/obj/structure/cable/green{icon_state = "0-4"},/turf/simulated/floor/wood,/area/outpost/mining_main/dorms) -"bM" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/structure/closet/excavation,/obj/item/weapon/storage/bag/ore,/turf/simulated/floor/tiled,/area/outpost/mining_main/break_room) +"bM" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/brown/border{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/brown/bordercorner2{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals7{dir = 10},/obj/item/weapon/storage/bag/ore,/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/tiled,/area/outpost/mining_main/break_room) "bN" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled/steel_grid,/area/outpost/mining_main/break_room) "bO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/steel_grid,/area/outpost/mining_main/break_room) "bP" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/techfloor{dir = 4},/turf/simulated/floor/tiled/techfloor,/area/outpost/engineering/atmospherics) @@ -236,8 +236,8 @@ aaababababababababababaxawaDaCaoabababababababababababalalalabababababababacacac aaababayayayayayayayayazazazaEaAaAaBabababababababababalalafabababababababacacacacababababacababababababababababababababababababababababababacacacacacababababababababababababababababababababababababababababababababababababababababababababaa aaababayaFaHaGaLaJaVayaIaYaKbgaMaNaOabababababababababalalalabababababababababababababababacababababababababababababababababababababababababacababababababababababababababababababababababababababababababababababababababababababababababababaa aaababayaPaQaRaSaTaUbmaWaWaXbvaZbaaOabababababababababafalalabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa -aaababaybbbcbdbebfbJaybhbibjbkblbMbnbnbnbnbnbnbnabababalalalabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa -aaabbobpbqbrbsbtbubPaybwbwbwbxblbybnbzbzbAbBbCbnbDalalalalalalalalalafalalbEafababababafabababababababababababafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa +aaababaybbbcbdbebfbJaybhbibjbkblbybnbnbnbnbnbnbnabababalalalabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa +aaabbobpbqbrbsbtbubPaybwbwbwbxblbMbnbzbzbAbBbCbnbDalalalalalalalalalafalalbEafababababafabababababababababababafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa aaababaybFbGbHbIbIbWaybKbLbXbNbObObYbQbRbSbTbUbVbDalafalalalalalalafafalalababafabafababababafababababafabafafabafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa aaababaybZcacacscrctaycbccbwcdcecfbnbzbzcgchcibncjalalalckclalalafalalababababababababababafabababafabababababababababafafababafabababababababababababababababababababababababababababababababababababababababababababababababababababababababaa aaababayayayayayayayaybwbwbwazazazbnbnbnbnbnbnbnababababalalabababalalababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa diff --git a/maps/tether/tether-05-solars.dmm b/maps/tether/tether-05-solars.dmm index 0ccdeca22ae..fd3491535c5 100644 --- a/maps/tether/tether-05-solars.dmm +++ b/maps/tether/tether-05-solars.dmm @@ -213,3 +213,4 @@ aaababababababababababababababababababababababababababababababababababababababab aaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/maps/tether/tether-06-colony.dmm b/maps/tether/tether-06-colony.dmm index da4c89104fa..b274e497ef6 100644 --- a/maps/tether/tether-06-colony.dmm +++ b/maps/tether/tether-06-colony.dmm @@ -135,15 +135,15 @@ "cE" = (/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/tdome1) "cF" = (/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/tdomeobserve) "cG" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/obj/structure/disposalpipe/segment,/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/tdomeobserve) -"cH" = (/turf/unsimulated/wall,/area/space) -"cI" = (/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/space) +"cH" = (/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/tdome1) +"cI" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) "cJ" = (/obj/machinery/door/airlock/research{id_tag = "researchdoor"; name = "Research Division Access"; req_access = list(47)},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/control) "cK" = (/obj/machinery/door/airlock/glass_research{name = "Robotics Lab"; req_access = list(29,47)},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/control) "cL" = (/turf/unsimulated/floor/steel{icon = 'icons/turf/flooring/circuit.dmi'; icon_state = "bcircuit"},/area/centcom/control) "cM" = (/obj/machinery/door/blast/regular{id = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) "cN" = (/obj/machinery/igniter,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) "cO" = (/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"cP" = (/obj/machinery/door/blast/regular{id = "thunderdomeaxe"; name = "Axe Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space) +"cP" = (/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,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) "cQ" = (/obj/structure/sign/science,/turf/unsimulated/wall,/area/centcom/control) "cR" = (/obj/structure/closet/l3closet/scientist,/obj/effect/floor_decal/industrial/warning,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/control) "cS" = (/obj/structure/closet/emcloset,/obj/effect/floor_decal/industrial/warning,/obj/machinery/camera/network/crescent{dir = 10},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/control) @@ -161,10 +161,10 @@ "de" = (/obj/machinery/door/blast/regular{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) "df" = (/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) "dg" = (/obj/machinery/door/blast/regular{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) -"dh" = (/obj/machinery/door/blast/regular{id = "thunderdome"; name = "Thunderdome Blast Door"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space) -"di" = (/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space) -"dj" = (/obj/machinery/door/blast/regular{id = "thunderdomegen"; name = "General Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space) -"dk" = (/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,/obj/item/weapon/melee/energy/sword/green,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space) +"dh" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) +"di" = (/obj/effect/landmark{name = "tdome1"},/obj/machinery/camera/network/thunder{invisibility = 101},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) +"dj" = (/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/tdome1) +"dk" = (/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/steel,/area/centcom/control) "dl" = (/obj/machinery/camera/network/crescent{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/control) "dm" = (/obj/effect/wingrille_spawn/reinforced/crescent,/obj/structure/sign/nanotrasen,/turf/unsimulated/floor/steel,/area/centcom/control) "dn" = (/obj/structure/sign/department/armory,/turf/unsimulated/wall,/area/centcom/control) @@ -179,7 +179,7 @@ "dw" = (/obj/structure/railing{dir = 1},/obj/machinery/light/flamp/noshade,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/centcom/evac) "dx" = (/obj/effect/floor_decal/corner_steel_grid{dir = 9},/turf/simulated/floor/outdoors/grass/sif/virgo3b,/area/centcom/evac) "dy" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome2"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) -"dz" = (/obj/machinery/recharger{pixel_y = 4},/obj/effect/landmark{name = "tdome1"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space) +"dz" = (/obj/machinery/turretid/stun{check_access = 0; check_anomalies = 0; check_records = 0; control_area = "\improper CentCom Control"; pixel_x = -28; pixel_y = -28; req_access = list(101)},/turf/unsimulated/floor/steel,/area/centcom/control) "dA" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/unsimulated/floor/steel,/area/centcom/control) "dB" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/control) "dC" = (/obj/machinery/computer/secure_data{dir = 8},/turf/unsimulated/floor/steel,/area/centcom/control) @@ -205,7 +205,7 @@ "dW" = (/obj/effect/floor_decal/industrial/warning/dust/corner{dir = 8},/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/centcom/evac) "dX" = (/obj/effect/landmark{name = "tdome2"},/obj/machinery/camera/network/thunder{invisibility = 101},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) "dY" = (/obj/machinery/flasher{id = "flash"; name = "Thunderdome Flash"},/turf/unsimulated/floor{icon_state = "dark"},/area/tdome) -"dZ" = (/obj/effect/landmark{name = "tdome1"},/obj/machinery/camera/network/thunder{invisibility = 101},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space) +"dZ" = (/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/machinery/turretid/stun{check_access = 0; check_anomalies = 0; check_records = 0; control_area = "\improper Main Hallway"; pixel_y = 32; req_access = list(101); req_one_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) "ea" = (/obj/machinery/computer/security{dir = 8},/turf/unsimulated/floor/steel,/area/centcom/control) "eb" = (/obj/machinery/computer/crew{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/control) "ec" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor/steel,/area/centcom/control) @@ -254,15 +254,15 @@ "eT" = (/obj/effect/floor_decal/rust,/obj/effect/floor_decal/industrial/warning/dust{dir = 4},/obj/structure/railing{dir = 8},/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/centcom/evac) "eU" = (/obj/effect/floor_decal/corner_steel_grid/diagonal,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/shuttle/large_escape_pod2/centcom) "eV" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) -"eW" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space) +"eW" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "eX" = (/obj/structure/table/reinforced,/turf/unsimulated/floor/steel,/area/centcom/control) "eY" = (/obj/structure/table/reinforced,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor/steel,/area/centcom/control) -"eZ" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556/ap,/obj/item/ammo_magazine/a556/ap,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"eZ" = (/turf/unsimulated/wall/planetary/virgo3b,/area/centcom/specops) "fa" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "fb" = (/obj/machinery/door/blast/regular{id = "HEAVY"; name = "HEAVY ORDINANCE"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "fc" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"fd" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/mc9mml,/obj/item/ammo_magazine/mc9mml,/obj/item/ammo_magazine/mc9mml,/obj/item/ammo_magazine/mc9mml,/obj/item/ammo_magazine/mc9mml,/obj/item/ammo_magazine/mc9mml,/obj/item/ammo_magazine/mc9mml/ap,/obj/item/ammo_magazine/mc9mml/ap,/obj/item/ammo_magazine/mc9mml/ap,/obj/item/ammo_magazine/mc9mml/ap,/obj/machinery/button/remote/blast_door{id = "ArmouryC4"; name = "Armoury Access"; pixel_x = 0; pixel_y = 28; req_access = list(3)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"fe" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"fd" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/m9mml,/obj/item/ammo_magazine/m9mml,/obj/item/ammo_magazine/m9mml,/obj/item/ammo_magazine/m9mml,/obj/item/ammo_magazine/m9mml,/obj/item/ammo_magazine/m9mml,/obj/item/ammo_magazine/m9mml/ap,/obj/item/ammo_magazine/m9mml/ap,/obj/item/ammo_magazine/m9mml/ap,/obj/item/ammo_magazine/m9mml/ap,/obj/machinery/button/remote/blast_door{id = "ArmouryC4"; name = "Armoury Access"; pixel_x = 0; pixel_y = 28; req_access = list(3)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"fe" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/item/ammo_magazine/m9mmp90,/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "ff" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/battlerifle,/obj/item/ammo_magazine/battlerifle,/obj/item/ammo_magazine/battlerifle,/obj/item/ammo_magazine/battlerifle,/obj/item/ammo_magazine/battlerifle,/obj/item/ammo_magazine/battlerifle,/obj/item/ammo_magazine/battlerifle,/obj/item/ammo_magazine/battlerifle,/obj/item/ammo_magazine/battlerifle,/obj/item/ammo_magazine/battlerifle,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "fg" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/shotgunammo/large,/obj/item/weapon/storage/box/shotgunammo/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "fh" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/beanbags/large,/obj/item/weapon/storage/box/beanbags/large,/obj/item/weapon/storage/box/beanbags/large,/obj/item/weapon/storage/box/beanbags/large,/obj/item/weapon/storage/box/beanbags/large,/obj/item/weapon/storage/box/beanbags/large,/obj/item/weapon/storage/box/beanbags/large,/obj/item/weapon/storage/box/beanbags/large,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) @@ -282,7 +282,7 @@ "fv" = (/obj/effect/floor_decal/industrial/warning/dust{dir = 9},/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/centcom/evac) "fw" = (/obj/effect/floor_decal/industrial/warning/dust/corner{dir = 1},/obj/machinery/light/flamp/noshade,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/centcom/evac) "fx" = (/obj/machinery/door/blast/regular{id = "thunderdomehea"; name = "Heavy Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/tdome/tdome1) -"fy" = (/obj/machinery/door/blast/regular{id = "thunderdomehea"; name = "Heavy Supply"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/space) +"fy" = (/turf/simulated/shuttle/wall,/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "fz" = (/obj/machinery/computer/ordercomp{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/control) "fA" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "fB" = (/obj/effect/floor_decal/corner_steel_grid/diagonal,/obj/effect/floor_decal/industrial/warning/dust/corner{dir = 4},/obj/structure/railing{dir = 8},/obj/machinery/light/flamp/noshade,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/centcom/evac) @@ -301,14 +301,14 @@ "fO" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/centcom/evac) "fP" = (/obj/effect/floor_decal/rust,/obj/effect/floor_decal/corner_steel_grid/diagonal,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/centcom/evac) "fQ" = (/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/tdome1) -"fR" = (/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/space) +"fR" = (/obj/structure/closet/hydrant{pixel_x = -30; pixel_y = 0},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/toxin,/obj/structure/bed/chair/shuttle,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "fS" = (/obj/machinery/computer/robotics{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/control) -"fT" = (/obj/machinery/button/remote/blast_door{id = "crescent_checkpoint_access"; name = "Crescent Checkpoint Access"; pixel_x = -6; pixel_y = -24; req_access = list(101)},/obj/machinery/turretid{pixel_x = 28; pixel_y = -28; req_access = list(101)},/turf/unsimulated/floor/steel,/area/centcom/control) +"fT" = (/turf/simulated/shuttle/wall/hard_corner,/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "fU" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/storage/box/sniperammo,/obj/item/weapon/storage/box/sniperammo,/obj/item/weapon/storage/box/sniperammo,/obj/item/weapon/storage/box/sniperammo,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "fV" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/gun/projectile/heavysniper,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"fW" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"fX" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"fY" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"fW" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/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/item/ammo_magazine/m9mmt,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"fX" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/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,/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 = "vault"; dir = 5},/area/centcom/security) +"fY" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/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,/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/security) "fZ" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/storage/box/shotgunshells/large,/obj/item/weapon/storage/box/shotgunshells/large,/obj/item/weapon/storage/box/shotgunshells/large,/obj/item/weapon/storage/box/shotgunshells/large,/obj/item/weapon/storage/box/shotgunshells/large,/obj/item/weapon/storage/box/shotgunshells/large,/obj/item/weapon/storage/box/shotgunshells/large,/obj/item/weapon/storage/box/shotgunshells/large,/obj/item/weapon/storage/box/shotgunshells/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "ga" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/gun/energy/netgun,/obj/item/weapon/gun/energy/netgun,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "gb" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/frags,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) @@ -332,7 +332,7 @@ "gt" = (/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/shuttle/large_escape_pod1/centcom) "gu" = (/obj/effect/floor_decal/rust,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/shuttle/large_escape_pod1/centcom) "gv" = (/obj/effect/floor_decal/industrial/warning/dust/corner{dir = 8},/obj/machinery/light/flamp/noshade,/turf/simulated/floor/tiled/steel_dirty/virgo3b,/area/centcom/evac) -"gw" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762/ap,/obj/item/ammo_magazine/s762/ap,/obj/item/ammo_magazine/s762/ap,/obj/item/ammo_magazine/s762/ap,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"gw" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/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,/obj/item/ammo_magazine/m762/ap,/obj/item/ammo_magazine/m762/ap,/obj/item/ammo_magazine/m762/ap,/obj/item/ammo_magazine/m762/ap,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "gx" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "gy" = (/obj/machinery/button/remote/blast_door{id = "HEAVY"; name = "SHIT IS LIT"; pixel_x = 0; pixel_y = -28; req_access = list(3)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "gz" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/cell/device/weapon{pixel_x = -2; pixel_y = -2},/obj/item/weapon/cell/device/weapon{pixel_x = -2; pixel_y = -2},/obj/item/weapon/cell/device/weapon{pixel_x = -2; pixel_y = -2},/obj/item/weapon/cell/device/weapon{pixel_x = -2; pixel_y = -2},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) @@ -364,7 +364,7 @@ "gZ" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/carbine,/obj/item/weapon/gun/projectile/automatic/carbine,/obj/item/weapon/gun/projectile/automatic/carbine,/obj/item/weapon/gun/projectile/automatic/carbine,/obj/item/weapon/gun/projectile/automatic/carbine,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "ha" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/wt550/lethal,/obj/item/weapon/gun/projectile/automatic/wt550/lethal,/obj/item/weapon/gun/projectile/automatic/wt550/lethal,/obj/item/weapon/gun/projectile/automatic/wt550/lethal,/obj/item/weapon/gun/projectile/automatic/wt550/lethal,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "hb" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"hc" = (/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) +"hc" = (/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "hd" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/structure/closet/secure_closet/nanotrasen_commander,/obj/item/clothing/suit/armor/swat,/obj/item/clothing/head/helmet/space/deathsquad{name = "swat helmet"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) "he" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) "hf" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/structure/table/woodentable,/obj/item/device/radio/off,/obj/item/device/megaphone,/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) @@ -429,7 +429,7 @@ "im" = (/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 8},/obj/effect/floor_decal/corner/green/bordercorner2{dir = 8},/obj/machinery/computer/centrifuge,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "in" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/green/border{dir = 8},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "io" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/green/border{dir = 4},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"ip" = (/obj/machinery/turretid{pixel_x = -28; pixel_y = -28; req_access = list(101)},/turf/unsimulated/floor/steel,/area/centcom/control) +"ip" = (/obj/structure/bed/chair/shuttle,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "iq" = (/obj/structure/bed/chair/office/dark,/obj/machinery/button/remote/blast_door{desc = "A remote control switch for port-side blast doors."; id = "CentComPort"; name = "Security Doors"; pixel_x = -12; pixel_y = -25; req_access = list(101)},/turf/unsimulated/floor/steel,/area/centcom/control) "ir" = (/obj/machinery/camera/network/crescent{dir = 8},/obj/machinery/computer/secure_data{dir = 8},/turf/unsimulated/floor/steel,/area/centcom/control) "is" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/table/rack{dir = 4},/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/obj/item/device/suit_cooling_unit,/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/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) @@ -490,7 +490,7 @@ "jv" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 5; pixel_y = 5},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 0; pixel_y = 0},/obj/item/weapon/reagent_containers/glass/beaker/cryoxadone{pixel_x = 7; pixel_y = 1},/obj/item/weapon/wrench,/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "jw" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "jx" = (/obj/machinery/atmospherics/unary/freezer,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"jy" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"jy" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/specops/centcom) "jz" = (/obj/structure/table/steel,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/medical) "jA" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/medical) "jB" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/medical) @@ -511,7 +511,7 @@ "jQ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "jR" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "jS" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"jT" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"jT" = (/turf/simulated/shuttle/wall/dark{join_group = "shuttle_ert"},/area/shuttle/specops/centcom) "jU" = (/obj/machinery/door/airlock/medical{name = "Morgue"; req_access = list(6)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/medical) "jV" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/medical) "jW" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/medical) @@ -532,8 +532,8 @@ "kl" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "km" = (/obj/structure/closet/l3closet/virology,/obj/item/clothing/mask/gas,/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "kn" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"ko" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 9},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 9},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"kp" = (/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/paleblue/border{dir = 6},/obj/effect/floor_decal/borderfloorwhite/corner2,/obj/effect/floor_decal/corner/paleblue/bordercorner2,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"ko" = (/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"kp" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/pulse_rifle,/obj/item/weapon/gun/energy/pulse_rifle,/obj/item/weapon/gun/energy/pulse_rifle,/obj/item/weapon/gun/energy/pulse_rifle,/obj/item/weapon/gun/energy/pulse_rifle,/obj/item/weapon/gun/energy/pulse_rifle,/obj/item/weapon/storage/secure/briefcase/nsfw_pack,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "kq" = (/obj/structure/filingcabinet/chestdrawer{desc = "A large drawer filled with autopsy reports."; name = "Autopsy Reports"},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/medical) "kr" = (/obj/structure/table/steel,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/surgical/scalpel,/obj/item/weapon/surgical/cautery,/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/medical) "ks" = (/obj/machinery/optable,/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/medical) @@ -556,6 +556,7 @@ "kJ" = (/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/unsimulated/floor/steel,/area/centcom/security) "kK" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/security) "kL" = (/obj/machinery/door/airlock/external{locked = 1; name = "Emergency Airlock"; req_access = list(101)},/turf/unsimulated/floor/steel,/area/centcom/evac) +"kM" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "kN" = (/obj/structure/table/standard,/obj/item/weapon/surgical/hemostat,/obj/item/weapon/surgical/cautery,/obj/effect/floor_decal/borderfloorwhite{dir = 9},/obj/effect/floor_decal/corner/paleblue/border{dir = 9},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "kO" = (/obj/structure/table/standard,/obj/item/stack/medical/advanced/bruise_pack,/obj/item/weapon/surgical/retractor,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "kP" = (/obj/structure/table/standard,/obj/item/weapon/surgical/circular_saw{pixel_y = 8},/obj/item/weapon/surgical/scalpel,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) @@ -566,9 +567,9 @@ "kU" = (/obj/structure/table/glass,/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 1},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 1},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "kV" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 5; icon_state = "borderfloorcorner2_white"; pixel_x = 0; pixel_y = 0; tag = "icon-borderfloorcorner2_white (NORTHEAST)"},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 4},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/obj/machinery/computer/transhuman,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "kW" = (/obj/machinery/transhuman/synthprinter,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"kX" = (/obj/machinery/clonepod/transhuman,/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"kY" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 1},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 1},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/obj/machinery/transhuman/resleever,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"kZ" = (/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 4},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 4},/obj/structure/filingcabinet/chestdrawer{name = "Medical Forms"},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"kX" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/specops/centcom) +"kY" = (/obj/machinery/computer/security/telescreen{desc = ""; name = "Spec. Ops. Monitor"; network = list("NETWORK_ERT"); pixel_y = 30},/obj/machinery/computer/shuttle_control/specops,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"kZ" = (/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/specops/centcom) "la" = (/obj/structure/table/standard,/obj/machinery/computer/skills{pixel_y = 2},/obj/effect/floor_decal/borderfloor{dir = 9},/turf/unsimulated/floor/steel,/area/centcom/command) "lb" = (/obj/structure/table/standard,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/unsimulated/floor/steel,/area/centcom/command) "lc" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/structure/reagent_dispensers/water_cooler/full,/obj/machinery/camera/network/crescent,/turf/unsimulated/floor/steel,/area/centcom/command) @@ -693,7 +694,7 @@ "nr" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/paleblue/border{dir = 6},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 6},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 6},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "ns" = (/obj/structure/sign/department/operational,/turf/unsimulated/wall,/area/centcom/medical) "nt" = (/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/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 8},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 8},/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = 4; pixel_y = 2},/obj/item/weapon/reagent_containers/blood/OPlus{pixel_x = 4; pixel_y = 2},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"nu" = (/obj/structure/table/glass,/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/item/weapon/storage/box/syringes,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"nu" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) "nv" = (/obj/structure/table/standard,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/structure/flora/pottedplant{icon_state = "plant-01"; pixel_y = 10; tag = "icon-plant-01"},/turf/unsimulated/floor/steel,/area/centcom/command) "nw" = (/obj/structure/bed/chair/office/light,/turf/unsimulated/floor/steel,/area/centcom/command) "nx" = (/obj/structure/table/standard,/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/borderfloor/corner2{dir = 6},/turf/unsimulated/floor/steel,/area/centcom/command) @@ -712,8 +713,8 @@ "nK" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/closet/secure_closet/medical3,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "nL" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 9},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 9},/obj/structure/closet/secure_closet/paramedic,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "nM" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/borderfloorwhite/corner2,/obj/effect/floor_decal/corner/paleblue/bordercorner2,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"nN" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/o2,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) -"nO" = (/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/paleblue/border{dir = 6},/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/fire,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"nN" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 32},/obj/structure/bed/chair,/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"nO" = (/turf/simulated/shuttle/wall/dark{hard_corner = 1; join_group = "shuttle_ert"},/area/shuttle/specops/centcom) "nP" = (/obj/structure/table/standard,/obj/machinery/computer/skills{pixel_y = 2},/obj/effect/floor_decal/borderfloor{dir = 10},/turf/unsimulated/floor/steel,/area/centcom/command) "nQ" = (/obj/structure/table/standard,/obj/effect/floor_decal/borderfloor,/turf/unsimulated/floor/steel,/area/centcom/command) "nR" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/borderfloor/corner2{dir = 9},/obj/structure/closet/crate/bin,/turf/unsimulated/floor/steel,/area/centcom/command) @@ -780,8 +781,8 @@ "pa" = (/obj/structure/flora/pottedplant{icon_state = "plant-21"},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) "pb" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/machinery/shower{pixel_y = 13},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) "pc" = (/obj/machinery/door/airlock/security{name = "Security"},/turf/unsimulated/floor/steel,/area/centcom/security) -"pd" = (/turf/simulated/shuttle/wall,/area/shuttle/escape/centcom) -"pe" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/plating,/area/shuttle/escape/centcom) +"pd" = (/obj/structure/table/standard,/obj/random/maintenance/clean,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"pe" = (/obj/machinery/status_display{pixel_y = 30},/obj/structure/table/standard,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "pf" = (/obj/structure/table/woodentable{dir = 5},/obj/structure/flora/pottedplant{pixel_y = 8},/turf/simulated/floor/tiled,/area/centcom/terminal) "pg" = (/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/machinery/computer/crew{dir = 4},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "ph" = (/obj/structure/table/glass,/obj/item/weapon/paper_bin{pixel_x = -1; pixel_y = 3},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) @@ -798,10 +799,10 @@ "ps" = (/obj/machinery/vending/cigarette,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor/steel,/area/centcom/security) "pt" = (/obj/machinery/vending/snack,/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor/steel,/area/centcom/security) "pu" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/blue/border{dir = 6},/turf/unsimulated/floor/steel,/area/centcom/security) -"pv" = (/turf/simulated/shuttle/wall/hard_corner,/area/shuttle/escape/centcom) -"pw" = (/obj/structure/closet/hydrant{pixel_x = -30; pixel_y = 0},/obj/item/weapon/storage/firstaid/o2{layer = 2.8; pixel_x = 4; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire,/obj/item/weapon/storage/firstaid/toxin,/obj/structure/bed/chair/shuttle,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"px" = (/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"py" = (/obj/structure/bed/chair/shuttle,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) +"pv" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/sign/warning/lethal_turrets{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"pw" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 1},/obj/machinery/turretid/stun{check_access = 0; check_anomalies = 0; check_records = 0; control_area = "\improper CentCom Security"; pixel_y = 32; req_access = list(101); req_one_access = list(101)},/turf/unsimulated/floor/steel,/area/centcom/security) +"px" = (/obj/structure/bed/chair/shuttle{dir = 1},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"py" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch_station"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/yellow,/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "pz" = (/obj/structure/bed/chair{dir = 8},/turf/unsimulated/floor/steel,/area/centcom/terminal) "pA" = (/obj/structure/table/glass,/obj/effect/floor_decal/borderfloorwhite{dir = 8},/obj/effect/floor_decal/corner/paleblue/border{dir = 8},/obj/item/weapon/backup_implanter{pixel_y = -8},/obj/item/weapon/backup_implanter{pixel_y = 8},/obj/item/weapon/backup_implanter,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "pB" = (/obj/structure/table/glass,/obj/machinery/computer/med_data{icon_keyboard = "laptop_key"; icon_screen = "medlaptop"; icon_state = "laptop"; light_color = "#00b000"},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) @@ -819,22 +820,22 @@ "pN" = (/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/turf/unsimulated/floor/steel,/area/centcom/security) "pO" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/vending/security,/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/turf/unsimulated/floor/steel,/area/centcom/security) "pP" = (/obj/effect/floor_decal/techfloor/orange{dir = 8},/obj/machinery/camera/network/crescent{dir = 4},/turf/unsimulated/floor/techfloor_grid,/area/centcom/terminal) -"pQ" = (/obj/structure/table/standard,/obj/random/maintenance/clean,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"pR" = (/obj/structure/table/standard,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"pS" = (/obj/machinery/status_display{pixel_y = 30},/obj/structure/table/standard,/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) +"pQ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch_offsite"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/yellow,/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"pR" = (/obj/structure/bed/chair/shuttle,/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"pS" = (/obj/structure/bed/chair/shuttle,/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "pT" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/cups,/obj/item/weapon/storage/box/cups,/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "pU" = (/obj/machinery/computer/secure_data,/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor/steel,/area/centcom/security) "pV" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 27},/turf/unsimulated/floor/steel,/area/centcom/security) "pW" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloor/corner2{dir = 4; icon_state = "borderfloorcorner2"; pixel_y = 0; tag = "icon-borderfloorcorner2 (EAST)"},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/security) "pX" = (/obj/machinery/computer/card,/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/turf/unsimulated/floor/steel,/area/centcom/security) "pY" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor/steel,/area/centcom/security) -"pZ" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/sign/warning/lethal_turrets{pixel_y = 32},/turf/unsimulated/floor/steel,/area/centcom/security) -"qa" = (/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/effect/floor_decal/borderfloor/corner2{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 1},/turf/unsimulated/floor/steel,/area/centcom/security) +"pZ" = (/obj/structure/table/standard,/obj/random/junk,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"qa" = (/obj/structure/table/standard,/obj/random/maintenance/clean,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "qb" = (/obj/machinery/computer/card{dir = 8},/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/obj/effect/floor_decal/borderfloor/corner2{dir = 4; icon_state = "borderfloorcorner2"; pixel_y = 0; tag = "icon-borderfloorcorner2 (EAST)"},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/security) "qc" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/borderfloor{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/obj/machinery/camera/network/crescent{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/security) "qd" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor/steel,/area/centcom/security) "qe" = (/obj/item/weapon/stool/padded,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/security) -"qf" = (/obj/structure/bed/chair/shuttle{dir = 1},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) +"qf" = (/obj/structure/sign/nanotrasen,/turf/simulated/shuttle/wall,/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "qg" = (/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/structure/closet/crate/bin,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "qh" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bathroom) "qi" = (/obj/machinery/punching_clown,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/bathroom) @@ -850,8 +851,8 @@ "qs" = (/obj/effect/floor_decal/steeldecal/steel_decals5,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/turf/unsimulated/floor/steel,/area/centcom/security) "qt" = (/obj/effect/floor_decal/steeldecal/steel_decals5,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/security) "qu" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/unsimulated/wall,/area/centcom/terminal) -"qv" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch_station"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/yellow,/area/shuttle/escape/centcom) -"qw" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_shuttle_hatch_offsite"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/yellow,/area/shuttle/escape/centcom) +"qv" = (/obj/structure/table/standard,/obj/item/clothing/head/beret/nanotrasen,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"qw" = (/obj/structure/table/standard,/obj/random/plushie,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "qx" = (/obj/structure/table/glass,/obj/item/roller,/obj/item/roller{pixel_y = 8},/obj/item/roller{pixel_y = 16},/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/corner/paleblue/border{dir = 10},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "qy" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) "qz" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 9},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 9},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) @@ -875,8 +876,8 @@ "qR" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/brigdoor{tag = "icon-leftsecure"; icon_state = "leftsecure"; dir = 2},/obj/effect/floor_decal/borderfloor{dir = 6},/obj/effect/floor_decal/corner/blue/border{dir = 6},/turf/unsimulated/floor/steel,/area/centcom/security) "qS" = (/obj/effect/floor_decal/industrial/outline,/obj/structure/closet/secure_closet/nanotrasen_security,/turf/unsimulated/floor/steel,/area/centcom/security) "qT" = (/obj/effect/floor_decal/industrial/outline,/obj/structure/closet/secure_closet/nanotrasen_security{desc = "This locker is filled silly stickers and some other serious NanoTrasen ones. It is lazily labeled 'The big cat'."},/turf/unsimulated/floor/steel,/area/centcom/security) -"qU" = (/obj/structure/bed/chair/shuttle,/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"qV" = (/obj/structure/bed/chair/shuttle,/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) +"qU" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "FrontlockBD"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor/steel,/area/centcom/main_hall) +"qV" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "qW" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor/steel,/area/centcom/main_hall) "qX" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/main_hall) "qY" = (/obj/effect/wingrille_spawn/reinforced/crescent,/obj/structure/sign/department/medbay,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/medical) @@ -887,8 +888,8 @@ "rd" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/multi_tile/glass,/turf/unsimulated/floor/steel,/area/centcom/command) "re" = (/obj/structure/sign/nanotrasen,/turf/unsimulated/wall,/area/centcom/command) "rf" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass{name = "Locker Room"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/bathroom) -"rg" = (/obj/structure/table/standard,/obj/random/junk,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"rh" = (/obj/structure/table/standard,/obj/random/maintenance/clean,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) +"rg" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"rh" = (/turf/unsimulated/wall,/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "ri" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "rj" = (/obj/machinery/newscaster{pixel_y = 32},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "rk" = (/obj/structure/bed/chair,/obj/effect/floor_decal/industrial/outline,/turf/unsimulated/floor/steel,/area/centcom/main_hall) @@ -916,7 +917,7 @@ "rG" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/living) "rH" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/structure/reagent_dispensers/water_cooler/full,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/living) "rI" = (/turf/unsimulated/wall/planetary/virgo3b,/area/centcom/living) -"rJ" = (/obj/structure/sign/nanotrasen,/turf/simulated/shuttle/wall,/area/shuttle/escape/centcom) +"rJ" = (/obj/effect/floor_decal/industrial/outline,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "rK" = (/obj/effect/floor_decal/steeldecal/steel_decals5{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "rL" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "CentComPort"; name = "Security Doors"; opacity = 0},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "rM" = (/obj/effect/floor_decal/industrial/outline,/turf/unsimulated/floor/steel,/area/centcom/main_hall) @@ -928,16 +929,16 @@ "rS" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/living) "rT" = (/obj/machinery/door/airlock/multi_tile/glass{dir = 1},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "rU" = (/obj/machinery/cryopod/robot/door/dorms{base_icon_state = "door_closed"; desc = "A small elevator"; dir = 2; icon = 'icons/obj/doors/Door2x1glass.dmi'; icon_state = "door_closed"; name = "Elevator"; on_enter_occupant_message = "The elevator door closes slowly, You can now head for residential, comercial and several other floors."; on_store_message = "has departed for one of the various colony floors"; on_store_name = "Colonial Oversight"; on_store_visible_message_2 = "to the colonial districts."; time_till_despawn = 5},/turf/unsimulated/floor/steel,/area/centcom/living) -"rV" = (/obj/structure/table/standard,/obj/item/clothing/head/beret/nanotrasen,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"rW" = (/obj/structure/table/standard,/obj/random/plushie,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) +"rV" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"rW" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/machinery/door/window/brigdoor/northleft{req_access = list(63); req_one_access = list(1)},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/button/remote/blast_door{id = "FrontlockC"; name = "Colony Entrance Lockdown"; pixel_x = 6; pixel_y = -5; req_access = list(63); req_one_access = list(1)},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "FrontlockC2"; name = "Security Door"; opacity = 0},/obj/machinery/button/remote/blast_door{id = "FrontlockBD"; name = "Colony Entrance Bottom"; pixel_x = -3; pixel_y = -5; req_access = list(63); req_one_access = list(1)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "rX" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "CentComPort"; name = "Security Doors"; opacity = 0},/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "rY" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 6},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "rZ" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "CentComPort"; name = "Security Doors"; opacity = 0},/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "sa" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/living) "sb" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/living) "sc" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/structure/flora/pottedplant{icon_state = "plant-24"},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/living) -"sd" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = -28},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"se" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/structure/closet/walllocker/emerglocker{pixel_x = 28},/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) +"sd" = (/obj/effect/wingrille_spawn/reinforced/crescent,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "FrontlockC2"; name = "Security Door"; opacity = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"se" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/borderfloorblack{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/obj/machinery/door/window/brigdoor/northright{req_access = list(63); req_one_access = list(1)},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "FrontlockC2"; name = "Security Door"; opacity = 0},/obj/machinery/computer/skills,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "sf" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "sg" = (/obj/effect/floor_decal/industrial/outline,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "sh" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/multi_tile/glass,/turf/unsimulated/floor/steel,/area/centcom/main_hall) @@ -947,9 +948,9 @@ "sl" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/restaurant) "sm" = (/obj/machinery/door/airlock{name = "Unisex Restrooms"},/turf/unsimulated/floor/steel,/area/centcom/bathroom) "sn" = (/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "turrets"; name = "Security Door"; opacity = 0},/turf/unsimulated/floor/steel,/area/centcom/security) -"so" = (/obj/effect/wingrille_spawn/reinforced/crescent,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "FrontlockC2"; name = "Security Door"; opacity = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"sp" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/machinery/door/window/brigdoor/northleft{req_access = list(63); req_one_access = list(1)},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/button/remote/blast_door{id = "FrontlockC"; name = "Colony Entrance Lockdown"; pixel_x = 6; pixel_y = -5; req_access = list(63); req_one_access = list(1)},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "FrontlockC2"; name = "Security Door"; opacity = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"sq" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/borderfloorblack{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/obj/machinery/door/window/brigdoor/northright{req_access = list(63); req_one_access = list(1)},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "FrontlockC2"; name = "Security Door"; opacity = 0},/obj/machinery/computer/skills,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"so" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"sp" = (/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"sq" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 1},/obj/machinery/button/remote/blast_door{id = "FrontlockC2"; name = "Checkpoint Shielding"; pixel_x = -35; pixel_y = -8; req_access = list(63); req_one_access = list(1)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "sr" = (/obj/structure/bed/chair,/turf/unsimulated/floor/steel,/area/centcom/main_hall) "ss" = (/obj/structure/flora/pottedplant{icon_state = "plant-10"},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "st" = (/obj/structure/flora/pottedplant,/turf/unsimulated/floor/steel,/area/centcom/main_hall) @@ -980,12 +981,12 @@ "sS" = (/obj/structure/closet{name = "Evidence Closet"},/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "sT" = (/obj/structure/closet{name = "Evidence Closet"},/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "sU" = (/obj/structure/closet{name = "Evidence Closet"},/obj/effect/floor_decal/borderfloorblack{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"sV" = (/obj/structure/grille,/obj/structure/shuttle/window,/turf/simulated/shuttle/floor/white,/area/shuttle/escape/centcom) -"sW" = (/obj/effect/floor_decal/industrial/outline/blue,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"sX" = (/obj/machinery/computer/card{dir = 4},/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 27},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"sY" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 1},/obj/machinery/button/remote/blast_door{id = "FrontlockC2"; name = "Checkpoint Shielding"; pixel_x = -35; pixel_y = -8; req_access = list(63); req_one_access = list(1)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"sZ" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner{dir = 4},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"ta" = (/obj/machinery/computer/security{dir = 8},/obj/effect/floor_decal/borderfloorblack{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"sV" = (/obj/machinery/computer/card{dir = 4},/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 27},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"sW" = (/obj/machinery/computer/security{dir = 8},/obj/effect/floor_decal/borderfloorblack{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"sX" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner{dir = 4},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"sY" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/machinery/light,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"sZ" = (/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/light,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"ta" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "tb" = (/obj/effect/floor_decal/spline/fancy/wood/corner,/turf/unsimulated/floor/steel,/area/centcom/main_hall) "tc" = (/obj/effect/floor_decal/spline/fancy/wood,/turf/unsimulated/floor/steel,/area/centcom/main_hall) "td" = (/obj/effect/floor_decal/spline/fancy/wood/corner{dir = 8},/turf/unsimulated/floor/steel,/area/centcom/main_hall) @@ -1003,10 +1004,10 @@ "tp" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/machinery/button/remote/blast_door{name = "Turret Doors"; pixel_x = -23; req_access = list(63); req_one_access = list(1); id = "turrets"},/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 10},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "tq" = (/obj/machinery/door/airlock/glass_security{name = "Confiscated Items"; req_access = list(3)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "tr" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"ts" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/machinery/light,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"tt" = (/obj/effect/floor_decal/industrial/outline/blue,/obj/machinery/light,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"tu" = (/obj/machinery/computer/secure_data{dir = 4},/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"tv" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 5},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 5},/obj/structure/table/reinforced,/obj/item/device/camera,/obj/item/weapon/storage/box/ids,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"ts" = (/obj/machinery/computer/secure_data{dir = 4},/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"tt" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 5},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 5},/obj/structure/table/reinforced,/obj/item/device/camera,/obj/item/weapon/storage/box/ids,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"tu" = (/obj/random/junk,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) +"tv" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/random/soap,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom{base_turf = /turf/unsimulated/floor/techfloor_grid}) "tw" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "tx" = (/turf/unsimulated/floor/steel{icon = 'icons/turf/outdoors.dmi'; icon_state = "grass"},/area/centcom/main_hall) "ty" = (/obj/structure/table/bench/wooden,/turf/unsimulated/floor/steel{icon = 'icons/turf/outdoors.dmi'; icon_state = "grass"},/area/centcom/main_hall) @@ -1025,9 +1026,9 @@ "tL" = (/obj/machinery/door/window/brigdoor{req_access = list(63); req_one_access = list(1)},/obj/machinery/button/remote/airlock{id = "front"; name = "Front doors"; pixel_x = 5; pixel_y = 25; req_access = list(63); req_one_access = list(1)},/obj/machinery/button/remote/airlock{id = "innerS"; name = "Inner doors"; pixel_x = -5; pixel_y = 25; req_access = list(63); req_one_access = list(1)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "tM" = (/obj/structure/bed/chair/office/dark,/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 6},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 6},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "tN" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 8},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"tO" = (/obj/random/junk,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"tP" = (/obj/structure/bed/chair/shuttle{dir = 1},/obj/random/soap,/turf/simulated/shuttle/floor/white{color = "#cccccc"},/area/shuttle/escape/centcom) -"tQ" = (/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/book/manual/security_space_law,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"tO" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"tP" = (/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/obj/item/weapon/book/manual/security_space_law,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"tQ" = (/obj/machinery/turretid/stun{check_access = 0; check_anomalies = 0; check_records = 0; check_synth = 0; check_weapons = 0; control_area = "\improper CentCom Security Arrivals"; pixel_x = 32; req_access = list(101); req_one_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "tR" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "tS" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/borderfloorblack/corner2{dir = 9},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "tT" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/main_hall) @@ -1070,9 +1071,9 @@ "uE" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/centcom/restaurant) "uF" = (/obj/machinery/door/airlock/glass_security{id_tag = "innerS"; name = "Colonial Security Airlock"; req_access = list(63)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "uG" = (/obj/machinery/door/airlock/glass_security{name = "Warden's Office"; req_access = list(3)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"uH" = (/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/structure/table/reinforced,/obj/machinery/microwave{pixel_y = 5},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"uI" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"uJ" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 1},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"uH" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/borderfloorblack/corner2{dir = 9},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"uI" = (/obj/machinery/door/airlock/security{name = "Security"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"uJ" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "uK" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/camera/network/crescent{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/main_hall) "uL" = (/obj/structure/bed/chair/wood/wings{icon_state = "wooden_chair_wings"; dir = 1},/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/restaurant) "uM" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/carpet{dir = 8},/obj/item/weapon/material/ashtray/glass,/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/centcom/restaurant) @@ -1086,8 +1087,8 @@ "uU" = (/obj/machinery/door/airlock/glass_security{name = "Security Processing"; req_access = list(1)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "uV" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 4},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 4},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "uW" = (/obj/machinery/vending/security,/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"uX" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"uY" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 6},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 5},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 5},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 6},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"uX" = (/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/structure/table/reinforced,/obj/machinery/microwave{pixel_y = 5},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"uY" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 1},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "uZ" = (/obj/structure/table/standard,/obj/item/weapon/soap,/obj/effect/floor_decal/borderfloorwhite{dir = 10},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 8},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bathroom) "va" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 9},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bathroom) "vb" = (/obj/machinery/door/airlock{name = "Unit 4"},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bathroom) @@ -1096,9 +1097,9 @@ "ve" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/borderfloorblack/corner2,/obj/effect/floor_decal/corner/blue/bordercorner2,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "vf" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/borderfloorblack/corner2,/obj/effect/floor_decal/borderfloorblack/corner2{dir = 9},/obj/effect/floor_decal/corner/blue/bordercorner2,/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "vg" = (/obj/effect/wingrille_spawn/reinforced/crescent,/obj/structure/sign/department/interrogation,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"vh" = (/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/obj/structure/table/reinforced,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/gun/energy/taser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"vi" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/structure/closet/secure_closet/nanotrasen_security,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/shield/riot,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"vj" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/borderfloorblack/corner2{dir = 9},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 9},/obj/structure/closet/secure_closet/nanotrasen_security,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/shield/riot,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"vh" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 1},/obj/machinery/turretid/stun{check_access = 0; check_anomalies = 0; check_records = 0; control_area = "\improper CentCom Security"; pixel_y = 32; req_access = list(101); req_one_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"vi" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"vj" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 6},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 5},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 5},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 6},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "vk" = (/obj/machinery/vending/cigarette,/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/centcom/restaurant) "vl" = (/obj/effect/floor_decal/carpet,/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/centcom/restaurant) "vm" = (/obj/effect/floor_decal/carpet,/obj/effect/floor_decal/carpet{dir = 4},/obj/effect/floor_decal/carpet{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "carpet"},/area/centcom/restaurant) @@ -1204,7 +1205,7 @@ "xi" = (/obj/structure/table/reinforced,/obj/machinery/chemical_dispenser/bar_soft/full,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/bar) "xj" = (/obj/structure/table/reinforced,/obj/machinery/chemical_dispenser/bar_alc/full,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/bar) "xk" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/food/drinks/flask/barflask,/obj/item/weapon/reagent_containers/glass/rag,/obj/item/weapon/reagent_containers/food/drinks/flask/vacuumflask,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/bar) -"xl" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "residential"; name = "Security Door"; opacity = 0},/turf/unsimulated/floor/steel,/area/centcom/main_hall) +"xl" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/structure/closet/secure_closet/nanotrasen_security,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/shield/riot,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) "xm" = (/obj/machinery/newscaster{pixel_x = -27},/turf/unsimulated/floor/steel,/area/centcom/security) "xn" = (/obj/structure/flora/pottedplant{icon_state = "plant-10"},/turf/unsimulated/floor/steel,/area/centcom/security) "xo" = (/obj/structure/bed/chair{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/security) @@ -1213,11 +1214,11 @@ "xr" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "xs" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/pill_bottle/dice,/obj/item/weapon/deck/cards,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "xt" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/door/airlock/glass{name = "Kitchen"; req_access = list(28)},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bar) -"xu" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals10,/turf/unsimulated/floor/steel,/area/centcom/security) -"xv" = (/obj/machinery/computer/card,/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"xw" = (/obj/machinery/computer/secure_data,/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 1},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"xx" = (/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 27},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"xy" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 27},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"xu" = (/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/obj/structure/table/reinforced,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/gun/energy/taser,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"xv" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/borderfloorblack/corner2{dir = 9},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 9},/obj/structure/closet/secure_closet/nanotrasen_security,/obj/item/weapon/storage/box/handcuffs,/obj/item/weapon/gun/energy/gun,/obj/item/weapon/shield/riot,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Security Arrivals"}) +"xw" = (/obj/machinery/door/firedoor,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "residential"; name = "Security Door"; opacity = 0},/turf/unsimulated/floor/steel,/area/centcom/security{name = "\improper CentCom Residential Security"}) +"xx" = (/turf/unsimulated/wall,/area/centcom/security{name = "\improper CentCom Residential Security"}) +"xy" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor/steel,/area/centcom/security{name = "\improper CentCom Residential Security"}) "xz" = (/obj/machinery/status_display{pixel_x = -31},/turf/unsimulated/floor/steel,/area/centcom/security) "xA" = (/obj/machinery/door/airlock,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "xB" = (/obj/structure/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) @@ -1227,20 +1228,20 @@ "xF" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/table/marble,/obj/machinery/reagentgrinder,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bar) "xG" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/vending/dinnerware,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bar) "xH" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bar) -"xI" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/machinery/door/window/brigdoor{dir = 8; icon_state = "leftsecure"; req_access = list(63); req_one_access = list(1); tag = "icon-leftsecure (WEST)"},/obj/machinery/button/remote/blast_door{id = "residential"; name = "Security Doors"; req_access = list(63); req_one_access = list(1); pixel_x = 6; pixel_y = -5},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"xJ" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/floor_decal/borderfloorblack/corner{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"xK" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 6},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 6},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"xI" = (/turf/unsimulated/floor/steel,/area/centcom/security{name = "\improper CentCom Residential Security"}) +"xJ" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals10,/turf/unsimulated/floor/steel,/area/centcom/security{name = "\improper CentCom Residential Security"}) +"xK" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/security{name = "\improper CentCom Residential Security"}) "xL" = (/obj/machinery/computer/arcade/orion_trail,/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/orange/border{dir = 10},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 8},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "xM" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/orange/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "xN" = (/obj/machinery/camera/network/crescent{dir = 10},/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/orange/border,/obj/effect/floor_decal/borderfloorblack/corner2{dir = 9},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "xO" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/orange/border,/obj/effect/floor_decal/borderfloorblack/corner2,/obj/effect/floor_decal/corner/orange/bordercorner2,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "xP" = (/obj/machinery/computer/arcade/battle,/obj/effect/floor_decal/borderfloorblack{dir = 6},/obj/effect/floor_decal/corner/orange/border{dir = 6},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 6},/obj/effect/floor_decal/corner/orange/bordercorner2{dir = 6},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) "xQ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/table/marble,/obj/item/weapon/book/manual/chef_recipes,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/small/peppermill{pixel_x = 3},/obj/item/weapon/material/kitchen/rollingpin,/obj/item/weapon/material/knife/butch,/turf/simulated/floor/tiled/white,/area/centcom/bar) -"xR" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/skills,/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"xS" = (/obj/structure/bed/chair/office/dark,/obj/effect/floor_decal/borderfloorblack/corner{dir = 8},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"xT" = (/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 32},/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"xU" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"xV" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"xR" = (/obj/machinery/computer/secure_data,/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 1},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"xS" = (/obj/machinery/computer/card,/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"xT" = (/obj/machinery/door/airlock/security{name = "Security"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"xU" = (/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 27},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"xV" = (/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 26},/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 4},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) "xW" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor/steel,/area/centcom/living) "xX" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 6},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor/steel,/area/centcom/living) "xY" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 5},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 6},/turf/unsimulated/floor/steel,/area/centcom/living) @@ -1253,13 +1254,13 @@ "yf" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/oven,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bar) "yg" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/grill,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bar) "yh" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/fryer,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bar) -"yi" = (/obj/machinery/computer/security{dir = 1},/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"yj" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/obj/item/device/taperecorder,/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"yk" = (/obj/structure/table/reinforced,/obj/item/device/camera,/obj/item/weapon/storage/box/ids,/obj/effect/floor_decal/borderfloorblack{dir = 6},/obj/effect/floor_decal/corner/blue/border{dir = 6},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"yl" = (/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/obj/structure/closet/secure_closet/nanotrasen_security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"ym" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"yn" = (/obj/structure/table/reinforced,/obj/machinery/microwave,/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"yo" = (/obj/effect/floor_decal/borderfloorblack{dir = 6},/obj/effect/floor_decal/corner/blue/border{dir = 6},/obj/structure/closet/secure_closet/nanotrasen_security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"yi" = (/obj/machinery/turretid/stun{check_access = 0; check_anomalies = 0; check_records = 0; control_area = "\improper CentCom Residential Security"; pixel_y = 32; req_access = list(101); req_one_access = list(101)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"yj" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"yk" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 1},/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 27},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"yl" = (/obj/machinery/camera/network/crescent{dir = 4},/turf/unsimulated/floor/steel,/area/centcom/security{name = "\improper CentCom Residential Security"}) +"ym" = (/obj/effect/floor_decal/industrial/outline,/turf/unsimulated/floor/steel,/area/centcom/security{name = "\improper CentCom Residential Security"}) +"yn" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/machinery/door/window/brigdoor{dir = 8; icon_state = "leftsecure"; req_access = list(63); req_one_access = list(1); tag = "icon-leftsecure (WEST)"},/obj/machinery/button/remote/blast_door{id = "residential"; name = "Security Doors"; req_access = list(63); req_one_access = list(1); pixel_x = 6; pixel_y = -5},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"yo" = (/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/floor_decal/borderfloorblack/corner{dir = 1},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) "yp" = (/obj/effect/floor_decal/steeldecal/steel_decals9,/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals10,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 8},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 1},/turf/unsimulated/floor/steel,/area/centcom/living) "yq" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "TelelockdownC"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/living) "yr" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/living) @@ -1270,7 +1271,7 @@ "yw" = (/obj/structure/curtain/open/shower,/obj/machinery/shower{pixel_y = 13},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/centcom/security) "yx" = (/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "freezer"},/area/centcom/security) "yy" = (/obj/machinery/door/airlock/freezer{name = "Kitchen cold room"; req_access = list(28)},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/bar) -"yz" = (/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "residential"; name = "Security Door"; opacity = 0},/obj/machinery/door/firedoor,/turf/unsimulated/floor/steel,/area/centcom/main_hall) +"yz" = (/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 6},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 6},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) "yA" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "TelelockdownC"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor/steel,/area/centcom/living) "yB" = (/obj/effect/floor_decal/industrial/outline,/turf/unsimulated/floor/steel,/area/centcom/living) "yC" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "TelelockdownC"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/living) @@ -1293,16 +1294,16 @@ "yT" = (/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 4},/obj/effect/floor_decal/steeldecal/steel_decals9{dir = 1},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/turf/unsimulated/floor/steel,/area/centcom/living) "yU" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "TelelockdownC"; name = "Security Doors"; opacity = 0},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/living) "yV" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/window/reinforced,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/living) -"yW" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/button/remote/blast_door{id = "TelelockdownC"; name = "Teleporter Entrance Lockdown"; pixel_x = 6; pixel_y = -5; req_access = list(63); req_one_access = list(1)},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "TelelockdownC"; name = "Security Door"; opacity = 0},/obj/machinery/door/window/brigdoor/northleft{req_access = list(63); req_one_access = list(1)},/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"yW" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 8},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) "yX" = (/obj/effect/wingrille_spawn/reinforced/crescent,/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "TelelockdownC"; name = "Security Door"; opacity = 0},/turf/unsimulated/floor/steel,/area/centcom/command) "yY" = (/obj/machinery/telecomms/receiver/preset_cent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "yZ" = (/obj/machinery/telecomms/bus/preset_cent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "za" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "zb" = (/obj/machinery/telecomms/processor/preset_cent,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "zc" = (/obj/machinery/telecomms/server/presets/centcomm,/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) -"zd" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"ze" = (/obj/machinery/computer/secure_data{dir = 8},/obj/effect/floor_decal/borderfloorblack{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"zf" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/turf/unsimulated/floor/steel,/area/centcom/command) +"zd" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/machinery/computer/skills,/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"ze" = (/obj/structure/bed/chair/office/dark,/obj/effect/floor_decal/borderfloorblack/corner{dir = 8},/obj/effect/floor_decal/corner/blue/bordercorner{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"zf" = (/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 32},/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) "zg" = (/obj/effect/floor_decal/borderfloor{dir = 1; icon_state = "borderfloor"; pixel_y = 0; tag = "icon-borderfloor (NORTH)"},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/machinery/computer/card,/turf/unsimulated/floor/steel,/area/centcom/command) "zh" = (/obj/structure/table/reinforced,/obj/effect/floor_decal/borderfloor{dir = 1; icon_state = "borderfloor"; pixel_y = 0; tag = "icon-borderfloor (NORTH)"},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/machinery/button/remote/blast_door{id = "TelelockdownC"; name = "Teleporter Full Lockdown"; pixel_x = 6; pixel_y = -5; req_access = list(63); req_one_access = list(1)},/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor/steel,/area/centcom/command) "zi" = (/obj/machinery/computer/security,/obj/effect/floor_decal/borderfloor{dir = 1; icon_state = "borderfloor"; pixel_y = 0; tag = "icon-borderfloor (NORTH)"},/obj/effect/floor_decal/corner/blue/border{dir = 1},/turf/unsimulated/floor/steel,/area/centcom/command) @@ -1312,14 +1313,14 @@ "zm" = (/obj/effect/floor_decal/borderfloor{dir = 1; icon_state = "borderfloor"; pixel_y = 0; tag = "icon-borderfloor (NORTH)"},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor/steel,/area/centcom/command) "zn" = (/obj/effect/floor_decal/borderfloor{dir = 1; icon_state = "borderfloor"; pixel_y = 0; tag = "icon-borderfloor (NORTH)"},/obj/effect/floor_decal/corner/blue/border{dir = 1},/obj/structure/closet/crate/bin,/turf/unsimulated/floor/steel,/area/centcom/command) "zo" = (/obj/structure/filingcabinet/filingcabinet,/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/obj/effect/floor_decal/borderfloor/corner2{dir = 5},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 5},/turf/unsimulated/floor/steel,/area/centcom/command) -"zp" = (/obj/structure/table/reinforced,/obj/item/device/camera,/obj/item/weapon/storage/box/ids,/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 10},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) -"zq" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 5},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 5},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"zp" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"zq" = (/obj/structure/reagent_dispensers/peppertank{pixel_x = 30},/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) "zr" = (/obj/effect/floor_decal/borderfloor{dir = 8; icon_state = "borderfloor"; pixel_x = 0; tag = "icon-borderfloor (WEST)"},/obj/effect/floor_decal/corner/blue/border{dir = 8},/obj/effect/floor_decal/borderfloor/corner2{dir = 10; icon_state = "borderfloorcorner2"; pixel_x = 0; tag = "icon-borderfloorcorner2 (SOUTHWEST)"},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 10},/turf/unsimulated/floor/steel,/area/centcom/command) "zs" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/unsimulated/floor/steel,/area/centcom/command) "zt" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/turf/unsimulated/floor/steel,/area/centcom/command) "zu" = (/obj/machinery/door/airlock/security{name = "Security"},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/command) "zv" = (/obj/structure/toilet,/turf/unsimulated/floor{icon_state = "freezer"},/area/centcom/bathroom) -"zw" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/borderfloorblack/corner2{dir = 9},/obj/effect/floor_decal/borderfloorblack/corner2,/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 9},/obj/effect/floor_decal/corner/blue/bordercorner2,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"zw" = (/obj/structure/table/reinforced,/obj/item/weapon/book/manual/security_space_law,/obj/item/device/taperecorder,/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) "zx" = (/obj/machinery/door/airlock/security{name = "Security"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/command) "zy" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/borderfloor/corner2,/obj/effect/floor_decal/corner/blue/bordercorner2,/turf/unsimulated/floor/steel,/area/centcom/command) "zz" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor/steel,/area/centcom/command) @@ -1345,6 +1346,192 @@ "zT" = (/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "freezer"},/area/centcom/bathroom) "zU" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/mirror{pixel_x = 29},/turf/unsimulated/floor{icon_state = "freezer"},/area/centcom/bathroom) "zV" = (/turf/unsimulated/wall/planetary/virgo3b,/area/centcom/bathroom) +"zW" = (/obj/machinery/computer/security{dir = 1},/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"zX" = (/obj/structure/table/reinforced,/obj/item/device/camera,/obj/item/weapon/storage/box/ids,/obj/effect/floor_decal/borderfloorblack{dir = 6},/obj/effect/floor_decal/corner/blue/border{dir = 6},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"zY" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/item/weapon/storage/box/donkpockets,/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"zZ" = (/obj/effect/floor_decal/borderfloorblack{dir = 10},/obj/effect/floor_decal/corner/blue/border{dir = 10},/obj/structure/closet/secure_closet/nanotrasen_security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Aa" = (/obj/effect/floor_decal/borderfloorblack{dir = 6},/obj/effect/floor_decal/corner/blue/border{dir = 6},/obj/structure/closet/secure_closet/nanotrasen_security,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Ab" = (/obj/structure/table/reinforced,/obj/machinery/microwave,/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Ac" = (/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "residential"; name = "Security Door"; opacity = 0},/obj/machinery/door/firedoor,/turf/unsimulated/floor/steel,/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Ad" = (/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Ae" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Af" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/machinery/button/remote/blast_door{id = "TelelockdownC"; name = "Teleporter Entrance Lockdown"; pixel_x = 6; pixel_y = -5; req_access = list(63); req_one_access = list(1)},/obj/machinery/door/blast/regular{density = 0; dir = 4; icon_state = "pdoor0"; id = "TelelockdownC"; name = "Security Door"; opacity = 0},/obj/machinery/door/window/brigdoor/northleft{req_access = list(63); req_one_access = list(1)},/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Ag" = (/obj/machinery/computer/card{dir = 4},/obj/effect/floor_decal/borderfloorblack{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1475; icon_state = "intercom"; listening = 1; name = "Station Intercom (Security)"; pixel_x = 0; pixel_y = 27},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Ah" = (/obj/machinery/computer/secure_data{dir = 8},/obj/effect/floor_decal/borderfloorblack{dir = 5},/obj/effect/floor_decal/corner/blue/border{dir = 5},/obj/machinery/camera/network/crescent,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Ai" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/corner/blue/border{dir = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Aj" = (/obj/effect/floor_decal/borderfloor{dir = 9},/obj/effect/floor_decal/corner/blue/border{dir = 9},/obj/machinery/turretid/stun{check_access = 0; check_anomalies = 0; check_records = 0; control_area = "\improper CentCom Living Quarters"; pixel_y = 32; req_access = list(101); req_one_access = list(101)},/turf/unsimulated/floor/steel,/area/centcom/living) +"Ak" = (/obj/structure/table/reinforced,/obj/item/device/camera,/obj/item/weapon/storage/box/ids,/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/effect/floor_decal/corner/blue/border{dir = 8},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 10},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Al" = (/obj/structure/table/reinforced,/obj/machinery/computer/skills,/obj/effect/floor_decal/borderfloorblack{dir = 4},/obj/effect/floor_decal/corner/blue/border{dir = 4},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 5},/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 5},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"Am" = (/obj/effect/floor_decal/borderfloorblack,/obj/effect/floor_decal/corner/blue/border,/obj/effect/floor_decal/borderfloorblack/corner2{dir = 9},/obj/effect/floor_decal/borderfloorblack/corner2,/obj/effect/floor_decal/corner/blue/bordercorner2{dir = 9},/obj/effect/floor_decal/corner/blue/bordercorner2,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security{name = "\improper CentCom Residential Security"}) +"An" = (/obj/effect/floor_decal/borderfloor,/obj/effect/floor_decal/corner/blue/border,/obj/machinery/vending/nifsoft_shop,/turf/unsimulated/floor/steel,/area/centcom/security) +"Ao" = (/obj/machinery/vending/nifsoft_shop,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/restaurant) +"Ap" = (/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{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"Aq" = (/turf/unsimulated/wall,/area/centcom/specops) +"Ar" = (/obj/structure/window/reinforced{dir = 1},/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/gun/energy/gun,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"As" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/table/rack,/obj/item/weapon/gun/energy/ionrifle,/obj/item/weapon/gun/energy/ionrifle,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"At" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/rack,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Au" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/rack,/obj/item/weapon/gun/energy/netgun,/obj/item/weapon/gun/energy/netgun,/obj/item/weapon/gun/energy/netgun,/obj/item/weapon/gun/energy/netgun,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Av" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/rack,/obj/item/ammo_magazine/m762/ap,/obj/item/ammo_magazine/m762/ap,/obj/item/ammo_magazine/m762/ap,/obj/item/ammo_magazine/m762/ap,/obj/item/ammo_magazine/m762/ap,/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,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Aw" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/rack,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw/ap,/obj/item/ammo_magazine/m556saw/ap,/obj/item/ammo_magazine/m556saw/ap,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Ax" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/carbine,/obj/item/ammo_magazine/m762m,/obj/item/ammo_magazine/m762m,/obj/item/ammo_magazine/m762m,/obj/item/ammo_magazine/m762m,/obj/item/ammo_magazine/m762m,/obj/item/ammo_magazine/m762m,/obj/item/ammo_magazine/m762m,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Ay" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/rack,/obj/item/weapon/storage/box/sniperammo,/obj/item/weapon/storage/box/sniperammo,/obj/item/weapon/gun/projectile/heavysniper,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Az" = (/obj/structure/table/rack,/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/effect/floor_decal/industrial/outline/yellow,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"AA" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/table/rack,/obj/item/weapon/gun/energy/xray,/obj/item/weapon/gun/energy/xray,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"AB" = (/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,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"AC" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/grenade,/obj/item/weapon/gun/launcher/grenade,/obj/structure/window/reinforced{dir = 1},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/window/reinforced{dir = 8},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"AD" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"AE" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/shuttle/plating/airless,/area/shuttle/specops/centcom) +"AF" = (/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"AG" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_fore"; name = "forward docking hatch controller"; pixel_x = 0; pixel_y = -25; tag_door = "specops_shuttle_fore_hatch"},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"AH" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_fore_hatch"; locked = 1; name = "Forward Docking Hatch"; req_access = list(13)},/turf/simulated/shuttle/plating,/area/shuttle/specops/centcom) +"AI" = (/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,/obj/item/weapon/gun/launcher/rocket,/obj/item/weapon/gun/launcher/rocket,/obj/item/weapon/gun/launcher/rocket,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"AJ" = (/obj/structure/closet/crate/medical,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"AK" = (/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/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"AL" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"AM" = (/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,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"AN" = (/obj/machinery/chemical_dispenser/ert,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"AO" = (/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/pillbottles,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/bodybag/cryobag,/obj/item/weapon/reagent_containers/glass/beaker/large,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"AP" = (/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) +"AQ" = (/obj/machinery/chem_master,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"AR" = (/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) +"AS" = (/obj/item/device/radio/intercom{broadcasting = 0; dir = 1; frequency = 1443; listening = 1; name = "Spec Ops Intercom"; pixel_y = -28},/obj/machinery/computer/communications{tag = "icon-computer (NORTH)"; icon_state = "computer"; dir = 1},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"AT" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"AU" = (/obj/machinery/computer/prisoner{tag = "icon-computer (NORTH)"; name = "Implant Management"; icon_state = "computer"; dir = 1},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"AV" = (/obj/structure/bed/chair{dir = 1},/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_port"; name = "port docking hatch controller"; pixel_x = 0; pixel_y = -25; tag_door = "specops_shuttle_port_hatch"},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"AW" = (/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) +"AX" = (/obj/structure/sign/nanotrasen,/turf/unsimulated/wall,/area/centcom/specops) +"AY" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"AZ" = (/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/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 = "vault"; dir = 5},/area/centcom/specops) +"Ba" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/medical,/obj/item/weapon/rig/ert/medical,/obj/item/weapon/rig/ert/medical,/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 = "vault"; dir = 5},/area/centcom/specops) +"Bb" = (/obj/machinery/vending/security,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Bc" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Bd" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/obj/item/weapon/storage/backpack/dufflebag/syndie/ammo,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Be" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunammo,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Bf" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/SVD,/obj/item/weapon/gun/projectile/SVD,/obj/item/weapon/gun/projectile/SVD,/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) +"Bg" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/shotgun/pump/unsc,/obj/item/weapon/gun/projectile/shotgun/pump/unsc,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Bh" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/m357,/obj/item/ammo_magazine/m357,/obj/item/ammo_magazine/m357,/obj/item/ammo_magazine/m357,/obj/item/ammo_magazine/s357,/obj/item/weapon/gun/projectile/revolver/mateba,/obj/item/weapon/gun/projectile/revolver/mateba,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Bi" = (/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,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Bj" = (/turf/space,/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/simulated/shuttle/plating/airless/carry,/area/shuttle/specops/centcom) +"Bk" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_shuttle_port_hatch"; locked = 1; name = "Port Docking Hatch"; req_access = list(13)},/turf/unsimulated/floor{icon_state = "dark"},/area/shuttle/specops/centcom) +"Bl" = (/obj/structure/table/rack,/obj/item/clothing/gloves/swat{armor = list("melee" = 80, "bullet" = 80, "laser" = 80, "energy" = 80, "bomb" = 80, "bio" = 80, "rad" = 80)},/obj/item/clothing/gloves/swat{armor = list("melee" = 80, "bullet" = 80, "laser" = 80, "energy" = 80, "bomb" = 80, "bio" = 80, "rad" = 80)},/obj/item/clothing/gloves/swat{armor = list("melee" = 80, "bullet" = 80, "laser" = 80, "energy" = 80, "bomb" = 80, "bio" = 80, "rad" = 80)},/obj/item/clothing/gloves/swat{armor = list("melee" = 80, "bullet" = 80, "laser" = 80, "energy" = 80, "bomb" = 80, "bio" = 80, "rad" = 80)},/obj/item/clothing/gloves/swat{armor = list("melee" = 80, "bullet" = 80, "laser" = 80, "energy" = 80, "bomb" = 80, "bio" = 80, "rad" = 80)},/obj/item/clothing/shoes/boots/swat,/obj/item/clothing/shoes/boots/swat,/obj/item/clothing/shoes/boots/swat,/obj/item/clothing/shoes/boots/swat,/obj/item/clothing/shoes/boots/swat,/obj/item/clothing/shoes/boots/swat,/obj/item/clothing/suit/armor/swat,/obj/item/clothing/suit/armor/swat,/obj/item/clothing/suit/armor/swat,/obj/item/clothing/suit/armor/swat,/obj/item/clothing/suit/armor/swat,/obj/item/clothing/suit/armor/swat,/obj/item/clothing/mask/gas/death_commando{armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 75, "rad" = 0); name = "Commando Mask"},/obj/item/clothing/mask/gas/death_commando{armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 75, "rad" = 0); name = "Commando Mask"},/obj/item/clothing/mask/gas/death_commando{armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 75, "rad" = 0); name = "Commando Mask"},/obj/item/clothing/mask/gas/death_commando{armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 75, "rad" = 0); name = "Commando Mask"},/obj/item/clothing/mask/gas/death_commando{armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 75, "rad" = 0); name = "Commando Mask"},/obj/item/clothing/mask/gas/death_commando{armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 50, "bio" = 75, "rad" = 0); name = "Commando Mask"},/obj/item/clothing/head/helmet/space/deathsquad{armor = list("melee" = 80, "bullet" = 80, "laser" = 60, "energy" = 70, "bomb" = 50, "bio" = 100, "rad" = 60); name = "swat helmet"},/obj/item/clothing/head/helmet/space/deathsquad{armor = list("melee" = 80, "bullet" = 80, "laser" = 60, "energy" = 70, "bomb" = 50, "bio" = 100, "rad" = 60); name = "swat helmet"},/obj/item/clothing/head/helmet/space/deathsquad{armor = list("melee" = 80, "bullet" = 80, "laser" = 60, "energy" = 70, "bomb" = 50, "bio" = 100, "rad" = 60); name = "swat helmet"},/obj/item/clothing/head/helmet/space/deathsquad{armor = list("melee" = 80, "bullet" = 80, "laser" = 60, "energy" = 70, "bomb" = 50, "bio" = 100, "rad" = 60); name = "swat helmet"},/obj/item/clothing/head/helmet/space/deathsquad{armor = list("melee" = 80, "bullet" = 80, "laser" = 60, "energy" = 70, "bomb" = 50, "bio" = 100, "rad" = 60); name = "swat helmet"},/obj/item/clothing/head/helmet/space/deathsquad{armor = list("melee" = 80, "bullet" = 80, "laser" = 60, "energy" = 70, "bomb" = 50, "bio" = 100, "rad" = 60); name = "swat helmet"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Bm" = (/obj/machinery/iv_drip,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"Bn" = (/obj/structure/table/reinforced,/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,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"Bo" = (/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) +"Bp" = (/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) +"Bq" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"Br" = (/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) +"Bs" = (/obj/structure/table/rack,/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,/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/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) +"Bt" = (/obj/structure/table/reinforced,/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,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Bu" = (/obj/structure/table/reinforced,/obj/item/weapon/material/hatchet/tacknife/combatknife,/obj/item/weapon/material/hatchet/tacknife/combatknife,/obj/item/weapon/material/hatchet/tacknife/combatknife,/obj/item/weapon/material/hatchet/tacknife/combatknife,/obj/item/weapon/material/hatchet/tacknife/combatknife,/obj/item/weapon/material/hatchet/tacknife/combatknife,/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 = "dark"},/area/centcom/specops) +"Bv" = (/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 = "dark"},/area/centcom/specops) +"Bw" = (/obj/structure/table/reinforced,/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 = "dark"},/area/centcom/specops) +"Bx" = (/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 = "dark"},/area/centcom/specops) +"By" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Bz" = (/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,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"BA" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "specops_centcom_dock_door"; locked = 1},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"BB" = (/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,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"BC" = (/obj/structure/table/reinforced,/obj/item/roller,/obj/item/roller,/obj/item/roller,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"BD" = (/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) +"BE" = (/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) +"BF" = (/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) +"BG" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/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) +"BH" = (/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) +"BI" = (/obj/structure/table/rack,/obj/item/weapon/storage/backpack/dufflebag/syndie/med,/obj/item/weapon/storage/backpack/dufflebag/syndie/med,/obj/item/weapon/storage/backpack/dufflebag/syndie/med,/obj/item/weapon/storage/backpack/dufflebag/syndie/med,/obj/item/weapon/storage/backpack/dufflebag/syndie/med,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"BJ" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/security,/obj/item/weapon/rig/ert/security,/obj/item/weapon/rig/ert/security,/obj/item/weapon/rig/ert/security,/obj/item/weapon/rig/ert/security,/obj/item/weapon/rig/ert/security,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"BK" = (/obj/structure/table/rack,/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,/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/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 = "dark"},/area/centcom/specops) +"BL" = (/obj/structure/table/rack,/obj/item/rig_module/mounted,/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) +"BM" = (/obj/machinery/vending/snack{name = "hacked Getmore Chocolate Corp"; prices = list()},/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"BN" = (/obj/structure/closet/wardrobe/ert,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"BO" = (/obj/structure/undies_wardrobe,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"BP" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_centcom_dock"; name = "docking port controller"; pixel_x = 0; pixel_y = 25; req_one_access = list(103); tag_door = "specops_centcom_dock_door"},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"BQ" = (/obj/structure/table/reinforced,/obj/item/ammo_casing/nsfw_batt/stun,/obj/item/ammo_casing/nsfw_batt/stun,/obj/item/ammo_casing/nsfw_batt/stun,/obj/item/ammo_casing/nsfw_batt,/obj/item/ammo_casing/nsfw_batt,/obj/item/ammo_casing/nsfw_batt,/obj/item/ammo_casing/nsfw_batt/net,/obj/item/ammo_casing/nsfw_batt/net,/obj/item/ammo_magazine/nsfw_mag,/obj/item/weapon/gun/projectile/nsfw,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"BR" = (/obj/machinery/door/blast/regular{name = "When Everything else fails."},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"BS" = (/obj/effect/floor_decal/corner/white{tag = "icon-corner_white (SOUTHWEST)"; icon_state = "corner_white"; dir = 10},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"BT" = (/obj/effect/floor_decal/corner/red{dir = 10},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"BU" = (/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"BV" = (/obj/effect/landmark{name = "Response Team"},/obj/effect/landmark{name = "Commando"},/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"BW" = (/obj/structure/table/reinforced,/obj/item/device/megaphone,/obj/item/weapon/storage/box/trackimp,/obj/item/weapon/storage/box/cdeathalarm_kit,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"BX" = (/obj/structure/table/reinforced,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"BY" = (/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/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"BZ" = (/obj/structure/sign/redcross{pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"Ca" = (/obj/structure/sign/securearea{name = "\improper ARMORY"; pixel_y = 32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"Cb" = (/obj/item/weapon/stool/padded,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"Cc" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor/steel,/area/centcom/specops) +"Cd" = (/obj/structure/table/reinforced,/obj/item/device/aicard,/obj/item/weapon/pinpointer/advpinpointer,/obj/item/weapon/stamp/centcomm,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"Ce" = (/obj/machinery/door/airlock/centcom{name = "Commander"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"Cg" = (/obj/structure/sign/securearea{name = "ENGINEERING ACCESS"; pixel_y = -32},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"Ch" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"Ci" = (/obj/effect/floor_decal/corner/yellow{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Cj" = (/obj/effect/floor_decal/corner/blue{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Ck" = (/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/corner/blue{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Cl" = (/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/corner/blue{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Cm" = (/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/structure/table/reinforced,/obj/effect/floor_decal/corner/blue{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Cn" = (/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/structure/table/reinforced,/obj/effect/floor_decal/corner/blue{dir = 5},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Co" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/box/flashbangs,/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/hatchet/tacknife/combatknife,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"Cp" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/energy/gun/nuclear,/obj/item/weapon/hand_tele,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"Cq" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"Cr" = (/obj/machinery/vending/engivend,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Cs" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/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) +"Ct" = (/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) +"Cu" = (/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/structure/table/reinforced,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Cv" = (/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) +"Cw" = (/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/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"Cx" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor/steel{icon = 'icons/turf/floors_vr.dmi'; icon_state = "wood"},/area/centcom/specops) +"Cy" = (/obj/machinery/pipedispenser/orderable,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Cz" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CA" = (/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 = "dark"},/area/centcom/specops) +"CB" = (/obj/machinery/portable_atmospherics/canister/air,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CC" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CD" = (/obj/machinery/cell_charger,/obj/structure/table/reinforced,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CE" = (/obj/structure/table/reinforced,/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/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CF" = (/obj/machinery/computer/teleporter,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CG" = (/obj/machinery/teleport/hub,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CH" = (/obj/machinery/teleport/station,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CI" = (/obj/machinery/pipedispenser/disposal/orderable,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CJ" = (/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/structure/table/steel_reinforced,/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 = "dark"},/area/centcom/specops) +"CK" = (/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 = "dark"},/area/centcom/specops) +"CL" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CM" = (/obj/machinery/shieldgen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CN" = (/obj/machinery/shieldwallgen,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CO" = (/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 = "dark"},/area/centcom/specops) +"CP" = (/obj/structure/table/rack,/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 = "dark"},/area/centcom/specops) +"CQ" = (/obj/machinery/door/airlock/centcom{name = "Teleporter"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"CR" = (/obj/structure/table/rack,/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,/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/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 = "dark"},/area/centcom/specops) +"CS" = (/obj/machinery/vending/tool,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CT" = (/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 = "dark"},/area/centcom/specops) +"CU" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/engineer,/obj/item/weapon/rig/ert/engineer,/obj/item/weapon/rig/ert/engineer,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CV" = (/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/clothing/glasses/meson,/obj/item/clothing/glasses/meson,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/obj/item/taperoll/engineering,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CW" = (/obj/structure/table/steel_reinforced,/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 = "dark"},/area/centcom/specops) +"CX" = (/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,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CY" = (/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,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"CZ" = (/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/obj/item/weapon/crowbar,/obj/item/weapon/screwdriver,/obj/item/weapon/wrench,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Da" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/egun,/obj/item/rig_module/mounted/egun,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Db" = (/obj/structure/table/rack,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/item/rig_module/mounted/taser,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Dc" = (/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,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Dd" = (/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,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"De" = (/obj/structure/table/rack,/obj/item/rig_module/grenade_launcher,/obj/item/rig_module/grenade_launcher,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Df" = (/obj/structure/dispenser/oxygen,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Dg" = (/obj/machinery/autolathe{desc = "Your typical Autolathe. It appears to have much more options than your regular one, however..."; hacked = 1; name = "Unlocked Autolathe"},/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Dh" = (/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 = "dark"},/area/centcom/specops) +"Di" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/outline/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"Dj" = (/obj/machinery/door/airlock/centcom{name = "Commander"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"Dk" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) +"Dl" = (/turf/unsimulated/floor/steel,/area/centcom/specops) +"Dm" = (/obj/machinery/door/airlock/centcom{name = "Special Operations"; opacity = 1; req_access = list(103)},/turf/unsimulated/floor/steel,/area/centcom/specops) +"Dn" = (/obj/machinery/porta_turret/crescent,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor/steel,/area/centcom/specops) +"Do" = (/obj/structure/table/rack,/obj/effect/floor_decal/industrial/outline/yellow,/obj/item/ammo_magazine/m556saw/ap,/obj/item/ammo_magazine/m556saw/ap,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/obj/item/ammo_magazine/m556saw,/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/security) +"Dp" = (/obj/structure/sign/nanotrasen,/turf/unsimulated/wall,/area/centcom/main_hall) +"Dq" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/borderfloorwhite{dir = 5},/obj/effect/floor_decal/corner/paleblue/border{dir = 5},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 5; icon_state = "borderfloorcorner2_white"; pixel_x = 0; pixel_y = 0; tag = "icon-borderfloorcorner2_white (NORTHEAST)"},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 5},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"Dr" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"Ds" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/oxygen/prechilled,/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"Dt" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/obj/machinery/transhuman/resleever,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"Du" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/obj/machinery/computer/transhuman/resleeving,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"Dv" = (/obj/effect/floor_decal/borderfloorwhite{dir = 1},/obj/effect/floor_decal/corner/paleblue/border{dir = 1},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 1},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 1},/obj/machinery/camera/network/crescent,/obj/effect/floor_decal/corner_steel_grid{dir = 10},/obj/machinery/clonepod/transhuman,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"Dw" = (/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/effect/floor_decal/borderfloorwhite/corner2{dir = 6},/obj/effect/floor_decal/corner/paleblue/bordercorner2{dir = 6},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"Dx" = (/obj/effect/floor_decal/borderfloorwhite{dir = 4},/obj/effect/floor_decal/corner/paleblue/border{dir = 4},/obj/structure/filingcabinet/chestdrawer{name = "Medical Forms"},/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"Dy" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/effect/floor_decal/borderfloorwhite/corner2,/obj/effect/floor_decal/corner/paleblue/bordercorner2,/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/o2,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"Dz" = (/obj/effect/floor_decal/borderfloorwhite{dir = 6},/obj/effect/floor_decal/corner/paleblue/border{dir = 6},/obj/structure/table/glass,/obj/item/weapon/storage/box/syringes,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) +"DA" = (/obj/effect/floor_decal/borderfloorwhite,/obj/effect/floor_decal/corner/paleblue/border,/obj/structure/table/glass,/obj/item/weapon/storage/firstaid/fire,/turf/unsimulated/floor/steel{icon_state = "white"},/area/centcom/medical) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1366,104 +1553,104 @@ aaababababababababababababababababababababababababababababababababababababababab aaababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa aaababababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa aaabababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaabababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaabababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaabababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaabababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaabababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaabababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaabababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaabababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacadadadadadadadadadadadadadadadadadadadadadadadacacacacacacacacacaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaf -aaababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacadagahahahaiahahahahahahahahahahaiahahahahagadacacacacacacacacacaeajakakakalamanaoapapaeaqarasatauavawaxayaeazaAaBaCaDaEaFaeaGaHaIaJaKaLaf -aaababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacadahahahahahahahahahahahahahahahahahahahahahadacacacacacacacacacaeajakakakakakakakakakaeaMaraNaNaraMaMaMaMaeaOaPaQaQaQaRaSaTaUaVaWaXaYaYaf -aaabababababababababababababababababababababababababababababababababababacacaZaZaZaZaZaZaZaZacacacacacadahahahahahahahahahahahahahahahahahahahahahadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaebaaeaeakakaeaMaMaMaMaMaMaMaMaMaeaObbbcbdbebfbgaTbdbdbdbdbdbdaf +aaabababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaceZeZeZeZeZeZeZeZeZeZeZeZeZeZeZ +aaabababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaceZjyjTjTjTjTjTjTjTjTjTjTkokoeZ +aaabababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAqAqAqAqAqAqAqAqAqAqAqAqAqkXkZkYnunununununNApnOjTkoeZ +aaabababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAqAqAqAqAqAqAqAqAqAqAqAqAqAsArAuAtAwAvAyAxAAAzACABAqkXAEADAFAFAFAFAFAFAFAGAHkoeZ +aaababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAIkoAqAKAJAMALAOANAQAPARAqkokokokokokokokokokokokoAqkXAEASAUATATAVAFAFAWnOjTkoeZ +aaababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqkpkoAqAZAYAYAYAYAYAYAYBaAqBbkokoBcBeBdBgBfBhkokoBiAqBjjTjTjTjTjTjTBkBkjTjTkokoeZ +aaababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqBlkoAqBmAYBoBnBqBpBrAYBsAqkokokoBtBvBuBxBwBykokoBzAqAqAqAqAqAqAqAqBABAAqkokokoeZ +aaababababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqBBkoAqBCAYBEBDBGBFBHAYBIAqBKBJkokokokokokokokokoBLAqBMBNBNBNBOAqBPAYAYAqAqAqAqeZ +aaababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAXBRAqAqBSBSBSBSBSBSBSAqAqAqAqBTBTBTBTBTBTBTBTAqAqAqBUBVBVBVBUAqAYAYAYAqBWBYBQeZ +aaababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAYAYAYBZAYAYAYAYAYAYAYBZAYAYCaAYAYAYAYAYAYAYAYCaAYBUBUCbCbCbBUBUAYAYAYCcBUBUCdeZ +aaababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYAYBUBUBUBUBUBUBUAYAYAYCeBUBUBXeZ +aaababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAYAYAYCgAYAYAYAYAYAYAYCgAYAYAYAYAYAYAYAYAYAYAYAYAYBUBUCbCbCbBUBUAYAYAYCcBUBUCheZ +aaabababababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAYAYAqAqCiCiCiCiCiCiCiAqAqAqAqCjCjClCkCnCmCjCjAqAqAqBUBVBVBVBUAqAYAYAYAqCoCqCpeZ +aaabababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAYAYAqCrkokokokokokokokoAqkokokokoCtCsCvCukokokokoAqCwBNBNBNCxAqAYAYAYAqAqAqAqeZ +aaabababababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAYAYAqCykokokoCACzCCCBCBAqCDkokokokokokokokokokoCEAqAqAqAqAqAqAqAYAYAYAqCFCHCGeZ +aaabababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacAqAYAYAqCIkokokoCKCJCMCLCNAqCOkokokokokokokokokokoCPAqacacacacacAqAYAYAYCQkokokoeZ +aaababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadadadadAqacacacacacAqAYAYAqCSCRCUCTCWCVCMCLCNAqCYCXDaCZDcDbDeDdDgDfDiDhAqacacacacacAqAYAYAYDjkokokoeZ +aaababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacadadadadadadadadadadadadadadadadadadadagahagAqAqAqAqAqAqAXDkDkAqaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaf +aaababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacadagahahahaiahahahahahahahahahahaiahahahahahDmDlDlDlDlDlDlDlDlDnaeajakakakalamanaoapapaeaqarasatauavawaxayaeazaAaBaCaDaEaFaeaGaHaIaJaKaLaf +aaababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacadahahahahahahahahahahahahahahahahahahahahahDmDlDlDlDlDlDlDlDlDnaeajakakakakakakakakakaeaMaraNaNaraMaMaMaMaeaOaPaQaQaQaRaSaTaUaVaWaXaYaYaf +aaabababababababababababababababababababababababababababababababababababacacaZaZaZaZaZaZaZaZacacacacacadahahahahahahahahahahahahahahahahahahahahahAqaeaeaeaeaeaeaeaeaeaeaeaeaeaeaebaaeaeakakaeaMaMaMaMaMaMaMaMaMaeaObbbcbdbebfbgaTbdbdbdbdbdbdaf aaabababababababababababababababababababababababababababababababababababacacaZbhbibibibibjaZaZaZaZaZaZaZaZbkblblblaZaZaZaZaZaZaZaZaZaZaZaZadahahahaebmbnaebmbnaebmbnaebmbnaebmbnaebmboaeakakaeaMaraNataraMaMbparaeaObbbqbrbsbfbtaTbubdbdbdbdbvaf aaabababababababababababababababababababababababababababababababababababacacaZbhbibibibibjaZbwbxbybxbzbAbAbAbAbAbzbAbzbAbBaZbCbDbEbFbGbFbFadbHahahaebIbJaebIbJaebIbJaebIbJaebIbJaebIbJaeakbKaeaMaraNbLaraMaMaMaMaeaObMbNbNbNbObtaTbPbdbdbdbdbQaf aaabababababababababababababababababababababababababababababababababacacacacaZbRbibibibibSaZbAbTbTbTbTbTbAbAbAbTbTbTbTbAbUaZbFbFbFbFbFbFbFadahahahaebVbWaebXbYaebXbYaebXbYaebXbYaebXbYaebZbZaeaMaMaMaMaMaMaMaMcaaecbcccdcecfcgchaecibdbdbdbdcjaf aaabababababababababababababababababababababababababababababababababacacacacaZbRckclclbibicmbAbAcncocnbAbAbAbAbAcncocnbAbAcpbFbFbFbFbFbFbFadahahahaeaecqaecqaeaecqaeaecqaeaecqaeaecqaeaeaeaeaecrcrcrbdbdbdcrcrcraeaeaeaeaeaTcsaTaectbdbdbdbdcuaf aaabababababababababababababababababababababababababababababababababacacacacaZaZaZaZaZaZaZaZbAbTbTbTbTbTbAbAbAbTbTbTbTbTbAaZaZaZaZaZaZaZbFadahahahaecvbdbdbdbdbdbdbdcwbdbdbdbdbdbdbdbdbdbdcwbdbdbdbdbdbdbdbdbdcxaecyczcAaecBcgcCaTcDbdbdbdbdbdaf -aaabababababababababababababababababababababababababababababababababacacacacaZaZcEcEcEcEcEaZcFcFcFcFcFcFcFcFcFcFcFcFcFcGcFcHcIcIcIcIcIaZbFadahahahaebdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdcJcgcgcgcJcgcgcgcKbdbdbdcLcLcLaf -aaababababababababababababababababababababababababababababababababacacacacaZaZaZcMcMcMcMcMaZcNcOcOcOcOcOcOcOcOcOcOcOcOcOcNcHcPcPcPcPcPaZaZadahahahcrbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdcQcRcScTaecUcVcWaTcXbdbdcYcZcYaf -aaababababababababababdadbdbdbdbdbdbdbdbdbdbdbdbdbdbdcababababababacacacacaZdddedfdfdfdfdfdgcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOdhdidididididjdkadahahahcrdlbdbdaecrcrcrcrcrcrcrdmcraebdbdbddnaeaeaeaeaeaeaeaedodododpaeaeaeaeaeaeaeaeaedqbdbdcLcLcLaf -aaababababababababababdrdsdtdtdtdtdudtdtdtdtdtdtdvdwdxababababababacacacacaZdddedfdydfdydfdgcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOdhdidzdidzdidjdkadahahahaebdbdbdaedAdBdCdDdEdFdGdHdIcrbdbdbddJdKdKdLdKcvaedMdNdOdOdOdOaedPcgdQaeacacacaedRbdbdbdbdbdaf -aaababababababababababdrdSdTdTdTdTdUdTdTdTdTdTdTdVdWdxababababababacacacacaZdddedfdfdXdfdfdgcOcOcOcOcOcOcOdYcOcOcOcOcOcOcOdhdididZdididjdkadahahahcrbdbdbdcrbddBeaebdEbdecedeecrbdbdbddJdKdKdKdKdKefegdOdOdOdOdOehcgcgeiaeacejejejekbNelemeneoaf -aaababababababababababdrdSdTdTdTdTdTdTdTdTdUdTdTdTepdxababababababacacacacaZdddedfdfdfdfdfdgcOcOcOcOcOcOcOeqcOcOcOcOcOcOcOdhdidididididjdkadahahahcrbdbdbdcrbdbdbdbdbdbdbdbdercrbdbdbddJesdKetdKdKaeeuevewexeyezaeeAcVeBaeacejeCejeDeEeFeGeHeIaf -aaababababababababababdrdSdTdTdUdUdTdTdTdTdTdTdTdTeJdxabababababeKacacacacaZdddedfdydfdydfdgcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOdhdidzdidzdidjdkadahahahaebdbdbdeLbdbdbdbdeMeNeObdbdcrbdbdbdePejejejeQeQejejejejejejejejejejejejejejeRejejejejejejejeS -aaababababababababababdreTdTdTdTdTdTdTdTdTeUdTdUdUepdxababababababacacacacaZeVdedfdfdfdfdfdgcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOdhdidididididjeWadahahahcrbdbdbdcrcxbdbdbdeXeXeYbdbdcrbdbdbdejeZfafbfcfcfdfefffgfcfhfifjfkfcflfmfnfofcfpfqfrfsftfufueS -aaababababababababababdrdSdTdTdTdTdTdTdTdTdTdTdTfvfwdxababababababacacacacaZaZaZfxfxfxfxfxaZcNcOcOcOcOcOcOcOcOcOcOcOcOcOcNaZfyfyfyfyfyaZaZadahahahcrdlbdbdcrfzdEbdbdbdbdbdbdbdcrbdbdbdejfAfcfbfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfceS -aaababababababababababdrfBfCfDfEfFfGfHfIfJfKfLfCfMfNfNfNfNfOfPababacacacacacacaZfQfQfQfQfQaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZfRfRfRfRfRaZacadahahahaebdbdbdaefSdEbdfTbdbdbdbdcvcrbdbdbdejfUfVfbfcfWfXfcfcfYfZgafcfcgbgcgdfcfcgegegefcfcgfgfgfgfeS +aaabababababababababababababababababababababababababababababababababacacacacaZaZcEcEcEcEcEaZcFcFcFcFcFcFcFcFcFcFcFcFcFcGcFaZcHcHcHcHcHaZbFadahahahaebdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdcJcgcgcgcJcgcgcgcKbdbdbdcLcLcLaf +aaababababababababababababababababababababababababababababababababacacacacaZaZaZcMcMcMcMcMaZcNcOcOcOcOcOcOcOcOcOcOcOcOcOcNaZcMcMcMcMcMaZaZadahahahcrbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdcQcRcScTaecUcVcWaTcXbdbdcYcZcYaf +aaababababababababababdadbdbdbdbdbdbdbdbdbdbdbdbdbdbdcababababababacacacacaZdddedfdfdfdfdfdgcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOdgcIcIcIcIcIdecPadahahahcrdlbdbdaecrcrcrcrcrcrcrdmcraebdbdbddnaeaeaeaeaeaeaeaedodododpaeaeaeaeaeaeaeaeaedqbdbdcLcLcLaf +aaababababababababababdrdsdtdtdtdtdudtdtdtdtdtdtdvdwdxababababababacacacacaZdddedfdydfdydfdgcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOdgcIdhcIdhcIdecPadahahahaebdbdbdaedAdBdCdDdEdFdGdHdIcrbdbdbddJdKdKdLdKcvaedMdNdOdOdOdOaedPcgdQaeacacacaedRbdbdbdbdbdaf +aaababababababababababdrdSdTdTdTdTdUdTdTdTdTdTdTdVdWdxababababababacacacacaZdddedfdfdXdfdfdgcOcOcOcOcOcOcOdYcOcOcOcOcOcOcOdgcIcIdicIcIdecPadahahahcrbdbdbdcrbddBeaebdEbdecedeecrbdbdbddJdKdKdKdKdKefegdOdOdOdOdOehcgcgeiaeacejejejekbNelemeneoaf +aaababababababababababdrdSdTdTdTdTdTdTdTdTdUdTdTdTepdxababababababacacacacaZdddedfdfdfdfdfdgcOcOcOcOcOcOcOeqcOcOcOcOcOcOcOdgcIcIcIcIcIdecPadahahahcrbdbdbdcrbdbdbdbdbdbdbdbdercrbdbdbddJesdKetdKdKaeeuevewexeyezaeeAcVeBaeacejeCejeDeEeFeGeHeIaf +aaababababababababababdrdSdTdTdUdUdTdTdTdTdTdTdTdTeJdxabababababeKacacacacaZdddedfdydfdydfdgcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOdgcIdhcIdhcIdecPadahahahaebdbdbdeLbdbdbdbdeMeNeObdbdcrbdbdbdePejejejeQeQejejejejejejejejejejejejejejeRejejejejejejejeS +aaababababababababababdreTdTdTdTdTdTdTdTdTeUdTdUdUepdxababababababacacacacaZeVdedfdfdfdfdfdgcOcOcOcOcOcOcOcOcOcOcOcOcOcOcOdgcIcIcIcIcIdeeVadahahahcrbdbdbdcrcxbdbdbdeXeXeYbdbdcrbdbdbdejDofafbfcfcfdfefffgfcfhfifjfkfcflfmfnfofcfpfqfrfsftfufueS +aaababababababababababdrdSdTdTdTdTdTdTdTdTdTdTdTfvfwdxababababababacacacacaZaZaZfxfxfxfxfxaZcNcOcOcOcOcOcOcOcOcOcOcOcOcOcNaZfxfxfxfxfxaZaZadahahahcrdlbdbdcrfzdEbdbdbdbdbdbdbdcrbdbdbdejfAfcfbfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfceS +aaababababababababababdrfBfCfDfEfFfGfHfIfJfKfLfCfMfNfNfNfNfOfPababacacacacacacaZfQfQfQfQfQaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZaZdjdjdjdjdjaZacadahahahaebdbdbdaefSdEbddkbddzbdbdcvcrbdbdbdejfUfVfbfcfWfXfcfcfYfZgafcfcgbgcgdfcfcgegegefcfcgfgfgfgfeS aaababababababababababdrggghgigjgkglgmgngogpgqgqdWfNfNfNfNfNfNababacacacacacacaZaZaZaZaZaZaZacacacacacacacacacacacacacacacaZaZaZaZaZaZaZacadahahahcrbdbdbdaeaeaeaeaeaeaecreLcraebdbdbdejfAfcfbfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfceS aaababababababababababdrdSgrgsgtgtgtgtgugtgtgtgtdVgvdxababfNfNababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacadahahahcrbdbdbdbdbdbdbdcwbdbdbdbdbdbdbdbdbdejgwgxfbgyfcfcfcfcfcgzgAgBgBgBgBgBgCgCgAgzgDfcfcfcgEgEgEeS aaababababababababababdrdSgtgtgFgtgugtgtgtgtgugtgtepdxababfNfNababacacacacacacacacacgGgGgGgGgGgGgGgGgGgGgGgGgGgGgGgGacacacacacacacacacacacadahahahaebdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdejejejejejejejfcfcejejejejejejejejejejejejejgHgHePejejejeS -aaababababababababababdrdSgtgugtgtgtgtgtgIgtgtgtgtgJdxababfOfNabeKacacacacacacacacacgGgKgLgMgNgNgOgGgPgQgRgSgTgUgVgGacacacacacacacacacacacadahahahaecvbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdcvejgWfcgXejgYgZfcfchahbejhchdhehfhghhhiejhjhjhkhlhmhnhohpeS +aaababababababababababdrdSgtgugtgtgtgtgtgIgtgtgtgtgJdxababfOfNabeKacacacacacacacacacgGgKgLgMgNgNgOgGgPgQgRgSgTgUgVgGacacacacacacacacacacacadahahahaecvbdbdbdbdbdbdbdbdbdbdbdbdbdbdbdcvejgWfcgXejgYgZfcfchahbejdZhdhehfhghhhiejhjhjhkhlhmhnhohpeS aaababababababababababdrdSgtgugtgtgtgtgtgtgtgtgtgtepdxabfNfNfNfNabacacacacacacacacacgGhqhrhrhrhrhshthuhrhrhvhwhrhxgGacacacacacacacacacacacadbHahahaecrhyeLhycraecreLcraehzeLhAaeaeeLaeejgWfchBhChDfcfcfcfchEejhFhGhGhGhGhGhHejhIhIhlhlhlhlhJhKeS aaababababababababababdrdSgtgtgtgIgtgtgtgugtgtgIfvfMdxabfNfNhLfNabacacacacacacacacacgGhqhrhrhrhrhrhMhrhrhrhNhOhrhPgGacacacacacacacacacacacadahahahaehQhRbdhShTaebdbdbdaebdbdcweLbdbdhUejhVfcfchWfcfcfcfcfcfchXhGhGhYhZiahGhGibhlhlhlhlhlhlicideS -aaababababababababababdrieififififigififihifififiiijdxabfOfNfNfNabacacacacacacacacacgGhqhrikhrhrilhtimhrhrhNinhriogGacacacacacacacacacacacadahahahaedlbdbdbdbdaedlbdbdaecvbdcvcripiqirejhVfcishCitfcfcfcfciuePivhGiwixiyhGizejiAiAhlhlhlhlhlhleS +aaababababababababababdrieififififigififihifififiiijdxabfOfNfNfNabacacacacacacacacacgGhqhrikhrhrilhtimhrhrhNinhriogGacacacacacacacacacacacadahahahaedlbdbdbdbdaedlbdbdaecvbdcvcrdziqirejhVfcishCitfcfcfcfciuePivhGiwixiyhGizejiAiAhlhlhlhlhlhleS aaababababababababababiBiCiCiCiCiCiCiCiCiCiCiCiCiCiCiDabfNfNfNfNabacacacacacacacacacgGiEiFiGiHiHiIhtiJhwhrhxiKiLiMgGacacacacacacacacacacacadahahahaeiNiOiPiQiRaeiSiTiUaeiViWcraeiXiYaeejhVfciZejjafcfcfcfcjbejjchGjdjejfhGjgejjhjhhlhlhlhljijieS -aaabababababababababababababababababababababababababababfNfNfNfOababababacacacacacacgGgGgGgGgGgGgGgGgGgGjjgGgGgGgGgGgGgGgGgGgGgGgGgGgGadadadjkjkjkaeaeaeaeaeaeaeaeaeaeefcvbdcvefcrcraeejejejejejjlfcfcfcfcjmejjnjojphGjqjojrejjhjhhlhlhlhlhljseS -aaabababababababababababababababababababababababababababfNfNfNfNababababababacacacacacacacacacacacacgGjthrjugGjvjwjxjygGjzjAjBjAjAjCgGahahahahahahjDahahahahahahahahahahahahahahahahahjDahahagejjEfcfcfcfcjFejjGjGjHjIjHjGjGejjJjJjKjKjLjJjJjJeS -aaababababababababababababababababababababababababababjMjMjNjNjMjMjMjMababababacacacacacacacacacacacgGjOhrjPgGjQjRjSjTjUjVjWjXjWjWjYgGahahahahahahjDahahahahahahahahahahahahahahahahahjDahahahejjEfcfcfcfcjZkakbkckdhlkckekekekekdhlhlkckekekfeS -aaababababababababababababababababababababababababababjMkgkhkhkikjkkjMabababababacacacacacacacacacacgGklhrkmgGknkohrkpgGkqkrksktkukvgGahahahahkwahjDahahahahahahahahahahahahahahahahahjDahahahejkxfcfcfcfckykzkAkBkChlkBkDkDkDkDkDkEkFkDkDkDkGeS -aaababababababababababababababababababababababababababjMkikhkhkikjkkjMabababababacacgGgGgGgGgGgGgGgGgGgGjjgGgGgGgGhrgGkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHjDjDjDejejejejejejejejejejePhlkIejejejejejkJkKejejejejeS -aaababababababababababababababababababababababababababjMjMkLkLjMjMjMjMabababababacacgGkNkOkPkQkRgGkSkTkUhrkVkWkXkYhrkZkHlalblcldlelflglhliljlelklllblmkHlnlololplolqlrlslrlqlolplololtkHahahahejlulvlwlvlxlwlvlyejlzhllAejlBlClDlElFlGlHlIlJlKeS -aaababababababababababababababababababababababababababjMkikhkhkikilLjMabababababacacgGlMhrhrhrlNgGlOlPhrhrlQlRlQlQhrlNkHlSlTlUlUlVlUlWlWlWlUlVlUlUlXlYkHlolZmamamamambmbmbmamamamamclokHbHahahejmdmdlwmdmdlwmdmdejkJhlkKejkJhlhlhlhlhlhlhlhlkKeS -aaababababababababababababababababababababababababababjMkikhkhkikilLjMababababababacgGmemfmgmhmigGmjmkmlhrhrhrhrhrhrmmkHmnlUlUlUlUmompmqmrmslUlUlUlUlUlUlomtmumvmwmxmymzmAmumBmCmDmElokHahahahejmFmGlwmGmHlwmGmIejkJhlkKejkJhlhlhlmJmJhlhlhlkKeS -aaababababababababababababababababababababababababababjMkikhkhkijMjMjMababababababacgGmKmLlQlQmMmNhrhrhrhrmfmOmPmQhrmRkHmSlUlUlUlUmTmUmVmWmXlUlUlUlUlUmYlomtmZnamunbmymzmAncmxndnemElokHahahahejmdnfngnhmdninhnjejnkhlkKejkJhlhlhlnlnmhlhlhlkKeS -aaababababababababababababababababababababababababababjMkikhkhkikjkkjMababababababacgGnnnonpnqnrnsnthrhrhrmLlQlQmMhrnukHnvnwlUlUlUlUlUlUlUlUlUlUlUlXnxkHlonynznznznznAnAnAnznznznznBlokHahahahejnCmdmdmdmdmdmdnDejkJhllGkelFnEnFhlhlhlhlnFnGkKeS -aaababababababababababababababababababababababababababjMlLkhkhkikjkkjMababababababacgGgGgGgGgGgGgGnHnInJnKnLhrhrnMnNnOkHnPnQnRlUlUnSnTlUnSnTlUlUnUnVnWkHltlololololonXnYnZlololololooakHahahahejobocodoeofogmdmdejkJhlhlhlhlnEohnFohnFnFoinGkKeS +aaabababababababababababababababababababababababababababfNfNfNfOababababacacacacacacgGgGgGgGgGgGgGgGgGgGjjgGgGgGgGgGgGgGgGgGgGgGgGgGgGadadDpjkjkjkefaeaeaeaeaeaeaeaeaeefcvbdcvefcrcraeejejejejejjlfcfcfcfcjmejjnjojphGjqjojrejjhjhhlhlhlhlhljseS +aaabababababababababababababababababababababababababababfNfNfNfNababababababacacacacacacacacacacacacgGjthrjugGjvjwjxDqgGjzjAjBjAjAjCgGagahahahahahjDahahahahahahahahahahahahahahahahahjDahahagejjEfcfcfcfcjFejjGjGjHjIjHjGjGejjJjJjKjKjLjJjJjJeS +aaababababababababababababababababababababababababababjMjMjNjNjMjMjMjMababababacacacacacacacacacacacgGjOhrjPgGjQjRjSDrjUjVjWjXjWjWjYgGahahahahahahjDahahahahahahahahahahahahahahahahahjDahahahejjEfcfcfcfcjZkakbkckdhlkckekekekekdhlhlkckekekfeS +aaababababababababababababababababababababababababababjMkgkhkhkikjkkjMabababababacacacacacacacacacacgGklhrkmgGknDsqzhrgGkqkrksktkukvgGagahahahkwahjDahahahahahahahahahahahahahahahahahjDahahahejkxfcfcfcfckykzkAkBkChlkBkDkDkDkDkDkEkFkDkDkDkGeS +aaababababababababababababababababababababababababababjMkikhkhkikjkkjMabababababacacgGgGgGgGgGgGgGgGgGgGjjgGgGgGgGgGhrkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHjDjDjDejejejejejejejejejejePhlkIejejejejejkJkKejejejejeS +aaababababababababababababababababababababababababababjMjMkLkLjMjMjMjMabababababacacgGkNkOkPkQkRgGkSkTkUhrkVkWDuDtDvhrkHlalblcldlelflglhliljlelklllblmkHlnlololplolqlrlslrlqlolplololtkHahahahejlulvlwlvlxlwlvlyejlzhllAejlBlClDlElFlGlHlIlJlKeS +aaababababababababababababababababababababababababababjMkikhkhkikilLjMabababababacacgGlMhrhrhrlNgGlOlPhrhrlQlRlQlQlQDwkHlSlTlUlUlVlUlWlWlWlUlVlUlUlXlYkHlolZmamamamambmbmbmamamamamclokHbHahahejmdmdlwmdmdlwmdmdejkJhlkKejkJhlhlhlhlhlhlhlhlkKeS +aaababababababababababababababababababababababababababjMkikhkhkikilLjMababababababacgGmemfmgmhmigGmjmkmlhrhrhrhrhrhrDxkHmnlUlUlUlUmompmqmrmslUlUlUlUlUlUlomtmumvmwmxmymzmAmumBmCmDmElokHahahahejmFmGlwmGmHlwmGmIejkJhlkKejkJhlhlhlmJmJhlhlhlkKeS +aaababababababababababababababababababababababababababjMkikhkhkijMjMjMababababababacgGmKmLlQlQmMmNhrhrhrhrmfmOmPmQhrmmkHmSlUlUlUlUmTmUmVmWmXlUlUlUlUlUmYlomtmZnamunbmymzmAncmxndnemElokHahahahejmdnfngnhmdninhnjejnkhlkKejkJhlhlhlnlnmhlhlhlkKeS +aaababababababababababababababababababababababababababjMkikhkhkikjkkjMababababababacgGnnnonpnqnrnsnthrhrhrmLlQlQmMhrmRkHnvnwlUlUlUlUlUlUlUlUlUlUlUlXnxkHlonynznznznznAnAnAnznznznznBlokHahahahejnCmdmdmdmdmdmdnDejkJhllGkelFnEnFhlhlhlhlnFnGkKeS +aaababababababababababababababababababababababababababjMlLkhkhkikjkkjMababababababacgGgGgGgGgGgGgGnHnInJnKnLhrhrDyDADzkHnPnQnRlUlUnSnTlUnSnTlUlUnUnVnWkHltlololololonXnYnZlololololooakHahahahejobocodoeofogmdmdejkJhlhlhlhlnEohnFohnFnFoinGkKeS aaabababababababababababababababojokokokokokokokokokokolomononomomomomababababababacacacacacacacgGgGgGgGhthtoohrgGgGgGkHkHkHkHopoqkHkHorkHkHosoqkHkHkHotototototototototototototototototahahahouejejejejejovjKjKejkJhlkFkDkEhlowowowowowowhlkKeS aaabababababababababababababababomoxoyozoyoyoyoyozoyoAoBoCoCoCoDoEabababababababababacacacacacacgGoFoGoHoGoIhrhroJoGoKkHoLoMoNlUlUoOoPlUoQoRlUlUoSoToLotoUoVoWoXotoYoZpaoZoYotpbpbpbpbotahahahpclGkekelHkekdhlhlkclFhlkKejkJhlhlhlhlhlhlhlhlkKeS -aaabababababababababababababababomoxoypdpepepepepdoyoAoBoCoCoCpfoEabababababababababacacacacacacgGpglPhrlPphhrhrhrhrpikHpjlUlUlUlUpklTnwlXpllUlUlUlUpmotoUpnoWoXotpopopopopootppppppppotahahahpckFkChlkBkDkDkChlkBkChlpqejprkDkDkDkEkFkDpsptpueS -aaabababababababababababababababomoxpdpvpwpxpxpypvpdoAoBoCoCoCpzoEabababababababababacacacacacacgGpAmkpBpCmkhrhrhrhrpDkHpjlUlUlUlUpEpFpFpFpGlUlUlUlUpHotoUpnoWpnpIpopopopopopJpopopopKotahahahouejejpcejejejejpLejejpcejejpMpNpNpNlFlGpNpNpNpOeS -aaabababababababababababababababompPpepQpRpxpxpRpSpeoAoBoCoCoCpzoEabababababababababacacacacacacgGmKhrhrhrhrhrhrhrhrpTkHpjlUlUlUlUlUlUlUlUlUlUlUlUlUpmotoUpnpnpnpIpopopopopopJpopopopKotbHahahjJpUpVhlpWpXjJpYhlpZqahlqbejqcqdqdqdhlhlqdqdqdqeeS -aaabababababababababababababababomoxpeqfqfpxpxqfqfpeoAoBoCoCoCpzoEabababababababababababacacacacgGmKhrhrhrhrhrhrhrhrqgkHpjlUlUlUlUlUlUlUlUlUlUlUlUlUpmotoUpnpnqhotpoqipoqipootqjqjqjqjotahahahjJqknGhlhlqlqmqnhlhlqoqpqqejqrqsqsqsqsqsqsqsqsqteS -aaabababababababababababababababquoxqvpxpxpxpxpxpxqwoAoBoCoCoCoDoEabababababababababababacacacacgGqxqyqyqyqzhrhrnMnpqAkHqBqClUlUlUlUlUlUlUlUlUlUlUqDqEotqFpnpnqGotqHpoqIpoqJotqKqKqKqKotahahahjJqLqMqNqOqPjJqnhlhlqQqRjJejqSqSqSqSqSqSqTqSqSqSeS -aaabababababababababababababababomoxpdqUpypxpxpyqVpdoAoBoCoCqWqXqXqXqXqXqXqXqXqXqXqXqXqXadadadadgGgGgGgGhtqYqZrarbgGgGkHrcrcrcrdoqrcrercrercrdoqrcrcrcotototrfotototototototototototototjDjDjDejjJjJjJjJjJouqnhlhlqnqnqnouejejejejejejejejejejeS -aaabababababababababababababababomoxpepRrgpxpxpRrhpeoAoBoCoCadriahahahahahahahahairjrkrlrmrlrnroahrprqahahahahahahrrahrsahahahahahahahaiahahahahahahahrortahahahahaiahruahahahahahahahjDahahahrvahahaiahahrwrxrxrxrxrxrxryrzrArBrzrCrDrErFrGrHrI -aaabababababababababababababababomoxrJqfqfpxpxqfqfrJoAoBoCoCahrKahahahahahahahahahahahahahahahahahrpahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahjDahahahjDahahahahahrLahrMrMrMrMahrNrzrzrzrzrOrPrQrRrRrSrI -aaabababababababababababababababomoxrJpypypxpxpypyrJoAoBoCoCrTrKahahahahahahahahahahahahahahahahahrpahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahjDahahahjDahahahahahrLahrMrMrMrMahrNrzrzrzrzrOrUrQrRrRrSrI -aaabababababababababababababababomoxperVpRpxpxpRrWpeoAoBoCoCadriahahahahahahahahahrMrMrMrMrMrMahahrpahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahjDahahahjDahahahahahrXrYrYrYrYrYrYrZrzrzrzrzrCrDsasbsbscrI -aaabababababababababababababababomoxpdsdqfpxpxqfsepdoAoBoCoCqWqXqXqXqXqXqXqXqXqXqXqXqXqXejsfsgsgsfejqXqXqXqXshjDqXqXshjDqXqXqXqXsisjsksjsisislslsisislslsijDjDjDotototsmototototslslslsijDjDjDejejejejejejousnsnsnsnsnsnouejejejejejejejejejejeS -aaabababababababababababababababquoxqvpxpxpxpxpxpxqwoAoBoCoCoCoDoEabababababababababababejsospsqsoejsrsrsraiahahssstahahaisrsrsrsisisisisisusvswsxswsyszsisAahahotsBsCsDsDsEsFotsGsHsIslahahahejsJsKsKsKsLejhlpYhlhlpYhlejsMsNsOsPsQejsRsSsTsUeS -aaabababababababababababababababomoxsVqfpxpypypxsWsVoAoBoCoCoCpzoEabababababababababababejsXsYsZtaejahtbtctctctctctctctctctctdahsiszsytetfswswswswswswswsiahahahottgsDsDthototottitjtkslahahahejtltmtmtmtnejejovtotoovejejtpfcfcfcfctqfcfcfctreS -aaabababababababababababababababompPsVtspxpypypxttsVoAoBoCoCoCpzoEabababababababababababejtufcfctvejahtwtxtxtxtytxtxtytxtxtxtzahsiswswtAtAswswswtAtAswswsiahahahottgsDsDsDtBsFottCtDtEslahahahejtFfcfcfcfctGtHtIfcfctJtKtLfcfcfcfctMejtNfcfctreS -aaabababababababababababababababomoxpdpvtOqftPpxpvpdoAoBoCoCoCpzoEabababababababababababejtQtRtSfcejtTtwtxtUtVtVtVtVtVtVtUtxtztWslswtXtYtZuaswtXubucuaswslahahahotudsDsDthotototuetDtEsiahahahejufugfcuhuiujukulfcfculumunuoupfcuqurejusututuueS -aaabababababababababababababababomoxoypdpepepepepdoyoAoBoCoCoCpfoEabababababababababababejejejejuvejtTtwtxuwtxtxtxtxtxtxuwtxtztWslswtXuxuyuaswtXuzuAuaswslahahahotuBsDsDsDuCsFotuDuEtEsiahahahejejejuvejejejejejuFuFejejejululuGululejejejejejeS -aaabababababababababababababababomoxoyozoyoyoyoyozoyoAoBoCoCoCoDoEabababababababababababejuHuIuJfcejuKtwtxuwtxtxtxtxuwtxuwtxtztWslswswuLuLswswswuLuLswswslahahahsmsDsDsDthotototuMuEtEsiahahahjJuNuOfcuPuQuRuRuOfcfcuSuQuTuRuOfcfcfcuUfcuVuWsUeS -aaabababababababababababababababojokokokokokokokokokokolomomomomomababababababababababacejuXfcfcuYejtTtwtxuwtxuwtxtxtxtxuwtxtztWslswswswswswswswswswswswsibHahahotuZvasDsDvbvcotuMuEtEslahahahjJvdtSfcvetRtSfcvffcfcvetRtRtRtRtRtRuivgtNfcfctreS -aaababababababababababababababababababababababababababababababababababababababababababacejvhvivjfcuvahtwtyuwtxtxtxtVtxtxuwtytzahsiswswtAtAswswswswswswswsiahahahotototsmototototvkvlvmslahahahejejovuvovejejuvejvnvnejulululululululejvofcvptreS -aaababababababababababababababababababababababababababababababababababababababababababacejejejejejejahtwtyuwtxtxtxtxtxtxuwtytzahsivqtXvrvsuaswswswswswswvtahahahsiszvuswvvvwvxtfswswswslahahahouvyvzhlvAvBvCfcejfcfculvDvEvFvGvHvIvJejvKvLvMvNeS +aaabababababababababababababababomoxoyfyeWeWeWeWfyoyoAoBoCoCoCpfoEabababababababababacacacacacacgGpglPhrlPphhrhrhrhrpikHpjlUlUlUlUpklTnwlXpllUlUlUlUpmotoUpnoWoXotpopopopopootppppppppotahahahpckFkChlkBkDkDkChlkBkChlpqejprAnkDkDkEkFkDpsptpueS +aaabababababababababababababababomoxfyfTfRhchcipfTfyoAoBoCoCoCpzoEabababababababababacacacacacacgGpAmkpBpCmkhrhrhrhrpDkHpjlUlUlUlUpEpFpFpFpGlUlUlUlUpHotoUpnoWpnpIpopopopopopJpopopopKotahahahouejejpcejejejejpLejejpcejejpMpNpNpNlFlGpNpNpNpOeS +aaabababababababababababababababompPeWpdkMhchckMpeeWoAoBoCoCoCpzoEabababababababababacacacacacacgGmKhrhrhrhrhrhrhrhrpTkHpjlUlUlUlUlUlUlUlUlUlUlUlUlUpmotoUpnpnpnpIpopopopopopJpopopopKotbHahahjJpUpVhlpWpXjJsfhlpvpwhlqbejqcqdqdqdhlhlqdqdqdqeeS +aaabababababababababababababababomoxeWpxpxhchcpxpxeWoAoBoCoCoCpzoEabababababababababababacacacacgGmKhrhrhrhrhrhrhrhrqgkHpjlUlUlUlUlUlUlUlUlUlUlUlUlUpmotoUpnpnqhotpoqipoqipootqjqjqjqjotahahahjJqknGhlhlqlqmqnhlhlqoqpqqejqrqsqsqsqsqsqsqsqsqteS +aaabababababababababababababababquoxpyhchchchchchcpQoAoBoCoCoCoDoEabababababababababababacacacacgGqxqyqyqyqzhrhrnMnpqAkHqBqClUlUlUlUlUlUlUlUlUlUlUqDqEotqFpnpnqGotqHpoqIpoqJotqKqKqKqKotahahahjJqLqMqNqOqPjJqnhlhlqQqRjJejqSqSqSqSqSqSqTqSqSqSeS +aaabababababababababababababababomoxfypRiphchcippSfyoAoBoCoCqWqXqXqXqXqXqXqXqXqXqXqXqXqXadadadadgGgGgGgGhtqYqZrarbgGgGkHrcrcrcrdoqrcrercrercrdoqrcrcrcotototrfotototototototototototototjDjDjDejjJjJjJjJjJouqnhlhlqnqnqnouejejejejejejejejejejeS +aaabababababababababababababababomoxeWkMpZhchckMqaeWoAoBoCoCadriahahahahahahahahairjrkrlrmrlrnroahrprqahahahahahahrrahrsahahahahahahahaiahahahahahahahrortahahahahaiahruahahahahahahahjDahahahrvahahaiahahrwrxrxrxrxrxrxryrzrArBrzrCrDrErFrGrHrI +aaabababababababababababababababomoxqfpxpxhchcpxpxqfoAoBoCoCahrKahahahahahahahahahahahahahahahahahrpahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahjDahahahjDahahahahahrLahrMrMrMrMahrNrzrzrzrzrOrPrQrRrRrSrI +aaabababababababababababababababomoxqfipiphchcipipqfoAoBoCoCrTrKahahahahahahahahahahahahahahahahahrpahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahjDahahahjDahahahahahrLahrMrMrMrMahrNrzrzrzrzrOrUrQrRrRrSrI +aaabababababababababababababababomoxeWqvkMhchckMqweWoAoBoCoCadriahahahahahahahahahrMrMrMrMrMrMahahqUahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahahjDahahahjDahahahahahrXrYrYrYrYrYrYrZrzrzrzrzrCrDsasbsbscrI +aaabababababababababababababababomoxfyqVpxhchcpxrgfyoAoBoCoCqWqXqXqXqXqXqXqXqXqXqXqXqXqXrhrVrJrJrVrhqXqXqXqXshjDqXqXshjDqXqXqXqXsisjsksjsisislslsisislslsijDjDjDotototsmototototslslslsijDjDjDejejejejejejousnsnsnsnsnsnouejejejejejejejejejejeS +aaabababababababababababababababquoxpyhchchchchchcpQoAoBoCoCoCoDoEabababababababababababrhsdrWsesdrhsrsrsraiahahssstahahaisrsrsrsisisisisisusvAosxswsyszsisAahahotsBsCsDsDsEsFotsGsHsIslahahahejsJsKsKsKsLejhlpYhlhlpYhlejsMsNsOsPsQejsRsSsTsUeS +aaabababababababababababababababomoxsopxhcipiphcspsooAoBoCoCoCpzoEabababababababababababrhsVsqsXsWrhahtbtctctctctctctctctctctdahsiszsytetfswswswswswswswsiahahahottgsDsDthototottitjtkslahahahejtltmtmtmtnejejovtotoovejejtpfcfcfcfctqfcfcfctreS +aaabababababababababababababababompPsosYhcipiphcsZsooAoBoCoCoCpzoEabababababababababababrhtstatattrhahtwtxtxtxtytxtxtytxtxtxtzahsiswswtAtAswswswtAtAswswsiahahahottgsDsDsDtBsFottCtDtEslahahahejtFfcfcfcfctGtHtIfcfctJtKtLfcfcfcfctMejtNfcfctreS +aaabababababababababababababababomoxfyfTtupxtvhcfTfyoAoBoCoCoCpzoEabababababababababababrhtPtOuHtQrhtTtwtxtUtVtVtVtVtVtVtUtxtztWslswtXtYtZuaswtXubucuaswslahahahotudsDsDthotototuetDtEsiahahahejufugfcuhuiujukulfcfculumunuoupfcuqurejusututuueS +aaabababababababababababababababomoxoyfyeWeWeWeWfyoyoAoBoCoCoCpfoEabababababababababababrhrhrhrhuIrhtTtwtxuwtxtxtxtxtxtxuwtxtztWslswtXuxuyuaswtXuzuAuaswslahahahotuBsDsDsDuCsFotuDuEtEsiahahahejejejuvejejejejejuFuFejejejululuGululejejejejejeS +aaabababababababababababababababomoxoyozoyoyoyoyozoyoAoBoCoCoCoDoEabababababababababababrhuXuJuYtarhuKtwtxuwtxtxtxtxuwtxuwtxtztWslswswuLuLswswswuLuLswswslahahahsmsDsDsDthotototuMuEtEsiahahahjJuNuOfcuPuQuRuRvhfcfcuSuQuTuRuOfcfcfcuUfcuVuWsUeS +aaabababababababababababababababojokokokokokokokokokokolomomomomomababababababababababacrhvitatavjrhtTtwtxuwtxuwtxtxtxtxuwtxtztWslswswswswswswswswswswswsibHahahotuZvasDsDvbvcotuMuEtEslahahahjJvdtSfcvetRtSfcvffcfcvetRtRtRtRtRtRuivgtNfcfctreS +aaababababababababababababababababababababababababababababababababababababababababababacrhxuxlxvtauIahtwtyuwtxtxtxtVtxtxuwtytzahsiswswtAtAswswswswswswswsiahahahotototsmototototvkvlvmslahahahejejovuvovejejuvejvnvnejulululululululejvofcvptreS +aaababababababababababababababababababababababababababababababababababababababababababacrhrhrhrhrhrhahtwtyuwtxtxtxtxtxtxuwtytzahsivqtXvrvsuaswswswswswswvtahahahsiszvuswvvvwvxtfswswswslahahahouvyvzhlvAvBvCfcejfcfculvDvEvFvGvHvIvJejvKvLvMvNeS aaababababababababababababababababababababababababababababababababababababababababababacacacacacacadtTtwtxuwtxvOtxtxtxtxuwtxtztWslswtXvPvQuaswswswswswswvRahahahvRswswswswswswswswswswsiahahahhlhlhlhlvSvTvUvVejfcfcvnfcfcfcfcfcfcvWejvXvYvZwaeS aaabababababababababababababababababababababababababababababababababababababababababacacacacacacacadtTtwtxuwtxtxtxvOtxtxuwtxtztWslswswuLuLswswswswswswswwbahahahwbswswswswswswswswswswwcahahahwdhlhlhlvSwevUwfejfcfcvnfcsgsgsgsgsgwgejejejejejeS aaabababababababababababababababababababababababababababababababababababababababababacacacacacacacadtTtwtxtUtVtVtVtVtVtVtUtxtztWslswswswswswswswswswswswslahahahslswtAtAswswtAtAswswswsiahahahouwhwihlwjwkwlfcejwmwmulwnfcfcfcfcfcwowpwqwrwrwseS aaabababababababababababababababababababababababababababababababababababababababababacacacacacacacadtTtwtxtxtxtytxtxtytxtxtxtztWwtwuwuwuwuwuwuswswswswswslahahahslswwvwvswswwvwvswswswslahahahejejejwwejejejuvejejejejwxfcfcwywyfcfcwzfcfcfcwgeS aaabababababababababababababababababababababababababababababababababababababababacacacacacacacacacadbHwAwBwBwBwBwBwBwBwBwBwBwCahwDwEwFwGwHwIwJswswswswswsiahahahsiswwvwvswswwvwvswswswslahahahejwKwLhlwMejwNfcwOwPfcejwQfcvLwRvMwSwTwpwUwVwVwWeS aaabababababababababababababababababababababababababababababababababababababababacacacacacacacacacadwXahahahahsjsjsjsjahahahahwXwDwYwYwYwYwYwYswwZxaxbxcsiahahahsiszuLuLswswuLuLswsvwZslahahahejxdhlhlhlejulululululejxefcvLvMvMwSxfejejejejejeS -aaababababababababababababababababababababababababababababababababababababababacacacacacacacacacacadadadadadadadadadadadadadadadwDxgxhxixjxkwYsisisisisisixlxlxlejejejejejejejejejejejejbHahahejxmhlhlhlejxnxoulwSxpejxqfcvLxrxswSwowpwqwrwrwseS -aaababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacwDwDwDwDwDwDxtwDacacacadagahahahxupYwpxvxwxxuvfcuPxyfcuvahahahejxzhlhlhlwwhlhlulfcfcxAfcfcfcxBxBfcfcwzfcfcfcwgeS -aaababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacwDxCxDxExFxGxHwDacacacadbHrMrMrMxuqnxIxJfcxKejtNfcfcxKejahahahejejejejejejejejejejejejxLxMxNfcxOxMxPwpwUwVwVwWeS -aaababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacwDxQxHxHxHxHxHwDacacacadahrMrMrMxuqnxRxSfcxTejxUfcfcxVejahahahrDxWxXxYxZxYxXxWyaybybejejejejycejejejejejejejejeS -aaabababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacwDydxHyeyfygyhwDacacacadagahahahxupYwpyiyjykejylymynyoejahahahrDyprzrzrzrzrzypyqyryrejysytyuyuyvyvejywyuywyxyweS -aaabababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacwDwDyywDwDwDwDwDacacrDrDrDyzyzyzejejejejejejejejejejejejahahahyAyprzyByByBrzypyCyryDejejejyuyuyuyuyEyFyFyFyFyFeS -aaabababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacwDyGyHyIwDacacacacacrDyJyKyLrzyMyKyJrDacacacacacacejwPuvahahahyAyprzrzrzrzrzypyCyryrejysyNyuyOyuyPejyQyuyQyuyQeS -aaabababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacwDyRyHySwDacacacacacrDrDrDyLrzyMrDrDrDacacacacacacejfcejrMahahyAyprzyByByBrzypyCyryDejejejejejejejejejejejejejeS -aaababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacwDwDwDwDwDacacacacacrDyJyKyLrzyMyKyJrDacacacacacacejfcejrMahahrDyprzrzrzrzrzypyqyryrrDacacacacacacacacacacacacaa -aaababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacrDrDrDyLrzyMrDrDrDacacacacacacejfcejrMrMagrDxWyTyTyTyTyTxWyUyVyVrDkHkHkHkHkHkHacacacacacacaa -aaabababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacrDyJyKyLrzyMyKyJrDacacacacacacejfcejulyWulkHkHyXyXyXyXyXyXyXyXkHkHyYyZzazbzckHacacacacacacaa -aaabababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacrDrDrDyLrzyMrDrDrDacacacacacacejfcejsXzdzekHzfzgzhzizjzkzlzmznzokHzazazazazakHacacacacacacaa -aaabababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacototototrDyJyKyLrzyMyKyJrDototototacacejfcejzpfczqkHzrlUzsztzslUlUlUlUlUzuzazazazazakHacacacacacacaa -aaababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacotzvotzvrDrDrDyLrzyMrDrDrDzvotzvotacacejfcuvfczwfczxlUzyzzzzzzzzzAzBzBzCkHzDzEzFzGzHkHacacacacacacaa -aaababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacotzIotzJrDyJyKzKzLzMyKyJrDzJotzIotacacejejejejejejkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHacacacacacacaa +aaababababababababababababababababababababababababababababababababababababababacacacacacacacacacacadadadadadadadadadadadadadadadwDxgxhxixjxkwYsisisisisisixwxwxwxxxxxxxxxxxxxxxxxxxxxxxxbHahahejxmhlhlhlejxnxoulwSxpejxqfcvLxrxswSwowpwqwrwrwseS +aaababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacwDwDwDwDwDwDxtwDacacacxxxyxIxIxIxJxyxKxSxRxUxTyixVykyjxTahahahejxzhlhlhlwwhlhlulfcfcxAfcfcfcxBxBfcfcwzfcfcfcwgeS +aaababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacwDxCxDxExFxGxHwDacacacxxylymymymxJymynyoyjyzxxyWyjyjyzxxahahahejejejejejejejejejejejejxLxMxNfcxOxMxPwpwUwVwVwWeS +aaababababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacwDxQxHxHxHxHxHwDacacacxxxIymymymxJymzdzeyjzfxxzpyjyjzqxxahahahrDxWxXxYxZxYxXxWyaybybejejejejycejejejejejejejejeS +aaabababababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacwDydxHyeyfygyhwDacacacxxxyxIxIxIxJxyxKzWzwzXxxzZzYAbAaxxahahahrDyprzrzrzrzrzypyqyryrejysytyuyuyvyvejywyuywyxyweS +aaabababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacwDwDyywDwDwDwDwDacacrDrDrDAcAcAcxxxxxxxxxxxxxxxxxxxxxxxxahahahyAyprzyByByBrzypyCyryDejejejyuyuyuyuyEyFyFyFyFyFeS +aaabababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacwDyGyHyIwDacacacacacrDyJyKyLrzyMyKyJrDacacacacacacxxAdxTahahahyAyprzrzrzrzrzypyCyryrejysyNyuyOyuyPejyQyuyQyuyQeS +aaabababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacwDyRyHySwDacacacacacrDrDrDyLrzyMrDrDrDacacacacacacxxyjxxrMahahyAyprzyByByBrzypyCyryDejejejejejejejejejejejejejeS +aaababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacwDwDwDwDwDacacacacacrDyJyKyLrzyMyKyJrDacacacacacacxxyjxxrMahahrDyprzrzrzrzrzypyqyryrrDacacacacacacacacacacacacaa +aaababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacrDrDrDyLrzyMrDrDrDacacacacacacxxyjxxrMrMxWrDxWyTyTyTyTyTxWyUyVyVrDkHkHkHkHkHkHacacacacacacaa +aaabababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacrDyJyKyLrzyMyKyJrDacacacacacacxxyjxxAeAfAekHrDyXyXyXyXyXyXyXyXkHkHyYyZzazbzckHacacacacacacaa +aaabababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacrDrDrDyLrzyMrDrDrDacacacacacacxxyjxxAgAiAhkHAjzgzhzizjzkzlzmznzokHzazazazazakHacacacacacacaa +aaabababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacototototrDyJyKyLrzyMyKyJrDototototacacxxyjxxAkyjAlkHzrlUzsztzslUlUlUlUlUzuzazazazazakHacacacacacacaa +aaababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacotzvotzvrDrDrDyLrzyMrDrDrDzvotzvotacacxxyjxTyjAmyjzxlUzyzzzzzzzzzAzBzBzCkHzDzEzFzGzHkHacacacacacacaa +aaababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacotzIotzJrDyJyKzKzLzMyKyJrDzJotzIotacacxxxxxxxxxxxxkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHkHacacacacacacaa aaabababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacotzNzOzNrDrDrDzPrDzQrDrDrDzNzRzNotacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa aaabababababababababababababababababababababababababababababababababababacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacotzSzNzNzTzNzNzNotzNzNzNzTzNzNzUotacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazVzVzVzVzVzVzVzVzVzVzVzVzVzVzVzVzVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/tether/tether-07-misc.dmm b/maps/tether/tether-07-misc.dmm index b14a06e9454..550e727b88f 100644 --- a/maps/tether/tether-07-misc.dmm +++ b/maps/tether/tether-07-misc.dmm @@ -492,7 +492,7 @@ "jx" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/obj/structure/sign/poster{pixel_y = -32},/turf/simulated/shuttle/floor/black,/area/shuttle/trade/centcom) "jy" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/carpet,/area/shuttle/trade/centcom) "jz" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/glasses/square,/turf/simulated/floor/carpet,/area/shuttle/trade/centcom) -"jA" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/carpet,/area/shuttle/trade/centcom) +"jA" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/syndie_kit/demolitions_super_heavy{name = "Super Heavy Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions_heavy{name = "Heavy Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions_heavy{name = "Heavy Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions{name = "Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions{name = "Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions{name = "Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions{name = "Demolitions kit"},/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/obj/item/weapon/plastique,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "jB" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/inflatable_duck,/turf/simulated/shuttle/floor/black,/area/shuttle/trade/centcom) "jC" = (/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/trade/centcom) "jD" = (/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/trade/centcom) @@ -547,7 +547,7 @@ "kA" = (/obj/machinery/door/airlock/silver{name = "Toilet"},/turf/simulated/shuttle/floor/white,/area/shuttle/trade/centcom) "kB" = (/obj/machinery/door/airlock/silver{name = "Restroom"},/turf/simulated/shuttle/floor/white,/area/shuttle/trade/centcom) "kC" = (/obj/structure/undies_wardrobe,/turf/simulated/shuttle/floor/black,/area/shuttle/trade/centcom) -"kD" = (/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/trade/centcom) +"kD" = (/obj/machinery/vending/cigarette{name = "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/trade/centcom) "kE" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/obj/structure/largecrate/animal/cat,/turf/simulated/shuttle/floor/black,/area/shuttle/trade/centcom) "kF" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/largecrate/animal/cow,/turf/simulated/shuttle/floor/black,/area/shuttle/trade/centcom) "kG" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/obj/structure/closet/crate/freezer/rations,/turf/simulated/shuttle/floor/black,/area/shuttle/trade/centcom) @@ -780,19 +780,19 @@ "oZ" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/hos,/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_w = 0; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "pa" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/plasmastun,/obj/item/weapon/gun/energy/plasmastun,/obj/effect/floor_decal/corner/red{dir = 5},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pb" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/darkmatter,/obj/item/weapon/gun/energy/darkmatter,/obj/effect/floor_decal/corner/red{dir = 5},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"pc" = (/turf/simulated/floor/outdoors/grass/sif/forest,/area/antag/antag_base) +"pc" = (/turf/simulated/floor/outdoors/grass/sif/virgo3b{tree_chance = 0},/area/antag/antag_base) "pd" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/heavysniper,/obj/item/weapon/gun/projectile/heavysniper,/obj/effect/floor_decal/corner/red{dir = 5},/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pe" = (/turf/unsimulated/mineral{icon = 'icons/turf/transit_vr.dmi'; icon_state = "rock"},/area/space) "pf" = (/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pg" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/xray,/obj/item/weapon/gun/energy/xray,/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"ph" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/carbine,/obj/item/weapon/gun/projectile/automatic/carbine,/obj/effect/floor_decal/corner/red{dir = 5},/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762,/obj/item/ammo_magazine/c762/ap,/obj/item/ammo_magazine/c762/ap,/obj/item/ammo_magazine/c762/ap,/obj/item/ammo_magazine/c762/ap,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) +"ph" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/carbine,/obj/item/weapon/gun/projectile/automatic/carbine,/obj/effect/floor_decal/corner/red{dir = 5},/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,/obj/item/ammo_magazine/m762/ap,/obj/item/ammo_magazine/m762/ap,/obj/item/ammo_magazine/m762/ap,/obj/item/ammo_magazine/m762/ap,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pi" = (/obj/structure/table/glass,/obj/item/weapon/handcuffs/fuzzy,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "pj" = (/turf/unsimulated/wall{icon = 'icons/turf/transit_vr.dmi'},/area/space) "pk" = (/obj/effect/floor_decal/transit/orange{dir = 8},/turf/unsimulated/floor/techfloor_grid{icon = 'icons/turf/transit_vr.dmi'},/area/space) "pl" = (/turf/unsimulated/floor/techfloor_grid{icon = 'icons/turf/transit_vr.dmi'},/area/space) "pm" = (/obj/effect/floor_decal/transit/orange{dir = 4},/turf/unsimulated/floor/techfloor_grid{icon = 'icons/turf/transit_vr.dmi'},/area/space) "pn" = (/obj/structure/table/rack,/obj/effect/floor_decal/corner/red{dir = 10},/obj/item/weapon/storage/box/sniperammo,/obj/item/weapon/storage/box/sniperammo,/obj/item/weapon/storage/box/sniperammo,/obj/item/weapon/storage/box/sniperammo,/obj/item/weapon/storage/box/sniperammo,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"po" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/gyropistol,/obj/item/weapon/gun/projectile/gyropistol,/obj/item/ammo_magazine/a75,/obj/item/ammo_magazine/a75,/obj/effect/floor_decal/corner/red{dir = 10},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) +"po" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/gyropistol,/obj/item/weapon/gun/projectile/gyropistol,/obj/item/ammo_magazine/m75,/obj/item/ammo_magazine/m75,/obj/effect/floor_decal/corner/red{dir = 10},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pp" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/obj/item/weapon/gun/energy/sniperrifle,/obj/effect/floor_decal/corner/red{dir = 10},/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pq" = (/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "pr" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"; name = "Clothing Storage"},/obj/item/clothing/shoes/boots/combat,/obj/item/clothing/shoes/boots/combat,/obj/item/clothing/shoes/boots/combat,/obj/item/clothing/shoes/boots/combat,/obj/item/clothing/shoes/boots/combat,/obj/item/clothing/shoes/boots/combat,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/gloves/combat,/obj/item/clothing/gloves/combat,/obj/item/clothing/gloves/combat,/obj/item/clothing/gloves/combat,/obj/item/clothing/gloves/combat,/obj/item/clothing/gloves/combat,/turf/unsimulated/floor{icon_state = "lino"},/area/antag/antag_base) @@ -814,7 +814,7 @@ "pH" = (/turf/space/transit/north/shuttlespace_ns7,/area/shuttle/antag_space/transit) "pI" = (/obj/structure/table/rack,/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,/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,/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{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pJ" = (/obj/effect/floor_decal/corner/red{dir = 5},/obj/structure/table/rack,/obj/item/weapon/gun/launcher/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/obj/item/ammo_casing/rocket,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"pK" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/effect/floor_decal/corner/red{dir = 5},/obj/item/ammo_magazine/a556/ap,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) +"pK" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/item/weapon/gun/projectile/automatic/l6_saw,/obj/effect/floor_decal/corner/red{dir = 5},/obj/item/ammo_magazine/m556/ap,/obj/item/ammo_magazine/m556,/obj/item/ammo_magazine/m556,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pL" = (/obj/machinery/newscaster{layer = 3.3; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pM" = (/obj/structure/flora/pottedplant{icon_state = "plant-21"},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pN" = (/obj/machinery/door/airlock/centcom{name = "Barracks"; req_one_access = list(150)},/turf/unsimulated/floor{icon_state = "lino"},/area/antag/antag_base) @@ -825,7 +825,7 @@ "pS" = (/turf/space/transit/north/shuttlespace_ns1,/area/shuttle/antag_space/transit) "pT" = (/obj/effect/floor_decal/transit/orange{dir = 8},/obj/effect/transit/light{dir = 8},/turf/unsimulated/floor/techfloor_grid{icon = 'icons/turf/transit_vr.dmi'},/area/space) "pU" = (/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"pV" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/effect/floor_decal/corner/red{dir = 9},/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) +"pV" = (/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/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,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/effect/floor_decal/corner/red{dir = 9},/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pW" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/silenced,/obj/item/weapon/gun/projectile/silenced,/obj/item/weapon/gun/projectile/silenced,/obj/item/weapon/gun/projectile/silenced,/obj/item/weapon/gun/projectile/silenced,/obj/item/weapon/gun/projectile/silenced,/obj/item/weapon/gun/projectile/silenced,/obj/effect/floor_decal/corner/red{dir = 9},/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pX" = (/obj/effect/floor_decal/corner/red{dir = 9},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "pY" = (/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,/obj/effect/floor_decal/borderfloorblack{dir = 9},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) @@ -837,7 +837,7 @@ "qe" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/shuttle/antag_ground/base) "qf" = (/turf/simulated/shuttle/wall/dark/hard_corner,/area/shuttle/antag_space/base) "qg" = (/obj/effect/floor_decal/transit/orange{dir = 4},/obj/effect/transit/light{dir = 4},/turf/unsimulated/floor/techfloor_grid{icon = 'icons/turf/transit_vr.dmi'},/area/space) -"qh" = (/obj/structure/table/rack,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/effect/floor_decal/corner/red{dir = 9},/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) +"qh" = (/obj/structure/table/rack,/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/rubber,/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/effect/floor_decal/corner/red{dir = 9},/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "qi" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/item/weapon/gun/energy/laser,/obj/effect/floor_decal/corner/red{dir = 9},/obj/effect/floor_decal/corner/red{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "qj" = (/obj/effect/floor_decal/borderfloorblack{dir = 1},/obj/effect/floor_decal/borderfloorblack/corner2{dir = 4},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "qk" = (/obj/effect/floor_decal/borderfloorblack/corner{dir = 1},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) @@ -870,12 +870,12 @@ "qL" = (/obj/machinery/door/airlock/vault{name = "Armory"; req_one_access = list(150)},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "qM" = (/obj/structure/table/rack,/obj/item/weapon/tank/oxygen/red,/obj/item/weapon/tank/oxygen/red,/obj/item/weapon/tank/oxygen/red,/obj/item/weapon/tank/oxygen/red,/obj/item/weapon/tank/oxygen/red,/obj/item/weapon/tank/oxygen/red,/obj/item/weapon/tank/oxygen/red,/obj/effect/floor_decal/borderfloorblack{dir = 10},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "qN" = (/obj/machinery/suit_cycler/syndicate{locked = 0},/obj/effect/floor_decal/borderfloorblack{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"qO" = (/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/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) +"qO" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/virgo3b{tree_chance = 0},/area/antag/antag_base) "qP" = (/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_w = 0; pixel_x = 0; pixel_y = 32},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "qQ" = (/obj/machinery/vending/sovietsoda,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "qR" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/shuttle/antag_ground/base) "qS" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/shuttle/antag_space/base) -"qT" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) +"qT" = (/obj/structure/table/marble,/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = 8; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = -4; pixel_y = 8},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = 3},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = -4; pixel_y = -4},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = 8},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = -4},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = 8; pixel_y = 12},/obj/item/weapon/reagent_containers/food/drinks/cup{pixel_x = -4; pixel_y = 12},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "qU" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "qV" = (/turf/space/transit/north/shuttlespace_ns15,/area/shuttle/antag_space/transit) "qW" = (/turf/unsimulated/floor/steel{icon = 'icons/turf/flooring/circuit.dmi'; icon_state = "bcircuit"},/area/antag/antag_base) @@ -888,7 +888,7 @@ "rd" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security{name = "black belt"},/obj/item/weapon/storage/belt/security{name = "black belt"},/obj/item/weapon/storage/belt/security{name = "black belt"},/obj/item/weapon/storage/belt/security{name = "black belt"},/obj/item/weapon/storage/belt/security{name = "black belt"},/obj/item/weapon/storage/belt/security{name = "black belt"},/obj/item/weapon/storage/belt/security{name = "black belt"},/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/bandolier,/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/bandolier,/obj/item/weapon/storage/belt/security/tactical/bandolier,/obj/effect/floor_decal/borderfloorblack{dir = 1},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "re" = (/obj/structure/table/rack,/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,/obj/effect/floor_decal/borderfloorblack{dir = 5},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "rf" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/antag/antag_base) -"rg" = (/obj/machinery/vending/coffee,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) +"rg" = (/obj/structure/table/marble,/obj/machinery/chemical_dispenser/bar_coffee/full,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "rh" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "ri" = (/obj/item/weapon/folder{pixel_y = 2},/obj/structure/table/glass,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "rj" = (/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen{pixel_y = 4},/obj/structure/table/glass,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) @@ -904,10 +904,9 @@ "rt" = (/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/antag/antag_base) "ru" = (/obj/structure/window/reinforced{dir = 8; health = 1e+006},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/antag/antag_base) "rv" = (/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/structure/grille,/obj/structure/window/reinforced{dir = 5; icon_state = "fwindow"},/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/antag/antag_base) -"rw" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/syndie_kit/demolitions_super_heavy{name = "Super Heavy Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions_heavy{name = "Heavy Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions_heavy{name = "Heavy Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions{name = "Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions{name = "Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions{name = "Demolitions kit"},/obj/item/weapon/storage/box/syndie_kit/demolitions{name = "Demolitions kit"},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "rx" = (/obj/structure/table/rack,/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/item/clothing/mask/gas/wwii,/obj/item/clothing/mask/gas/wwii,/obj/item/clothing/mask/gas/wwii,/obj/item/clothing/mask/gas/wwii,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "ry" = (/obj/machinery/door/airlock/centcom{name = "Equipment Storage"; req_one_access = list(150)},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"rz" = (/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = -32},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) +"rz" = (/obj/machinery/vending/cigarette{name = "Breach Corp 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{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "rA" = (/obj/structure/flora/pottedplant{icon_state = "plant-20"},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/antag/antag_base) "rB" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "antag_ground_shuttle"; pixel_x = -25; pixel_y = 0; req_one_access = list(13,31); tag_door = "antag_ground_shuttle_hatch"},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/shuttle/floor/darkred,/area/shuttle/antag_ground/base) "rC" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/shuttle/antag_ground/base) @@ -930,7 +929,7 @@ "rT" = (/obj/structure/table/rack,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/item/device/radio,/obj/effect/floor_decal/borderfloorblack,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "rU" = (/obj/structure/table/rack,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/item/weapon/pinpointer/nukeop,/obj/effect/floor_decal/borderfloorblack,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "rV" = (/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/effect/floor_decal/borderfloorblack{dir = 6},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"rW" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) +"rW" = (/obj/effect/floor_decal/borderfloorblack{dir = 8},/obj/machinery/vending/nifsoft_shop{categories = 111; emagged = 1; name = "Hacked NIFSoft Shop"; prices = list()},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "rX" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "rY" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "antag_ground_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/antag_ground/base) "rZ" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "antag_space_shuttle_hatch"; locked = 1; name = "Shuttle Hatch"; req_access = list(13)},/turf/simulated/shuttle/floor/black,/area/shuttle/antag_space/base) @@ -973,7 +972,7 @@ "sK" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/unsimulated/floor{icon_state = "white"},/area/antag/antag_base) "sL" = (/obj/machinery/atmospherics/unary/cryo_cell,/obj/effect/floor_decal/industrial/outline/yellow,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "sM" = (/obj/machinery/atmospherics/unary/freezer,/obj/effect/floor_decal/industrial/hatch/yellow,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"sN" = (/obj/effect/floor_decal/corner/red{dir = 10},/obj/structure/table/rack,/obj/item/weapon/gun/projectile/deagle,/obj/item/ammo_magazine/a50,/obj/item/ammo_magazine/a50,/obj/item/ammo_magazine/a50,/obj/item/ammo_magazine/a50,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) +"sN" = (/obj/effect/floor_decal/corner/red{dir = 10},/obj/structure/table/rack,/obj/item/weapon/gun/projectile/deagle,/obj/item/ammo_magazine/m50,/obj/item/ammo_magazine/m50,/obj/item/ammo_magazine/m50,/obj/item/ammo_magazine/m50,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "sO" = (/obj/machinery/chemical_dispenser/full,/turf/unsimulated/floor{icon_state = "white"},/area/antag/antag_base) "sP" = (/obj/machinery/chem_master,/turf/unsimulated/floor{icon_state = "white"},/area/antag/antag_base) "sQ" = (/obj/structure/closet/athletic_mixed,/turf/unsimulated/floor{icon_state = "steel"},/area/antag/antag_base) @@ -1028,7 +1027,7 @@ "tN" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/syndie_kit/ewar_voice,/obj/item/weapon/storage/box/syndie_kit/ewar_voice,/obj/item/weapon/storage/box/syndie_kit/ewar_voice,/obj/item/weapon/storage/box/syndie_kit/ewar_voice,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = -32},/obj/item/weapon/card/emag,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "tO" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/item/weapon/storage/box/syndie_kit/chameleon,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = -32},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "tP" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/syndie_kit/spy,/obj/item/weapon/storage/box/syndie_kit/spy,/obj/item/weapon/storage/box/syndie_kit/spy,/obj/item/weapon/storage/box/syndie_kit/spy,/obj/item/weapon/storage/box/syndie_kit/spy,/obj/item/device/radio_jammer,/obj/item/device/radio_jammer,/obj/item/device/radio_jammer,/obj/item/device/radio_jammer,/obj/item/device/radio_jammer,/obj/item/device/chameleon,/obj/item/device/chameleon,/obj/item/device/chameleon,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = -32},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) -"tQ" = (/mob/living/simple_animal/fox/syndicate,/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) +"tQ" = (/mob/living/simple_animal/fox/syndicate{name = "Rick"},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) "tR" = (/obj/item/device/defib_kit,/obj/item/device/defib_kit,/obj/structure/table/standard,/obj/machinery/recharger,/obj/item/weapon/screwdriver,/turf/unsimulated/floor{icon_state = "white"},/area/antag/antag_base) "tS" = (/obj/machinery/washing_machine,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/antag/antag_base) "tT" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 9},/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 10},/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/antag/antag_base) @@ -1040,6 +1039,7 @@ "tZ" = (/obj/machinery/body_scanconsole,/obj/effect/floor_decal/corner_steel_grid{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/antag/antag_base) "ua" = (/obj/machinery/bodyscanner{dir = 8},/obj/effect/floor_decal/corner_steel_grid{dir = 10},/turf/unsimulated/floor{icon_state = "white"},/area/antag/antag_base) "ub" = (/obj/machinery/iv_drip,/obj/effect/floor_decal/steeldecal/steel_decals10{dir = 8},/turf/unsimulated/floor{icon_state = "white"},/area/antag/antag_base) +"uc" = (/obj/effect/floor_decal/borderfloorblack,/obj/machinery/recharger/wallcharger{pixel_x = 5; pixel_y = -32},/turf/unsimulated/floor{dir = 2; icon_state = "dark"},/area/antag/antag_base) (1,1,1) = {" aaabacadaeafagahaiajakalamanaoaaabacadaeafagahaiajapaqaqaqaqaqaqaqaqaqaqaqapapapapaparasasasasasasasasasasarasasasasasasasasasasarasasasasasasasasasasarasasasasasasasasasasarasasasasasasasasasasarasasasasasasasasasasarasasasasasasasasasasar @@ -1084,7 +1084,7 @@ apgXgXgXgXhlinipioipipipipioipifhlgXgXgXgXapixhsiuheizhqhwhUiAisiiihikiBhwhqhwhe apgXgXgXgXhliaipioipipipipioipifhlgXgXgXgXaphZhwizhqiFhsiuigiGiwijisiiiHhehsiuhqiFiuilapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapiEiEiEiEiEiEiIiJiKiEapapapapapiEiEiLiMiEiEapapiEiEiEiEiNiOgpap apgXgXgXgXhlinipioipipipipioipiqhlgXgXgXgXapiliuiFhsiPhwiziriQiAihiwijiRhqhwizhsiPizitapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapiEiCiSiTiEiUiViWiXiYiEiEapapapiEiEiCiDiDiCiEiIiKiCiZjaiEiNjbgpap apgXgXgXgXhlinipioipipipipioipifhlgXgXgXgXapitiziPhwhfiuiFivjciGisiAihjdhsiuiFhwhfiFixapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapjejfjgjgjhjgjgjijjjkiEiEiIiJiKiEiEjljgjgjmiEjnjojpjgjqiEiNjbgpap -apgXgXgXgXhlinipioipipipipioipifhlgXgXgXgXapixiFhfiuhaiziPiBjrjsiHjdiBjshwiziPiuhaiPjtapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapjujvjwjxiEjgjgjyjzjAiEjBjCjDjEjFjGjHjIjIjgjJjgjgjgjgjKiEiNjLgpap +apgXgXgXgXhlinipioipipipipioipifhlgXgXgXgXapixiFhfiuhaiziPiBjrjsiHjdiBjshwiziPiuhaiPjtapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapjujvjwjxiEjgjgjyjzjkiEjBjCjDjEjFjGjHjIjIjgjJjgjgjgjgjKiEiNjLgpap apgXgXgXgXhliaipioipipipipioipifhlgXgXgXgXapjtiPhaizhciFhfizgYhaiFhfizhaiuiFhfizhchfjMapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapiEiEiEiEiEiEjNjgjgjOiEjPjQjRjSjTjUjVjIjIjgjJjgjWjXjgjgiEiEiEgpap apgXgXgXgXhlinipioipipipipioipiqhlgXgXgXgXapjMhfhciFgYiPhaiFhdhciPhaiFhciziPhaiFgYhajYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapapapapapapapapapapiEiEiEjZjgiEiCkakbkckdkekfjVjIjgjNiCiEiEiCkgkhiEiEapgpap apgXgXgXgXhlinipioipipipipioipifhlgXgXgXgXapjYhagYiPhdhfhciPgZgYhfhciPgYiFhfhciPhdhcgFapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapgpapiEkikjiEiEiEiEiEiEiEiEkkjgjgjgjgkljgjgjgjgiEiEkmjgiCiEknkniEiEiEiEapapgpap @@ -1132,35 +1132,35 @@ mwapapapapapapapapapapmxmxmxmymxmxmxapapapapapapapapapapmwapapapapapapapapapapap mwapapapapapapapapapapapapapapapapapapapapapapapapapapapmwapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap mwapapapapapapapapapapapapapapapapapapapapapapapapapapapmwapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap mwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwmwapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -apapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -apapapapapapoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -apapapapapapoYoZpioYoZpioYoZpioYpcpcpcpcpcoYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +apapapapapapapapapapapapapapapoYoYoYoYoYoYoYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +apapapapapapoYoYoYoYoYoYoYoYoYoYpcpcpcpcpcoYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +apapapapapapoYoZpioYoZpioYoZpioYpcqOpcpcpcoYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap apapapapapapoYpqpqoYpqpqoYpqpqoYpcpcpcpcpcoYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYoYoYoYoYoYoYoYpDoYoYpDoYoYpDoYpcpcpcpcpcoYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYoYoYoYoYoYoYoYpDoYoYpDoYoYpDoYpcpcpcqOpcoYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap oYpJphpapbpKpdoYpfpfpfpfpLpfpfoYpcpcpcpcpcoYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpfpfpfpfpfpgoYoYoYoYoYoYoYpfoYoYrurtrvoYoYapapapapapapapapapapapapapapgFgGgHgIgJgKgLgLgIappepepepepepepepepeapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpfpfsNpnpoppoYsQtosTtotroYpfoYprpsptpupvoYapapapapapapapapapapapapapapgIgYgZhahbhchdhdgKappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpCoYoYoYoYoYoYtututututuoYpfoYpEpEpEpEpFoYapapapapapapapapapapapapapapgKhdpwpxpypzpAgZgGappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpfpItAtztBpMoYtCtEtDtEtFtGpfpNpEpEpEpEtHoYapapapapapapapapapapapapapapgGgZpypzpGpHpwhbgLappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpfpfpfpPpQpfoYoYoYoYoYoYoYoYoYpRpEpEpEpFoYapapapapapapapapapapapapapapgLhbpGpHpOpApyhegHappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpUpVpWpXpfpfoYpYpZpZqapZpZqboYqcpEpEpEqdoYapapqeqeqeqeqeapqfqfqfqfqfapgHhepOpApSpwpGhqgJappjpTpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpUqhqipXpfpfqjqkpfpfpfpfpfqloYqmpEpEpEpvoYapapqeqnqoqpqeapqfqqqrqsqfapgJhqpSpwpypypOhsgMappjpkpBpBpBpBpBqgpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYqtquqvqwpfpfqxqyqzqAqBqCqyqloYoYoYpNoYoYoYoYoYqeqDqoqpqeapqfqEqrqsqfapgMhspypypGpGpShwhZappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYqFqGqHqIpftIoYqJqKoYqLoYqMqNoYqOpqpqpqqPtJqQoYqeqRqotKqeapqfqSqrtLqfaphZhwpGpGpOpOpyheilappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpfpfpfpfpftMoYoYoYoYpfoYoYoYoYqTpqpqpqqUqUpqoYqeqRqotKqeapqfqSqrtLqfapilhepOpOpSpSpGhqitappjpTpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYqWqXqXqWpfqYoYqZrarbpfrcrdrerfrgpqpqrhrirjrkoYqeqRqoqpqeapqfqSqrqsqfapithqpSpSqVpypOhsixappjpkpBpBpBpBpBqgpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpfpfpfpfpfrmoYrnpfpfpfpfpfrorfrppqpqpqrqrqpqoYqerrqoqoqeapqfqrqrqrqfapixhsqVpyrlpGpShwhZappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYrstNtPtOrwpMoYrxpfpfpfpfpfpfrypqpqpqpqpqrzrAoYqerBqorCqeapqfrDqrrEqfaphZhwiHigiRiriBiuilappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYoYoYoYoYoYoYoYrFpfpfpfpfpfrGoYrHpfpfpfqloYoYoYqerIrJrIqeapqfrKrLrKqfapiliuiFhsiPhwizizitappjpTplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpfpfrMqjrNrOoYrPrQrRrSrTrUrVoYrWpftQpfqlrXoYapqeqerYqeqeapqfqfrZqfqfapitiziPhwhfiuiFiFixappjpkplplplplplqgpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYsasbscpfpfsdoYoYoYseseseoYoYoYsfpfpfpfqloYoYoYoYoYsgoYoYoYoYoYshoYoYapixiFhfiuhaiziPiPjtappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYoYoYoYsipfpfsjqjrNrNrNrNrNskslpfpfpfpfsmrNrNrNrNsnpfqjrNrNrNsopfspoYapjtiPhaizhciFhfhfjMappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpfpfrMpfpfsqsrssstpfqxsususvsrswstpfqxsusususususususususususususxoYapjMhfhciFgYiPhahajYappjpTplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYsasbscpfpfqloYoYoYsyoYoYoYoYoYoYsrszoYoYoYoYoYoYoYsrsroYsAoYsrsroYoYoYjYhagYiPhdhfhchcgFappjpkplplplplplqgpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYoYoYoYsBpfqloYsCsDsEsFsFoYsGoYsHsIsIsJsKoYsLsLsMtcsOsPtRsItsttsRsSsUoYgFhchdhfgZhagYgYgIappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYpfpfrMpfpfsVoYsEsEsEsEsEsWsEoYsXsIsIsIsYoYsZtatbtcsIsIsIsIsIsIsIsItdoYgIgYgZhahbhchdhdgKappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYsasbscqxtetfoYtgthsEtStioYtToYtjtktltmtnoYtUtUpftcsIsIsIsIsIsIsIsItVoYgKhdhbhchegYgZgZgGappjpTplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap -oYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYtWtWtptctXtqtYuatZubtvtwtxoYgGgJhZgLilgHgMgMgLappepepepepepepetypeapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpfpfpfpfpfpgoYoYoYoYoYoYoYpfoYoYrurtrvoYoYapapapapapapapapapapapapapapapapgFgGgHgIgJgKgLgLgIappepepepepepepepepeapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpfpfsNpnpoppoYsQtosTtotroYpfoYprpsptpupvoYapapapapapapapapapapapapapapapapgIgYgZhahbhchdhdgKappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpCoYoYoYoYoYoYtututututuoYpfoYpEpEpEpEpFoYapapapapapapapapapapapapapapapapgKhdpwpxpypzpAgZgGappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpfpItAtztBpMoYtCtEtDtEtFtGpfpNpEpEpEpEtHoYapapapapapapapapapapapapapapapapgGgZpypzpGpHpwhbgLappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpfpfpfpPpQpfoYoYoYoYoYoYoYoYoYpRpEpEpEpFoYapapapapapapapapapapapapapapapapgLhbpGpHpOpApyhegHappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpUpVpWpXpfpfoYpYpZpZqapZpZqboYqcpEpEpEqdoYapapqeqeqeqeqeapqfqfqfqfqfapapapgHhepOpApSpwpGhqgJappjpTpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpUqhqipXpfpfqjqkpfpfpfpfpfqloYqmpEpEpEpvoYapapqeqnqoqpqeapqfqqqrqsqfapapapgJhqpSpwpypypOhsgMappjpkpBpBpBpBpBqgpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYqtquqvqwpfpfqxqyqzqAqBqCqyqloYoYoYpNoYoYoYoYoYqeqDqoqpqeapqfqEqrqsqfapapapgMhspypypGpGpShwhZappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYqFqGqHqIpftIoYqJqKoYqLoYqMqNoYqTrgpqpqqPtJqQoYqeqRqotKqeapqfqSqrtLqfapapaphZhwpGpGpOpOpyheilappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpfpfpfpfpftMoYoYoYoYpfoYoYoYoYpqpqpqpqqUqUpqoYqeqRqotKqeapqfqSqrtLqfapapapilhepOpOpSpSpGhqitappjpTpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYqWqXqXqWpfqYoYqZrarbpfrcrdrerfrzpqpqrhrirjrkoYqeqRqoqpqeapqfqSqrqsqfapapapithqpSpSqVpypOhsixappjpkpBpBpBpBpBqgpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpfpfpfpfpfrmoYrnpfpfpfpfpfrorfrppqpqpqrqrqpqoYqerrqoqoqeapqfqrqrqrqfapapapixhsqVpyrlpGpShwhZappjpkpBpBpBpBpBpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYrstNtPtOjApMoYrxpfpfpfpfpfpfrypqpqpqpqpqpqrAoYqerBqorCqeapqfrDqrrEqfapapaphZhwiHigiRiriBiuilappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYoYoYoYoYoYoYoYrFpfpfpfpfpfrGoYrHpfpfpfpfqloYoYqerIrJrIqeapqfrKrLrKqfapapapiliuiFhsiPhwizizitappjpTplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpfpfrMqjrNrOoYrPrQrRrSrTrUrVoYrWpfpfpfpfqlrXoYqeqerYqeqeapqfqfrZqfqfapapapitiziPhwhfiuiFiFixappjpkplplplplplqgpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYsasbscpfpfsdoYoYoYseseseoYoYoYsfpfpfpfpfqloYoYoYoYsgoYoYoYoYoYshoYoYoYapapixiFhfiuhaiziPiPjtappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYoYoYoYsipfpfsjqjrNrNrNrNrNskslpfpfpfpfpfsmrNrNrNsnpfqjrNrNrNsopfpfspoYapapjtiPhaizhciFhfhfjMappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpfpfrMpftQsqsrssstpfqxsususvsrswstpfqxucsusususususususususususususxoYapapjMhfhciFgYiPhahajYappjpTplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYsasbscpfpfqloYoYoYsyoYoYoYoYoYoYsrszoYoYoYoYoYoYoYsrsroYsAoYsrsroYoYoYapapjYhagYiPhdhfhchcgFappjpkplplplplplqgpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYoYoYoYsBpfqloYsCsDsEsFsFoYsGoYsHsIsIsJsKoYsLsLsMtcsOsPtRsItsttsRsSsUoYapapgFhchdhfgZhagYgYgIappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYpfpfrMpfpfsVoYsEsEsEsEsEsWsEoYsXsIsIsIsYoYsZtatbtcsIsIsIsIsIsIsIsItdoYapapgIgYgZhahbhchdhdgKappjpkplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYsasbscqxtetfoYtgthsEtStioYtToYtjtktltmtnoYtUtUpftcsIsIsIsIsIsIsIsItVoYapapgKhdhbhchegYgZgZgGappjpTplplplplplpmpjapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap +oYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYtWtWtptctXtqtYuatZubtvtwtxoYapapgGgJhZgLilgHgMgMgLappepepepepepepetypeapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap apapapapapapapapapapapapapapapapapapapapapoYoYoYoYoYoYoYoYoYoYoYoYoYoYoYapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapapap "} diff --git a/maps/tether/tether-08-ships.dmm b/maps/tether/tether-08-ships.dmm index 60da6808958..fd41acbeda2 100644 --- a/maps/tether/tether-08-ships.dmm +++ b/maps/tether/tether-08-ships.dmm @@ -259,6 +259,7 @@ "eY" = (/obj/effect/floor_decal/techfloor,/obj/structure/table/steel_reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/turf/simulated/floor/tiled/techfloor,/area/houseboat/cargo) "eZ" = (/obj/effect/floor_decal/techfloor,/obj/structure/table/steel_reinforced,/obj/item/stack/material/plasteel,/obj/item/stack/material/plasteel,/turf/simulated/floor/tiled/techfloor,/area/houseboat/cargo) "fa" = (/obj/effect/floor_decal/techfloor{dir = 6},/obj/structure/table/steel_reinforced,/obj/item/stack/material/plastic,/obj/item/stack/material/plastic,/turf/simulated/floor/tiled/techfloor,/area/houseboat/cargo) +"fb" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/secure/briefcase/nsfw_pack,/turf/simulated/floor/tiled/techfloor,/area/houseboat/bridge) (1,1,1) = {" aaabababababaaabababababaaabababababaaabababababaaabababababaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac @@ -286,7 +287,7 @@ acacacacacacacacacacacacacacacacacacacacacacacblbnbobpbqbrbsblblacacacacacblbmbm acacacacacacacacacacacacacacacacacblbmbmbmbmbmblbtbubvbwbxbyblbnbmbmbmbnblbnbzbAbBbCbDacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacblblbEbFbGbHbIblbJbKbLbLbLbMblbNbObPbQbRbSbTbUbUbVbCbDacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacblblbnbmbmbmbmbmbmblblbWbXbXbXbYblbZcacbcccacdblcecfcgchblcicjckclcmbCbDacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac -acacacacacacblblcnblcocpcpcqcrcrcsblctcucvcwcxblblbRcyblblblblcecgcgczcAclclclcBbnblblacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac +acacacacacacblblfbblcocpcpcqcrcrcsblctcucvcwcxblblbRcyblblblblcecgcgczcAclclclcBbnblblacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacblblcCcDblcEcpcpcpcFcFcGblblbRcybRblblcHcIcJcIcKcLcMcNcgcgcOblcPcQcRcSblbCbDacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacaccTcUcVcVblcWcpcpcXcYcYcsblcZcZcZcZcZbldadbdcdddedfdgdhcgcgdiblblblblblbnbCbDacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacaccTdjdkdlbnblblcyblblblblbncZcZcZcZcZcAdmdbdndodpdpbRdqcgcgdrbldsdtdudvdwbCbDacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac @@ -382,3 +383,4 @@ acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac acacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacac "} + diff --git a/maps/tether/tether-09-empty-surface.dmm b/maps/tether/tether-09-empty-surface.dmm index d2e55ca15c9..23fb80590d5 100644 --- a/maps/tether/tether-09-empty-surface.dmm +++ b/maps/tether/tether-09-empty-surface.dmm @@ -123,3 +123,4 @@ abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbba aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/maps/tether/tether-10-empty-space.dmm b/maps/tether/tether-10-empty-space.dmm index 354e59c982d..0deec9205d4 100644 --- a/maps/tether/tether-10-empty-space.dmm +++ b/maps/tether/tether-10-empty-space.dmm @@ -122,3 +122,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} + diff --git a/maps/tether/tether.dm b/maps/tether/tether.dm index 6de1a83e9b1..7db16e4a4d9 100644 --- a/maps/tether/tether.dm +++ b/maps/tether/tether.dm @@ -6,6 +6,7 @@ #include "tether_phoronlock.dm" #include "tether_areas.dm" #include "tether_areas2.dm" + #include "tether_shuttle_defs.dm" #include "tether_shuttles.dm" #include "tether_telecomms.dm" #include "tether_virgo3b.dm" diff --git a/maps/tether/tether_shuttle_defs.dm b/maps/tether/tether_shuttle_defs.dm new file mode 100644 index 00000000000..b16eb49b857 --- /dev/null +++ b/maps/tether/tether_shuttle_defs.dm @@ -0,0 +1,159 @@ +////////////////////////////////////////////////////////////// +// Escape shuttle and pods +/datum/shuttle/ferry/emergency/escape + name = "Escape" + location = 1 // At offsite + warmup_time = 10 + area_offsite = /area/shuttle/escape/centcom + area_station = /area/shuttle/escape/station + area_transition = /area/shuttle/escape/transit + docking_controller_tag = "escape_shuttle" + dock_target_station = "escape_dock" + dock_target_offsite = "centcom_dock" + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +////////////////////////////////////////////////////////////// +/datum/shuttle/ferry/escape_pod/large_escape_pod1 + name = "Large Escape Pod 1" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/large_escape_pod1/station + area_offsite = /area/shuttle/large_escape_pod1/centcom + area_transition = /area/shuttle/large_escape_pod1/transit + docking_controller_tag = "large_escape_pod_1" + dock_target_station = "large_escape_pod_1_berth" + dock_target_offsite = "large_escape_pod_1_recovery" + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +////////////////////////////////////////////////////////////// +/datum/shuttle/ferry/escape_pod/large_escape_pod2 + name = "Large Escape Pod 2" + location = 0 + warmup_time = 0 + area_station = /area/shuttle/large_escape_pod2/station + area_offsite = /area/shuttle/large_escape_pod2/centcom + area_transition = /area/shuttle/large_escape_pod2/transit + docking_controller_tag = "large_escape_pod_2" + dock_target_station = "large_escape_pod_2_berth" + dock_target_offsite = "large_escape_pod_2_recovery" + move_time = SHUTTLE_TRANSIT_DURATION_RETURN + +////////////////////////////////////////////////////////////// +// Supply shuttle +/datum/shuttle/ferry/supply/cargo + name = "Supply" + location = 1 + warmup_time = 10 + area_offsite = /area/supply/dock + area_station = /area/supply/station + docking_controller_tag = "supply_shuttle" + dock_target_station = "cargo_bay" + flags = SHUTTLE_FLAGS_PROCESS|SHUTTLE_FLAGS_SUPPLY + +////////////////////////////////////////////////////////////// +// Trade Ship +/datum/shuttle/ferry/trade + name = "Trade" + location = 1 + warmup_time = 10 //want some warmup time so people can cancel. + area_offsite = /area/shuttle/trade/centcom + area_station = /area/shuttle/trade/station + docking_controller_tag = "trade_shuttle" + dock_target_station = "trade_shuttle_dock_airlock" + dock_target_offsite = "trade_shuttle_bay" + +////////////////////////////////////////////////////////////// +// Away Mission Shuttle +/datum/shuttle/multi_shuttle/awaymission + name = "AwayMission" + legit = TRUE + warmup_time = 8 + move_time = 60 + origin = /area/shuttle/awaymission/home + interim = /area/shuttle/awaymission/warp + start_location = "NSS Adephagia (AM)" + destinations = list( + "Old Engineering Base (AM)" = /area/shuttle/awaymission/oldengbase + ) + docking_controller_tag = "awaymission_shuttle" + destination_dock_targets = list( + "NSS Adephagia (AM)" = "d1a2_dock_airlock" + ) + announcer = "Automated Traffic Control" + //These seem backwards because they are written from the perspective of the merc and vox ships + departure_message = "Attention. The away mission vessel is approaching the colony." + arrival_message = "Attention. The away mission vessel is now leaving from the colony." + +/datum/shuttle/multi_shuttle/awaymission/New() + ..() + var/area/awaym_dest = locate(/area/shuttle/awaymission/away) + if(awaym_dest && awaym_dest.contents.len) // Otherwise this is an empty imaginary area + destinations["Unknown Location [rand(1000,9999)]"] = awaym_dest + +////////////////////////////////////////////////////////////// +// Tether Shuttle +/datum/shuttle/ferry/tether_backup/goodluckmcgee + name = "Tether Backup" + location = 1 // At offsite + warmup_time = 5 + move_time = 45 + area_offsite = /area/shuttle/tether/surface + area_station = /area/shuttle/tether/station + area_transition = /area/shuttle/tether/transit + crash_areas = list(/area/shuttle/tether/crash1, /area/shuttle/tether/crash2) + docking_controller_tag = "tether_shuttle" + dock_target_station = "tether_dock_airlock" + dock_target_offsite = "tether_pad_airlock" + +////////////////////////////////////////////////////////////// +// Antag Space "Proto Shuttle" Shuttle +/datum/shuttle/multi_shuttle/protoshuttle + name = "Proto" + warmup_time = 8 + move_time = 60 + origin = /area/shuttle/antag_space/base + interim = /area/shuttle/antag_space/transit + start_location = "Home Base" + destinations = list( + "Nearby" = /area/shuttle/antag_space/north, + "Docks" = /area/shuttle/antag_space/docks + ) + docking_controller_tag = "antag_space_shuttle" + destination_dock_targets = list("Home Base" = "antag_space_dock") + +////////////////////////////////////////////////////////////// +// Antag Surface "Land Crawler" Shuttle +/datum/shuttle/multi_shuttle/landcrawler + name = "Land Crawler" + warmup_time = 8 + move_time = 60 + origin = /area/shuttle/antag_ground/base + interim = /area/shuttle/antag_ground/transit + start_location = "Home Base" + destinations = list( + "Solar Array" = /area/shuttle/antag_ground/solars, + "Mining Outpost" = /area/shuttle/antag_ground/mining + ) + docking_controller_tag = "antag_ground_shuttle" + destination_dock_targets = list("Home Base" = "antag_ground_dock") + +////////////////////////////////////////////////////////////// +// RogueMiner "Belter: Shuttle +// TODO - Not implemented yet on new map +/* +/datum/shuttle/ferry/belter + name = "Belter" + location = 0 + warmup_time = 6 + move_time = 60 + area_station = /area/shuttle/belter/station + area_offsite = /area/shuttle/belter/belt/zone1 + area_transition = /area/shuttle/belter/transit + docking_controller_tag = "belter_docking" + dock_target_station = "belter_nodocking" //Fake tags to prevent the shuttle from opening doors. + dock_target_offsite = "belter_nodocking" + +/datum/shuttle/ferry/belter/New() + move_time = move_time + rand(10, 40) + ..() +*/ diff --git a/maps/tether/tether_shuttles.dm b/maps/tether/tether_shuttles.dm index 0328233a982..8bd433ab163 100644 --- a/maps/tether/tether_shuttles.dm +++ b/maps/tether/tether_shuttles.dm @@ -1,3 +1,7 @@ +//////////////////////////////////////// +// Tether custom shuttle implemnetations +//////////////////////////////////////// + /obj/machinery/computer/shuttle_control/tether_backup name = "tether backup shuttle control console" shuttle_tag = "Tether Backup" @@ -56,9 +60,18 @@ // /datum/shuttle/ferry/tether_backup crash_message = "Tether shuttle distress signal received. Shuttle location is approximately 200 meters from tether base." + category = /datum/shuttle/ferry/tether_backup // So shuttle_controller.dm doesn't try and instantiate this type as an acutal mapped in shuttle. var/list/engines = list() var/obj/machinery/computer/shuttle_control/tether_backup/computer +/datum/shuttle/ferry/tether_backup/New() + ..() + var/area/current_area = get_location_area(location) + for(var/obj/structure/shuttle/engine/propulsion/E in current_area) + engines += E + for(var/obj/machinery/computer/shuttle_control/tether_backup/comp in current_area) + computer = comp + /datum/shuttle/ferry/tether_backup/process_longjump(var/area/origin, var/area/intended_destination) var/failures = engines.len for(var/engine in engines) diff --git a/maps/tether/tether_things.dm b/maps/tether/tether_things.dm index 3c2cc0ad02b..85411a6f65a 100644 --- a/maps/tether/tether_things.dm +++ b/maps/tether/tether_things.dm @@ -127,7 +127,7 @@ /obj/machinery/smartfridge/chemistry/chemvator/down/Destroy() attached = null - ..() + return ..() /obj/machinery/smartfridge/chemistry/chemvator/down name = "\improper Smart Chemavator - Lower" @@ -307,7 +307,7 @@ var/global/list/latejoin_tram = list() desc = "Neutralizes toxins and provides a mild alangesic effect." icon_state = "pill2" -/obj/item/weapon/reagent_containers/pill/antitox/New() +/obj/item/weapon/reagent_containers/pill/airlock/New() ..() reagents.add_reagent("anti_toxin", 15) reagents.add_reagent("paracetamol", 5) diff --git a/maps/virgo/virgo-1.dmm b/maps/virgo/virgo-1.dmm index 80a0a1ccf04..77cc044fa76 100644 --- a/maps/virgo/virgo-1.dmm +++ b/maps/virgo/virgo-1.dmm @@ -1274,7 +1274,7 @@ "ayz" = (/turf/simulated/wall,/area/maintenance/pool) "ayA" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/pool) "ayB" = (/obj/structure/closet/crate,/obj/item/weapon/tank/emergency/oxygen/engi,/obj/item/weapon/tank/emergency/oxygen/double,/obj/effect/decal/cleanable/cobweb2,/obj/effect/landmark{name = "blobstart"},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/obj/random/maintenance/engineering,/obj/random/maintenance/engineering,/obj/random/maintenance/clean,/turf/simulated/floor/plating,/area/maintenance/pool) -"ayC" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/red/full,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(2)},/turf/simulated/floor/tiled/dark,/area/security/armoury) +"ayC" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/effect/floor_decal/corner/red/full,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/rubber,/obj/item/ammo_magazine/m9mmt/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/rubber,/obj/item/ammo_magazine/m45/rubber,/obj/machinery/door/window/brigdoor/northleft{name = "Ammo"; req_access = list(2)},/turf/simulated/floor/tiled/dark,/area/security/armoury) "ayD" = (/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/brigdoor/northright{name = "Ammo"},/obj/structure/table/rack,/obj/effect/floor_decal/corner/red/full{dir = 4},/obj/item/weapon/storage/box/flashshells,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/beanbags,/obj/item/weapon/storage/box/stunshells,/obj/item/weapon/storage/box/stunshells,/turf/simulated/floor/tiled/dark,/area/security/armoury) "ayE" = (/obj/machinery/camera/network/security{c_tag = "SEC - Secure Armory Fore"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/security/armoury) "ayF" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) @@ -1358,7 +1358,7 @@ "aAf" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/red{dir = 9},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/security/brig) "aAg" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/security/brig) "aAh" = (/obj/effect/floor_decal/corner/red,/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/tiled,/area/security/brig) -"aAi" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/machinery/door/window/brigdoor/eastright{name = "Spare Equipment"; req_access = list(3)},/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) +"aAi" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 1; health = 1e+006},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/machinery/door/window/brigdoor/eastright{name = "Spare Equipment"; req_access = list(3)},/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/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/obj/item/clothing/suit/armor/vest/alt,/turf/simulated/floor/tiled,/area/security/security_equiptment_storage) "aAj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/security/prison) "aAk" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/window/brigdoor/southleft{id = "Cell 1"; name = "Cell 1"; req_access = list(2)},/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/security/prison) "aAl" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "Secure Gate"; name = "Security Blast Door"; opacity = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/security/prison) @@ -1797,7 +1797,7 @@ "aIC" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/item/weapon/gun/energy/laser/practice,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/security/range) "aID" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/security/range) "aIE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/security/range) -"aIF" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/mc9mmt/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/obj/item/ammo_magazine/c45m/practice,/turf/simulated/floor/tiled,/area/security/range) +"aIF" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 4},/obj/item/ammo_magazine/m9mmt/practice,/obj/item/ammo_magazine/m9mmt/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/obj/item/ammo_magazine/m45/practice,/turf/simulated/floor/tiled,/area/security/range) "aIG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/security/lobby) "aIH" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/camera/network/security{c_tag = "SEC - Lobby"; dir = 4},/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/security/lobby) "aII" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/security/lobby) @@ -2493,7 +2493,7 @@ "aVW" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_two) "aVX" = (/obj/structure/extinguisher_cabinet{pixel_x = 25},/obj/machinery/atm{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two) "aVY" = (/turf/simulated/wall,/area/crew_quarters/coffee_shop) -"aVZ" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/machinery/door/window/brigdoor/northright{name = "Ammo"; req_access = list(3)},/obj/structure/window/reinforced{dir = 8},/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/tactical) +"aVZ" = (/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/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/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/machinery/door/window/brigdoor/northright{name = "Ammo"; req_access = list(3)},/obj/structure/window/reinforced{dir = 8},/obj/item/ammo_magazine/m9mmt,/obj/item/ammo_magazine/m9mmt,/obj/effect/floor_decal/industrial/outline/grey,/turf/simulated/floor/tiled/dark,/area/security/tactical) "aWa" = (/turf/simulated/wall,/area/ai_monitored/storage/emergency/eva) "aWb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/ai_monitored/storage/emergency/eva) "aWc" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/ai_monitored/storage/emergency/eva) @@ -3110,7 +3110,7 @@ "bhP" = (/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhQ" = (/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhR" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) -"bhS" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/weapon/gun/projectile/shotgun/pump/rifle/practice,/obj/item/weapon/gun/projectile/shotgun/pump/rifle/practice,/obj/item/ammo_magazine/clip/a762/practice,/obj/item/ammo_magazine/clip/a762/practice,/obj/item/ammo_magazine/clip/a762/practice,/obj/item/ammo_magazine/clip/a762/practice,/turf/simulated/floor/tiled,/area/security/range) +"bhS" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/target,/obj/item/weapon/gun/projectile/shotgun/pump/rifle/practice,/obj/item/weapon/gun/projectile/shotgun/pump/rifle/practice,/obj/item/ammo_magazine/clip/c762/practice,/obj/item/ammo_magazine/clip/c762/practice,/obj/item/ammo_magazine/clip/c762/practice,/obj/item/ammo_magazine/clip/c762/practice,/turf/simulated/floor/tiled,/area/security/range) "bhT" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/food/drinks/britcup,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/cable/green{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/random/medical,/obj/item/weapon/reagent_containers/food/drinks/britcup,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhU" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhV" = (/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{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},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) diff --git a/maps/virgo/virgo-2.dmm b/maps/virgo/virgo-2.dmm index f9b08bf922d..659333b29d6 100644 --- a/maps/virgo/virgo-2.dmm +++ b/maps/virgo/virgo-2.dmm @@ -918,7 +918,7 @@ "arH" = (/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 = "dark"},/area/centcom/specops) "arI" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/gun/energy/ionrifle,/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arJ" = (/obj/structure/window/reinforced{dir = 8},/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 = "dark"},/area/centcom/specops) -"arK" = (/obj/structure/table/rack,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/item/ammo_magazine/mc9mmt/rubber,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"arK" = (/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/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,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arL" = (/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{dir = 1},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arM" = (/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 = "dark"},/area/centcom/specops) "arN" = (/obj/machinery/vending/security,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -934,11 +934,11 @@ "arX" = (/obj/machinery/door/airlock/centcom,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "arY" = (/obj/machinery/embedded_controller/radio/simple_docking_controller{frequency = 1380; id_tag = "specops_shuttle_fore"; name = "forward docking hatch controller"; pixel_x = 0; pixel_y = -25; tag_door = "specops_shuttle_fore_hatch"},/turf/simulated/shuttle/floor{tag = "icon-floor_red"; icon_state = "floor_red"},/area/shuttle/specops/centcom) "arZ" = (/obj/structure/table/standard,/obj/item/stack/material/glass{amount = 15},/obj/item/weapon/cell{charge = 100; maxcharge = 15000},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) -"asa" = (/obj/structure/table/rack,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"asa" = (/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,/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "asb" = (/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) "asc" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/sniperrifle,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"asd" = (/obj/structure/table/rack,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/ammo_magazine/p90,/obj/item/weapon/gun/projectile/automatic/p90,/obj/item/weapon/gun/projectile/automatic/p90,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"ase" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/ammo_magazine/a556,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"asd" = (/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) +"ase" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m556,/obj/item/ammo_magazine/m556,/obj/item/ammo_magazine/m556,/obj/item/ammo_magazine/m556,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "asf" = (/obj/effect/wingrille_spawn/reinforced/crescent,/turf/unsimulated/floor{icon_state = "plating"; name = "plating"},/area/centcom/specops) "asg" = (/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) "ash" = (/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) @@ -964,7 +964,7 @@ "asB" = (/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 = "dark"},/area/centcom/specops) "asC" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 4},/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 = "dark"},/area/centcom/specops) "asD" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/gun/projectile/automatic/z8,/obj/item/weapon/gun/projectile/automatic/z8,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) -"asE" = (/obj/structure/table/rack,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/ammo_magazine/s762,/obj/item/ammo_magazine/s762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"asE" = (/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,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/ammo_magazine/m762,/obj/item/ammo_magazine/m762,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "asF" = (/obj/machinery/deployable/barrier,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "asG" = (/obj/structure/table/reinforced,/obj/item/device/pda/ert,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "asH" = (/obj/effect/floor_decal/corner/purple{dir = 9},/turf/unsimulated/floor{icon_state = "vault"; dir = 5},/area/centcom/specops) @@ -1022,7 +1022,7 @@ "atH" = (/obj/structure/table/rack,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/obj/item/weapon/melee/energy/sword/blue,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) "atI" = (/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) "atJ" = (/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) -"atK" = (/obj/structure/table/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/rubber,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m/flash,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/obj/item/ammo_magazine/c45m,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) +"atK" = (/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 = "dark"},/area/centcom/specops) "atL" = (/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 = "dark"},/area/centcom/specops) "atM" = (/obj/structure/table/reinforced,/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 = "dark"},/area/centcom/specops) "atN" = (/obj/structure/table/reinforced,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/obj/item/clothing/glasses/sunglasses/sechud/tactical,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/specops) @@ -1142,7 +1142,7 @@ "avX" = (/obj/structure/closet/secure_closet/medical_wall{pixel_x = -32; pixel_y = 0; req_access = list(150)},/obj/item/stack/medical/splint,/obj/item/stack/medical/ointment,/obj/item/stack/medical/ointment,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/stack/medical/bruise_pack,/obj/item/weapon/storage/belt/medical/emt,/obj/item/weapon/storage/belt/medical/emt,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "avY" = (/obj/structure/closet/hydrant{pixel_y = 32},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "avZ" = (/obj/structure/bed/chair{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) -"awa" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/ammo_magazine/mc9mm/flash,/obj/item/weapon/gun/projectile/pistol/flash,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) +"awa" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/security,/obj/item/weapon/storage/belt/security,/obj/item/ammo_magazine/m9mm/flash,/obj/item/weapon/gun/projectile/pistol/flash,/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "awb" = (/obj/structure/bed/chair{dir = 8},/obj/structure/bed/chair{dir = 8},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "awc" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "awd" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) @@ -1294,8 +1294,8 @@ "ayT" = (/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_mothership) "ayU" = (/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_mothership) "ayV" = (/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_mothership) -"ayW" = (/obj/structure/table/rack,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/obj/item/ammo_magazine/a10mm,/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_mothership) -"ayX" = (/obj/structure/table/rack,/obj/item/ammo_magazine/c556/ext,/obj/item/ammo_magazine/c556/ext,/obj/item/ammo_magazine/c556/ext,/obj/item/ammo_magazine/c556/ext,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) +"ayW" = (/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_mothership) +"ayX" = (/obj/structure/table/rack,/obj/item/ammo_magazine/m556/ext,/obj/item/ammo_magazine/m556/ext,/obj/item/ammo_magazine/m556/ext,/obj/item/ammo_magazine/m556/ext,/obj/item/weapon/gun/projectile/automatic/sts35,/obj/item/weapon/gun/projectile/automatic/sts35,/turf/unsimulated/floor{icon_state = "dark"},/area/syndicate_mothership) "ayY" = (/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) "ayZ" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) "aza" = (/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)},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor/darkred,/area/syndicate_station/start) diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index 845b362fc65..ad510960c59 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -187,5 +187,10 @@ var/list/all_maps = list() LIST_NUMERIC_SET(map.holomap_legend_y, z, holomap_legend_y) // VOREStation Edit End -/datum/map_z_level/Destroy() - return TRUE // No. +/datum/map_z_level/Destroy(var/force) + crash_with("Attempt to delete a map_z_level instance [log_info_line(src)]") + if(!force) + return QDEL_HINT_LETMELIVE // No. + if (using_map.zlevels["[z]"] == src) + using_map.zlevels -= "[z]" + return ..() diff --git a/nano/templates/communicator.tmpl b/nano/templates/communicator.tmpl index 58b86a30d7e..6157f45d614 100644 --- a/nano/templates/communicator.tmpl +++ b/nano/templates/communicator.tmpl @@ -152,7 +152,10 @@ Used In File(s): code\game\objects\items\devices\communicator\communicator.dm {{:value.name}}
-
{{:value.address}}
{{:helper.link('Copy', 'pencil', {'copy' : value.address, 'switch_tab' : 2})}} +
{{:value.address}}
+ {{:helper.link('Copy', 'pencil', {'copy' : value.address, 'switch_tab' : 2})}} + {{:helper.link('Call', 'phone', {'dial' : value.address, 'copy' : value.address, 'switch_tab' : 2})}} + {{:helper.link('Msg', 'mail-closed', {'copy' : value.address, 'copy_name' : value.name, 'switch_tab' : 40})}}
{{/for}} diff --git a/nano/templates/guest_pass.tmpl b/nano/templates/guest_pass.tmpl index 80525f5331e..821ba0a474b 100644 --- a/nano/templates/guest_pass.tmpl +++ b/nano/templates/guest_pass.tmpl @@ -19,7 +19,7 @@ {{else}}

Guest pass terminal #{{:data.uid}}

- {{:helper.link('View activity log', 'list', {'mode' : 1})}} {{:helper.link('Issure Pass', 'eject', {'action' : 'issue'})}} + {{:helper.link('View activity log', 'list', {'mode' : 1})}} {{:helper.link('Issue Pass', 'eject', {'action' : 'issue'})}}

diff --git a/sound/items/nif_click.ogg b/sound/items/nif_click.ogg new file mode 100644 index 00000000000..4bb8db9f30f Binary files /dev/null and b/sound/items/nif_click.ogg differ diff --git a/sound/items/nif_tone_bad.ogg b/sound/items/nif_tone_bad.ogg new file mode 100644 index 00000000000..d2c237acf3f Binary files /dev/null and b/sound/items/nif_tone_bad.ogg differ diff --git a/sound/items/nif_tone_good.ogg b/sound/items/nif_tone_good.ogg new file mode 100644 index 00000000000..e6365ba8db2 Binary files /dev/null and b/sound/items/nif_tone_good.ogg differ diff --git a/sound/machines/doorbell.ogg b/sound/machines/doorbell.ogg new file mode 100644 index 00000000000..fc4aaec628f Binary files /dev/null and b/sound/machines/doorbell.ogg differ diff --git a/tools/mapmergepy/1 Prepare Maps.bat b/tools/mapmergepy/1 Prepare Maps.bat new file mode 100644 index 00000000000..d878510e3b3 --- /dev/null +++ b/tools/mapmergepy/1 Prepare Maps.bat @@ -0,0 +1,12 @@ +@echo off +cd ../../maps/ + +for /R %%f in (*.dmm) do copy "%%f" "%%f.backup" + +cls +echo All dmm files in maps directories have been backed up +echo Now you can make your changes... +echo --- +echo Remember to run Run_Map_Merge.bat just before you commit your changes! +echo --- +pause diff --git a/tools/mapmergepy/2 Clean Maps.bat b/tools/mapmergepy/2 Clean Maps.bat new file mode 100644 index 00000000000..b651f5da712 --- /dev/null +++ b/tools/mapmergepy/2 Clean Maps.bat @@ -0,0 +1,4 @@ +@echo off +set MAPROOT="../../maps/" +python mapmerger.py %1 %MAPROOT% +pause \ No newline at end of file diff --git a/tools/mapmergepy/__pycache__/map_helpers.cpython-36.pyc b/tools/mapmergepy/__pycache__/map_helpers.cpython-36.pyc new file mode 100644 index 00000000000..3bee5f17afa Binary files /dev/null and b/tools/mapmergepy/__pycache__/map_helpers.cpython-36.pyc differ diff --git a/tools/mapmergepy/map_helpers.py b/tools/mapmergepy/map_helpers.py new file mode 100644 index 00000000000..ba6efd55d5a --- /dev/null +++ b/tools/mapmergepy/map_helpers.py @@ -0,0 +1,524 @@ +import collections + +maxx = 0 +maxy = 0 +key_length = 1 + +def reset_globals(): + global key_length + global maxx + global maxy + key_length = 1 + maxx = 0 + maxy = 0 + +def merge_map(newfile, backupfile, tgm): + reset_globals() + + shitmap = parse_map(newfile) + shitDict = shitmap["dictionary"] #key to tile data dictionary + shitGrid = shitmap["grid"] #x,y coords to tiles (keys) dictionary (the map's layout) + + originalmap = parse_map(backupfile) + originalDict = originalmap["dictionary"] + originalGrid = originalmap["grid"] + + mergeGrid = dict() #final map layout + known_keys = dict() #mapping known keys to original keys + tempGrid = dict() #saving tiles with newly generated keys for later processing + temp_keys = dict() #mapping known keys to newly generated keys + unused_keys = list(originalDict.keys()) #list with all existing keys that aren't being used + tempDict = collections.OrderedDict() #mapping new keys to new data + originalDict_size = len(originalDict) + + for y in range(1,maxy+1): + for x in range(1,maxx+1): + shitKey = shitGrid[x,y] + + #if this key was seen before, add it to the pile immediately + if shitKey in known_keys: + mergeGrid[x,y] = known_keys[shitKey] + continue + #if this key was seen before, add it to the pile immediately + if shitKey in temp_keys: + tempGrid[x,y] = temp_keys[shitKey] + continue + + shitData = shitDict[shitKey] + originalKey = originalGrid[x,y] + originalData = originalDict[originalKey] + + #if new tile data at x,y is the same as original tile data at x,y, add to the pile + if shitData == originalData: + mergeGrid[x,y] = originalKey + known_keys[shitKey] = originalKey + unused_keys.remove(originalKey) + else: + #search for the new tile data in the original dictionary, if a key is found add it to the pile, else generate a new key + newKey = search_key(originalDict, shitData) + if newKey != None: + try: + unused_keys.remove(newKey) + except ValueError: #caused by a duplicate entry + print("WARNING: Correcting duplicate dictionary entry. ({})".format(shitKey)) + mergeGrid[x,y] = newKey + known_keys[shitKey] = newKey + #if data at original x,y no longer exists we reuse the key immediately + elif search_key(shitDict, originalData) == None: + mergeGrid[x,y] = originalKey + originalDict[originalKey] = shitData + unused_keys.remove(originalKey) + known_keys[shitKey] = originalKey + else: + if len(tempDict) == 0: + newKey = generate_new_key(originalDict) + else: + newKey = generate_new_key(tempDict) + if newKey == "OVERFLOW": #if this happens, merging is impossible + print("ERROR: Key overflow detected.") + return 0 + tempGrid[x,y] = newKey + temp_keys[shitKey] = newKey + tempDict[newKey] = shitData + + sort = 0 + #find gaps in the dictionary keys sequence and add the missing keys to be recycled + dict_list = list(originalDict.keys()) + for index in range(0, len(dict_list)): + if index + 1 == len(dict_list): + break + + key = dict_list[index] + next_key = dict_list[index+1] + + difference = key_difference(key, next_key) + if difference > 1: + i = 1 + nextnew = key + while i < difference: + nextnew = get_next_key(nextnew) + unused_keys.append(nextnew) + i += 1 + sort = 1 + + + #Recycle outdated keys with any new tile data, starting from the bottom of the dictionary + i = 0 + for key, value in reversed(tempDict.items()): + recycled_key = key + if len(unused_keys) > 0: + recycled_key = unused_keys.pop() + + for coord, gridkey in tempGrid.items(): + if gridkey == None: + continue + if gridkey == key: + mergeGrid[coord] = recycled_key + tempGrid[coord] = None + + originalDict[recycled_key] = value + + #if gaps in the key sequence were found, sort the dictionary for cleanliness + if sort == 1: + sorted_dict = collections.OrderedDict() + next_key = get_next_key("") + while len(sorted_dict) < len(originalDict): + try: + sorted_dict[next_key] = originalDict[next_key] + except KeyError: + pass + next_key = get_next_key(next_key) + originalDict = sorted_dict + + if tgm: + with open(newfile, "w") as output: + write_dictionary_tgm(output, originalDict) + write_grid_coord_small(output, mergeGrid) + else: + with open(newfile, "wt", encoding='cp1252', newline='\n') as output: + write_dictionary_dmm(output, originalDict) + write_grid_dmm(output, mergeGrid) + return 1 + +#write dictionary in tgm format +def write_dictionary_tgm(output, dictionary): + output.write("//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE \n") + for key, list_ in dictionary.items(): + output.write("\"{}\" = (\n".format(key)) + + for thing in list_: + buffer = "" + in_quote_block = False + in_varedit_block = False + for char in thing: + + if in_quote_block: + if char == "\"": + in_quote_block = False + buffer = buffer + char + continue + elif char == "\"": + in_quote_block = True + buffer = buffer + char + continue + + if not in_varedit_block: + if char == "{": + in_varedit_block = True + buffer = buffer + "{\n\t" + continue + else: + if char == ";": + buffer = buffer + ";\n\t" + continue + elif char == "}": + buffer = buffer + "\n\t}" + in_varedit_block = False + continue + + buffer = buffer + char + + if list_.index(thing) != len(list_) - 1: + buffer = buffer + ",\n" + output.write(buffer) + + output.write(")\n") + +#thanks to YotaXP for finding out about this one +def write_grid_coord_small(output, grid): + output.write("\n") + + for x in range(1, maxx+1): + output.write("({},{},1) = {{\"\n".format(x, 1, 1)) + for y in range(1, maxy): + output.write("{}\n".format(grid[x,y])) + output.write("{}\n\"}}\n".format(grid[x,maxy])) + +def search_key(dictionary, data): + for key, value in dictionary.items(): + if value == data: + return key + return None + +def generate_new_key(dictionary): + last_key = next(reversed(dictionary)) + return get_next_key(last_key) + +def get_next_key(key): + if key == "": + return "".join("a" for _ in range(key_length)) + + length = len(key) + new_key = "" + carry = 1 + for char in key[::-1]: + if carry <= 0: + new_key = new_key + char + continue + if char == 'Z': + new_key = new_key + 'a' + carry += 1 + length -= 1 + if length <= 0: + return "OVERFLOW" + elif char == 'z': + new_key = new_key + 'A' + else: + new_key = new_key + chr(ord(char) + 1) + if carry > 0: + carry -= 1 + return new_key[::-1] + +#still does not support more than one z level per file, but should parse any format +def parse_map(map_file): + with open(map_file, "r") as map_input: + characters = map_input.read() + + in_quote_block = False + in_key_block = False + in_data_block = False + in_varedit_block = False + after_data_block = False + escaping = False + skip_whitespace = False + + dictionary = collections.OrderedDict() + curr_key = "" + curr_datum = "" + curr_data = list() + + in_map_block = False + in_coord_block = False + in_map_string = False + iter_x = 0 + adjust_y = True + + curr_num = "" + reading_coord = "x" + + global key_length + global maxx + global maxy + curr_x = 0 + curr_y = 0 + curr_z = 1 + grid = dict() + + for char in characters: + + if not in_map_block: + + if char == "\n" or char == "\t": + continue + + if in_data_block: + + if in_varedit_block: + + if in_quote_block: + if char == "\\": + curr_datum = curr_datum + char + escaping = True + continue + + if escaping: + curr_datum = curr_datum + char + escaping = False + continue + + if char == "\"": + curr_datum = curr_datum + char + in_quote_block = False + continue + + curr_datum = curr_datum + char + continue + + if skip_whitespace and char == " ": + skip_whitespace = False + continue + skip_whitespace = False + + if char == "\"": + curr_datum = curr_datum + char + in_quote_block = True + continue + + if char == ";": + skip_whitespace = False + curr_datum = curr_datum + char + continue + + if char == "}": + curr_datum = curr_datum + char + in_varedit_block = False + continue + + curr_datum = curr_datum + char + continue + + if char == "{": + curr_datum = curr_datum + char + in_varedit_block = True + continue + + if char == ",": + curr_data.append(curr_datum) + curr_datum = "" + continue + + if char == ")": + curr_data.append(curr_datum) + dictionary[curr_key] = tuple(curr_data) + curr_data = list() + curr_datum = "" + curr_key = "" + in_data_block = False + after_data_block = True + continue + + curr_datum = curr_datum + char + continue + + if in_key_block: + if char == "\"": + in_key_block = False + key_length = len(curr_key) + else: + curr_key = curr_key + char + continue + #else we're looking for a key block, a data block or the map block + + if char == "\"": + in_key_block = True + after_data_block = False + continue + + if char == "(": + if after_data_block: + in_map_block = True + in_coord_block = True + after_data_block = False + curr_key = "" + continue + else: + in_data_block = True + after_data_block = False + continue + + else: + + if in_coord_block: + if char == ",": + if reading_coord == "x": + curr_x = string_to_num(curr_num) + if curr_x > maxx: + maxx = curr_x + iter_x = 0 + curr_num = "" + reading_coord = "y" + elif reading_coord == "y": + curr_y = string_to_num(curr_num) + if curr_y > maxy: + maxy = curr_y + curr_num = "" + reading_coord = "z" + else: + pass + continue + + if char == ")": + in_coord_block = False + reading_coord = "x" + curr_num = "" + #read z here if needed + continue + + curr_num = curr_num + char + continue + + if in_map_string: + + if char == "\"": + in_map_string = False + adjust_y = True + curr_y -= 1 + continue + + if char == "\n": + if adjust_y: + adjust_y = False + else: + curr_y += 1 + if curr_x > maxx: + maxx = curr_x + if iter_x > 1: + curr_x = 1 + iter_x = 0 + continue + + + curr_key = curr_key + char + if len(curr_key) == key_length: + iter_x += 1 + if iter_x > 1: + curr_x += 1 + + grid[curr_x, curr_y] = curr_key + curr_key = "" + continue + + + #else look for coordinate block or a map string + + if char == "(": + in_coord_block = True + continue + if char == "\"": + in_map_string = True + continue + + if curr_y > maxy: + maxy = curr_y + + data = dict() + data["dictionary"] = dictionary + data["grid"] = grid + return data + +#subtract keyB from keyA +def key_difference(keyA, keyB): + if len(keyA) != len(keyB): + return "you fucked up" + + Ayek = keyA[::-1] + Byek = keyB[::-1] + + result = 0 + for i in range(0, len(keyA)): + base = 52**i + A = 26 if Ayek[i].isupper() else 0 + B = 26 if Byek[i].isupper() else 0 + result += ( (ord(Byek[i].lower()) + B) - (ord(Ayek[i].lower()) + A) ) * base + return result + +def string_to_num(s): + try: + return int(s) + except ValueError: + return -1 + +#writes a tile data dictionary the same way Dreammaker does +def write_dictionary_dmm(output, dictionary): + for key, value in dictionary.items(): + output.write("\"{}\" = ({})\n".format(key, ",".join(value))) + +#writes a map grid the same way Dreammaker does +def write_grid_dmm(output, grid): + output.write("\n") + output.write("(1,1,1) = {\"\n") + + for y in range(1, maxy+1): + for x in range(1, maxx+1): + try: + output.write(grid[x,y]) + except KeyError: + print("Key error: ({},{})".format(x,y)) + output.write("\n") + output.write("\"}") + output.write("\n") + +#inflated map grid; unused +def write_grid_coord(filename, grid): + with open(filename, "a") as output: + output.write("\n") + for y in range(1, maxy+1): + for x in range(1, maxx+1): + output.write("({},{},1) = {{\"{}\"}}\n".format(x, y, grid[x,y])) + +def key_compare(keyA, keyB): #thanks byond for not respecting ascii + pos = 0 + for a in keyA: + pos += 1 + count = pos + for b in keyB: + if(count > 1): + count -= 1 + continue + if a.islower() and b.islower(): + if(a < b): + return -1 + if(a > b): + return 1 + break + if a.islower() and b.isupper(): + return -1 + if a.isupper() and b.islower(): + return 1 + if a.isupper() and b.isupper(): + if(a < b): + return -1 + if(a > b): + return 1 + break + return 0 diff --git a/tools/mapmergepy/mapmerger.py b/tools/mapmergepy/mapmerger.py new file mode 100644 index 00000000000..0a177eb07ac --- /dev/null +++ b/tools/mapmergepy/mapmerger.py @@ -0,0 +1,81 @@ +#!/usr/bin/python3 + +import sys +import os +import pathlib +import map_helpers +import shutil + +def main(map_folder): + list_of_files = list() + for root, directories, filenames in os.walk(map_folder): + for filename in [f for f in filenames if f.endswith(".dmm")]: + list_of_files.append(pathlib.Path(root, filename)) + + last_dir = "" + for i in range(0, len(list_of_files)): + this_dir = list_of_files[i].parent + if last_dir != this_dir: + print("--------------------------------") + last_dir = this_dir + print("[{}]: {}".format(i, str(list_of_files[i])[len(map_folder):])) + + print("--------------------------------") + in_list = input("List the maps you want to merge (example: 1,3-5,12):\n") + in_list = in_list.replace(" ", "") + in_list = in_list.split(",") + + valid_indices = list() + for m in in_list: + index_range = m.split("-") + if len(index_range) == 1: + index = string_to_num(index_range[0]) + if index >= 0 and index < len(list_of_files): + valid_indices.append(index) + elif len(index_range) == 2: + index0 = string_to_num(index_range[0]) + index1 = string_to_num(index_range[1]) + if index0 >= 0 and index0 <= index1 and index1 < len(list_of_files): + valid_indices.extend(range(index0, index1 + 1)) + +# if tgm == "1": +# print("\nMaps will be converted to tgm.") +# tgm = True +# else: +# print("\nMaps will not be converted to tgm.") +# tgm = False + tgm = False + + print("\nMerging these maps:") + for i in valid_indices: + print(str(list_of_files[i])[len(map_folder):]) + merge = input("\nPress Enter to merge...") + if merge == "abort": + print("\nAborted map merge.") + sys.exit() + else: + for i in valid_indices: + path_str = str(list_of_files[i]) + shutil.copyfile(path_str, path_str + ".before") + path_str_pretty = path_str[len(map_folder):] + try: + if map_helpers.merge_map(path_str, path_str + ".backup", tgm) != 1: + print("ERROR MERGING: {}".format(path_str_pretty)) + os.remove(path_str + ".before") + continue + print("MERGED: {}".format(path_str_pretty)) + except FileNotFoundError: + print("\nERROR: File not found! Make sure you run 'Prepare Maps.bat' before merging.") + print(path_str_pretty + " || " + path_str_pretty + ".backup") + + print("\nFinished merging.") + print("\nNOTICE: A version of the map files from before merging have been created for debug purposes.\nDo not delete these files until it is sure your map edits have no undesirable changes.") + +def string_to_num(s): + try: + return int(s) + except ValueError: + return -1 + +if __name__ == "__main__": + main(sys.argv[1]) diff --git a/tools/mapmergepy/prepare_maps.sh b/tools/mapmergepy/prepare_maps.sh new file mode 100644 index 00000000000..f1ea86ce450 --- /dev/null +++ b/tools/mapmergepy/prepare_maps.sh @@ -0,0 +1,2 @@ +#!/bin/bash +find ../../maps | grep \.dmm$ | xargs -l1 -I{} cp {} {}.backup \ No newline at end of file diff --git a/vorestation.dme b/vorestation.dme index 3b28ef75d1e..abd0b5fe553 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -35,17 +35,23 @@ #include "code\__defines\lighting.dm" #include "code\__defines\machinery.dm" #include "code\__defines\map.dm" +#include "code\__defines\math.dm" #include "code\__defines\math_physics.dm" +#include "code\__defines\MC.dm" #include "code\__defines\misc.dm" #include "code\__defines\misc_vr.dm" #include "code\__defines\mobs.dm" +#include "code\__defines\nifsoft.dm" #include "code\__defines\planets.dm" #include "code\__defines\process_scheduler.dm" +#include "code\__defines\qdel.dm" #include "code\__defines\research.dm" #include "code\__defines\roguemining_vr.dm" #include "code\__defines\species_languages.dm" #include "code\__defines\species_languages_vr.dm" +#include "code\__defines\subsystems.dm" #include "code\__defines\targeting.dm" +#include "code\__defines\tick.dm" #include "code\__defines\turfs.dm" #include "code\__defines\unit_tests.dm" #include "code\__defines\xenoarcheaology.dm" @@ -64,6 +70,7 @@ #include "code\_helpers\icons_vr.dm" #include "code\_helpers\lists.dm" #include "code\_helpers\logging.dm" +#include "code\_helpers\logging_vr.dm" #include "code\_helpers\maths.dm" #include "code\_helpers\matrices.dm" #include "code\_helpers\mobs.dm" @@ -78,6 +85,9 @@ #include "code\_helpers\type2type_vr.dm" #include "code\_helpers\unsorted.dm" #include "code\_helpers\vector.dm" +#include "code\_helpers\sorts\__main.dm" +#include "code\_helpers\sorts\comparators.dm" +#include "code\_helpers\sorts\TimSort.dm" #include "code\_onclick\_defines.dm" #include "code\_onclick\adjacent.dm" #include "code\_onclick\ai.dm" @@ -142,12 +152,15 @@ #include "code\controllers\communications.dm" #include "code\controllers\configuration.dm" #include "code\controllers\configuration_vr.dm" +#include "code\controllers\controller.dm" #include "code\controllers\emergency_shuttle_controller.dm" +#include "code\controllers\failsafe.dm" #include "code\controllers\hooks-defs.dm" #include "code\controllers\hooks.dm" +#include "code\controllers\master.dm" #include "code\controllers\master_controller.dm" -#include "code\controllers\shuttle_controller_vr.dm" -#include "code\controllers\subsystems.dm" +#include "code\controllers\shuttle_controller.dm" +#include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" #include "code\controllers\voting.dm" #include "code\controllers\observer_listener\atom\observer.dm" @@ -157,14 +170,12 @@ #include "code\controllers\Processes\emergencyShuttle.dm" #include "code\controllers\Processes\event.dm" #include "code\controllers\Processes\game_master.dm" -#include "code\controllers\Processes\garbage.dm" #include "code\controllers\Processes\inactivity.dm" -#include "code\controllers\Processes\lighting.dm" #include "code\controllers\Processes\machinery.dm" -#include "code\controllers\Processes\mob.dm" #include "code\controllers\Processes\nanoui.dm" #include "code\controllers\Processes\obj.dm" #include "code\controllers\Processes\planet.dm" +#include "code\controllers\Processes\radiation.dm" #include "code\controllers\Processes\scheduler.dm" #include "code\controllers\Processes\Shuttle.dm" #include "code\controllers\Processes\sun.dm" @@ -174,6 +185,10 @@ #include "code\controllers\Processes\vote.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" +#include "code\controllers\subsystems\garbage.dm" +#include "code\controllers\subsystems\mobs.dm" +#include "code\controllers\subsystems\lighting.dm" +#include "code\controllers\subsystems\transcore_vr.dm" #include "code\datums\ai_law_sets.dm" #include "code\datums\ai_laws.dm" #include "code\datums\browser.dm" @@ -231,6 +246,7 @@ #include "code\datums\repositories\cameras.dm" #include "code\datums\repositories\crew.dm" #include "code\datums\repositories\decls.dm" +#include "code\datums\repositories\radiation.dm" #include "code\datums\repositories\repository.dm" #include "code\datums\supplypacks\atmospherics.dm" #include "code\datums\supplypacks\contraband.dm" @@ -565,6 +581,7 @@ #include "code\game\machinery\cryopod_vr.dm" #include "code\game\machinery\deployable.dm" #include "code\game\machinery\door_control.dm" +#include "code\game\machinery\doorbell_vr.dm" #include "code\game\machinery\doppler_array.dm" #include "code\game\machinery\exonet_node.dm" #include "code\game\machinery\flasher.dm" @@ -819,6 +836,7 @@ #include "code\game\objects\items\devices\flash_vr.dm" #include "code\game\objects\items\devices\flashlight.dm" #include "code\game\objects\items\devices\floor_painter.dm" +#include "code\game\objects\items\devices\geiger.dm" #include "code\game\objects\items\devices\hacktool.dm" #include "code\game\objects\items\devices\lightreplacer.dm" #include "code\game\objects\items\devices\locker_painter.dm" @@ -829,6 +847,7 @@ #include "code\game\objects\items\devices\pipe_painter.dm" #include "code\game\objects\items\devices\powersink.dm" #include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\scanners_vr.dm" #include "code\game\objects\items\devices\spy_bug.dm" #include "code\game\objects\items\devices\suit_cooling.dm" #include "code\game\objects\items\devices\t_scanner.dm" @@ -1025,6 +1044,7 @@ #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\target_stake.dm" #include "code\game\objects\structures\transit_tubes.dm" +#include "code\game\objects\structures\trash_pile.dm" #include "code\game\objects\structures\under_wardrobe.dm" #include "code\game\objects\structures\watercloset.dm" #include "code\game\objects\structures\windoor_assembly.dm" @@ -1186,6 +1206,7 @@ #include "code\modules\admin\verbs\custom_event.dm" #include "code\modules\admin\verbs\deadsay.dm" #include "code\modules\admin\verbs\debug.dm" +#include "code\modules\admin\verbs\debug_vr.dm" #include "code\modules\admin\verbs\diagnostics.dm" #include "code\modules\admin\verbs\dice.dm" #include "code\modules\admin\verbs\getlogs.dm" @@ -1298,6 +1319,8 @@ #include "code\modules\client\preference_setup\vore\04_resleeving.dm" #include "code\modules\client\preference_setup\vore\05_persistence.dm" #include "code\modules\client\preference_setup\vore\06_vantag.dm" +#include "code\modules\client\preference_setup\vore\07_traits.dm" +#include "code\modules\client\preference_setup\vore\08_nif.dm" #include "code\modules\clothing\chameleon.dm" #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\clothing_accessories.dm" @@ -1645,6 +1668,7 @@ #include "code\modules\mob\typing_indicator.dm" #include "code\modules\mob\update_icons.dm" #include "code\modules\mob\dead\death.dm" +#include "code\modules\mob\dead\observer\free_vr.dm" #include "code\modules\mob\dead\observer\login.dm" #include "code\modules\mob\dead\observer\logout.dm" #include "code\modules\mob\dead\observer\observer.dm" @@ -1764,6 +1788,7 @@ #include "code\modules\mob\living\carbon\human\species\species_vr.dm" #include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm" #include "code\modules\mob\living\carbon\human\species\outsider\vox.dm" +#include "code\modules\mob\living\carbon\human\species\station\blank_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\golem.dm" #include "code\modules\mob\living\carbon\human\species\station\monkey.dm" #include "code\modules\mob\living\carbon\human\species\station\monkey_vr.dm" @@ -1774,6 +1799,10 @@ #include "code\modules\mob\living\carbon\human\species\station\station_special_abilities_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\station_special_vr.dm" #include "code\modules\mob\living\carbon\human\species\station\station_vr.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\negative.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\neutral.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\positive.dm" +#include "code\modules\mob\living\carbon\human\species\station\traits_vr\trait.dm" #include "code\modules\mob\living\carbon\metroid\death.dm" #include "code\modules\mob\living\carbon\metroid\emote.dm" #include "code\modules\mob\living\carbon\metroid\examine.dm" @@ -1953,6 +1982,16 @@ #include "code\modules\nano\modules\nano_module.dm" #include "code\modules\nano\modules\power_monitor.dm" #include "code\modules\nano\modules\rcon.dm" +#include "code\modules\nifsoft\nif.dm" +#include "code\modules\nifsoft\nif_softshop.dm" +#include "code\modules\nifsoft\nif_statpanel.dm" +#include "code\modules\nifsoft\nifsoft.dm" +#include "code\modules\nifsoft\software\01_vision.dm" +#include "code\modules\nifsoft\software\05_health.dm" +#include "code\modules\nifsoft\software\10_combat.dm" +#include "code\modules\nifsoft\software\13_soulcatcher.dm" +#include "code\modules\nifsoft\software\14_commlink.dm" +#include "code\modules\nifsoft\software\15_misc.dm" #include "code\modules\organs\blood.dm" #include "code\modules\organs\misc.dm" #include "code\modules\organs\organ.dm" @@ -2054,8 +2093,8 @@ #include "code\modules\projectiles\effects.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\boxes.dm" -#include "code\modules\projectiles\ammunition\bullets.dm" +#include "code\modules\projectiles\ammunition\magazines.dm" +#include "code\modules\projectiles\ammunition\rounds.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\launcher.dm" #include "code\modules\projectiles\guns\projectile.dm" @@ -2196,13 +2235,12 @@ #include "code\modules\research\rdmachines.dm" #include "code\modules\research\research.dm" #include "code\modules\research\server.dm" -#include "code\modules\resleeving\_defines.dm" #include "code\modules\resleeving\circuitboards.dm" #include "code\modules\resleeving\computers.dm" #include "code\modules\resleeving\designer.dm" #include "code\modules\resleeving\documents.dm" #include "code\modules\resleeving\implant.dm" -#include "code\modules\resleeving\infocore.dm" +#include "code\modules\resleeving\infocore_records.dm" #include "code\modules\resleeving\infomorph.dm" #include "code\modules\resleeving\infomorph_software.dm" #include "code\modules\resleeving\machines.dm" @@ -2244,6 +2282,7 @@ #include "code\modules\shieldgen\shield_diffuser.dm" #include "code\modules\shieldgen\shield_gen.dm" #include "code\modules\shieldgen\shield_gen_external.dm" +#include "code\modules\shuttles\_defines.dm" #include "code\modules\shuttles\antagonist.dm" #include "code\modules\shuttles\crashes.dm" #include "code\modules\shuttles\departmental.dm" @@ -2364,12 +2403,19 @@ #include "code\modules\vore\fluffstuff\custom_items_vr.dm" #include "code\modules\vore\fluffstuff\custom_mecha_vr.dm" #include "code\modules\vore\fluffstuff\custom_permits_vr.dm" +#include "code\modules\vore\fluffstuff\guns\bsharpoon.dm" +#include "code\modules\vore\fluffstuff\guns\dominator.dm" +#include "code\modules\vore\fluffstuff\guns\nsfw.dm" +#include "code\modules\vore\fluffstuff\guns\protector.dm" +#include "code\modules\vore\fluffstuff\guns\pummeler.dm" +#include "code\modules\vore\fluffstuff\guns\sickshot.dm" #include "code\modules\vore\persist\persist_vr.dm" #include "code\modules\vore\resizing\grav_pull_vr.dm" #include "code\modules\vore\resizing\holder_micro_vr.dm" #include "code\modules\vore\resizing\resize_vr.dm" #include "code\modules\vore\resizing\sizegun_vr.dm" #include "code\modules\vore\weight\fitness_machines_vr.dm" +#include "code\modules\xenoarcheaology\anomaly_container.dm" #include "code\modules\xenoarcheaology\boulder.dm" #include "code\modules\xenoarcheaology\effect.dm" #include "code\modules\xenoarcheaology\manuals.dm" @@ -2452,6 +2498,8 @@ #include "code\unit_tests\mob_tests.dm" #include "code\unit_tests\research_tests.dm" #include "code\unit_tests\unit_test.dm" +#include "code\unit_tests\unit_test_vr.dm" +#include "code\unit_tests\vore_tests_vr.dm" #include "code\unit_tests\zas_tests.dm" #include "code\unit_tests\integrated_circuits\arithmetic.dm" #include "code\unit_tests\integrated_circuits\circuits.dm"