diff --git a/btime.dll b/btime.dll deleted file mode 100644 index af6c82a9986..00000000000 Binary files a/btime.dll and /dev/null differ diff --git a/btime.so b/btime.so deleted file mode 100644 index edb3cc3113f..00000000000 Binary files a/btime.so and /dev/null differ diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm index 11777e51d28..faefa64883d 100644 --- a/code/ATMOSPHERICS/components/unary/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm @@ -24,7 +24,6 @@ /obj/machinery/atmospherics/unary/freezer/New() ..() initialize_directions = dir - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/capacitor(src) diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm index 8ee96006064..c2daa2b6d1a 100644 --- a/code/ATMOSPHERICS/components/unary/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary/heat_source.dm @@ -24,7 +24,6 @@ /obj/machinery/atmospherics/unary/heater/New() ..() initialize_directions = dir - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/capacitor(src) diff --git a/code/__defines/btime.dm b/code/__defines/btime.dm deleted file mode 100644 index d4cefc35241..00000000000 --- a/code/__defines/btime.dm +++ /dev/null @@ -1,18 +0,0 @@ -// Comment this out if the external btime library is unavailable -#define PRECISE_TIMER_AVAILABLE - -#ifdef PRECISE_TIMER_AVAILABLE -var/global/__btime__libName = "btime.[world.system_type==MS_WINDOWS?"dll":"so"]" -#define TimeOfHour (__extern__timeofhour) -#define __extern__timeofhour text2num(call(__btime__libName, "gettime")()) -/hook/startup/proc/checkbtime() - try - // This will always return 1 unless the btime library cannot be accessed - if(TimeOfHour || 1) return 1 - catch(var/exception/e) - log_to_dd("PRECISE_TIMER_AVAILABLE is defined in btime.dm, but calling the btime library failed: [e]") - log_to_dd("This is a fatal error. The world will now shut down.") - del(world) -#else -#define TimeOfHour (world.timeofday % 36000) -#endif \ No newline at end of file diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index cc77b8c3c59..8c999f6d96f 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -48,6 +48,7 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called #define NETWORK_ROBOTS "Robots" #define NETWORK_PRISON "Prison" #define NETWORK_SECURITY "Security" +#define NETWORK_INTERROGATION "Interrogation" #define NETWORK_TELECOM "Tcomsat" #define NETWORK_THUNDER "Thunderdome" #define NETWORK_COMMUNICATORS "Communicators" diff --git a/code/__defines/math_physics.dm b/code/__defines/math_physics.dm index 198f87eccc2..da1c2aebd1b 100644 --- a/code/__defines/math_physics.dm +++ b/code/__defines/math_physics.dm @@ -26,4 +26,7 @@ #define INFINITY 1.#INF #define TICKS_IN_DAY 24*60*60*10 -#define TICKS_IN_SECOND 10 \ No newline at end of file +#define TICKS_IN_SECOND 10 + +#define SIMPLE_SIGN(X) ((X) < 0 ? -1 : 1) +#define SIGN(X) ((X) ? SIMPLE_SIGN(X) : 0) diff --git a/code/__defines/process_scheduler.dm b/code/__defines/process_scheduler.dm index 76449b9a4b5..d9c8f106efc 100644 --- a/code/__defines/process_scheduler.dm +++ b/code/__defines/process_scheduler.dm @@ -11,10 +11,9 @@ #define PROCESS_DEFAULT_HANG_ALERT_TIME 600 // 60 seconds #define PROCESS_DEFAULT_HANG_RESTART_TIME 900 // 90 seconds #define PROCESS_DEFAULT_SCHEDULE_INTERVAL 50 // 50 ticks -#define PROCESS_DEFAULT_SLEEP_INTERVAL 8 // 2 ticks -#define PROCESS_DEFAULT_CPU_THRESHOLD 90 // 90% +#define PROCESS_DEFAULT_SLEEP_INTERVAL 8 // 1/8th of a tick // SCHECK macros // This references src directly to work around a weird bug with try/catch #define SCHECK_EVERY(this_many_calls) if(++src.calls_since_last_scheck >= this_many_calls) sleepCheck() -#define SCHECK SCHECK_EVERY(50) \ No newline at end of file +#define SCHECK sleepCheck() diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 143c7aa251f..c1aaed9e42e 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -24,8 +24,7 @@ // Languages. #define LANGUAGE_SOL_COMMON "Sol Common" #define LANGUAGE_UNATHI "Sinta'unathi" -#define LANGUAGE_SIIK_MAAS "Siik'maas" -#define LANGUAGE_SIIK_TAJR "Siik'tajr" +#define LANGUAGE_SIIK "Siik" #define LANGUAGE_SKRELLIAN "Skrellian" #define LANGUAGE_ROOTSPEAK "Rootspeak" #define LANGUAGE_TRADEBAND "Tradeband" diff --git a/code/__defines/xenoarcheaology.dm b/code/__defines/xenoarcheaology.dm new file mode 100644 index 00000000000..b6af0d06816 --- /dev/null +++ b/code/__defines/xenoarcheaology.dm @@ -0,0 +1,72 @@ +#define ARCHAEO_BOWL 1 +#define ARCHAEO_URN 2 +#define ARCHAEO_CUTLERY 3 +#define ARCHAEO_STATUETTE 4 +#define ARCHAEO_INSTRUMENT 5 +#define ARCHAEO_KNIFE 6 +#define ARCHAEO_COIN 7 +#define ARCHAEO_HANDCUFFS 8 +#define ARCHAEO_BEARTRAP 9 +#define ARCHAEO_LIGHTER 10 +#define ARCHAEO_BOX 11 +#define ARCHAEO_GASTANK 12 +#define ARCHAEO_TOOL 13 +#define ARCHAEO_METAL 14 +#define ARCHAEO_PEN 15 +#define ARCHAEO_CRYSTAL 16 +#define ARCHAEO_CULTBLADE 17 +#define ARCHAEO_TELEBEACON 18 +#define ARCHAEO_CLAYMORE 19 +#define ARCHAEO_CULTROBES 20 +#define ARCHAEO_SOULSTONE 21 +#define ARCHAEO_SHARD 22 +#define ARCHAEO_RODS 23 +#define ARCHAEO_STOCKPARTS 24 +#define ARCHAEO_KATANA 25 +#define ARCHAEO_LASER 26 +#define ARCHAEO_GUN 27 +#define ARCHAEO_UNKNOWN 28 +#define ARCHAEO_FOSSIL 29 +#define ARCHAEO_SHELL 30 +#define ARCHAEO_PLANT 31 +#define ARCHAEO_REMAINS_HUMANOID 32 +#define ARCHAEO_REMAINS_ROBOT 33 +#define ARCHAEO_REMAINS_XENO 34 +#define ARCHAEO_GASMASK 35 +#define MAX_ARCHAEO 35 + +#define DIGSITE_GARDEN 1 +#define DIGSITE_ANIMAL 2 +#define DIGSITE_HOUSE 3 +#define DIGSITE_TECHNICAL 4 +#define DIGSITE_TEMPLE 5 +#define DIGSITE_WAR 6 + +#define EFFECT_TOUCH 0 +#define EFFECT_AURA 1 +#define EFFECT_PULSE 2 +#define MAX_EFFECT 2 + +#define TRIGGER_TOUCH 0 +#define TRIGGER_WATER 1 +#define TRIGGER_ACID 2 +#define TRIGGER_VOLATILE 3 +#define TRIGGER_TOXIN 4 +#define TRIGGER_FORCE 5 +#define TRIGGER_ENERGY 6 +#define TRIGGER_HEAT 7 +#define TRIGGER_COLD 8 +#define TRIGGER_PHORON 9 +#define TRIGGER_OXY 10 +#define TRIGGER_CO2 11 +#define TRIGGER_NITRO 12 +#define MAX_TRIGGER 12 + +#define EFFECT_UNKNOWN 0 +#define EFFECT_ENERGY 1 +#define EFFECT_PSIONIC 2 +#define EFFECT_ELECTRO 3 +#define EFFECT_PARTICLE 4 +#define EFFECT_ORGANIC 5 +#define EFFECT_BLUESPACE 6 +#define EFFECT_SYNTH 7 \ No newline at end of file diff --git a/code/_helpers/lists.dm b/code/_helpers/lists.dm index d4e6710b354..30df4693db7 100644 --- a/code/_helpers/lists.dm +++ b/code/_helpers/lists.dm @@ -11,24 +11,11 @@ //Returns a list in plain english as a string /proc/english_list(var/list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) - var/total = input.len - if (!total) - return "[nothing_text]" - else if (total == 1) - return "[input[1]]" - else if (total == 2) - return "[input[1]][and_text][input[2]]" - else - var/output = "" - var/index = 1 - while (index < total) - if (index == total - 1) - comma_text = final_comma_text - - output += "[input[index]][comma_text]" - index++ - - return "[output][and_text][input[index]]" + switch(input.len) + if(0) return nothing_text + if(1) return "[input[1]]" + if(2) return "[input[1]][and_text][input[2]]" + else return "[jointext(input, comma_text, 1, -1)][final_comma_text][and_text][input[input.len]]" //Returns list element or null. Should prevent "index out of bounds" error. proc/listgetindex(var/list/list,index) diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 35618c9b668..57813b01132 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -162,3 +162,24 @@ /proc/key_name_admin(var/whom, var/include_name = 1) return key_name(whom, 1, include_name) + +// Helper procs for building detailed log lines +/datum/proc/log_info_line() + return "[src] ([type])" + +/atom/log_info_line() + var/turf/t = get_turf(src) + if(istype(t)) + return "([t]) ([t.x],[t.y],[t.z]) ([t.type])" + else if(loc) + return "([loc]) (0,0,0) ([loc.type])" + else + return "(NULL) (0,0,0) (NULL)" + +/mob/log_info_line() + return "[..()] ([ckey])" + +/proc/log_info_line(var/datum/d) + if(!istype(d)) + return + return d.log_info_line() diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index 19e2206cd09..991d64e20b9 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -4,17 +4,56 @@ #define MINUTE *600 #define MINUTES *600 -var/roundstart_hour = 0 -//Returns the world time in english -proc/worldtime2text(time = world.time, timeshift = 1) - if(!roundstart_hour) roundstart_hour = pick(2,7,12,17) - return timeshift ? time2text(time+(36000*roundstart_hour), "hh:mm") : time2text(time, "hh:mm") +#define HOUR *36000 +#define HOURS *36000 -proc/worlddate2text() - return num2text((text2num(time2text(world.timeofday, "YYYY"))+544)) + "-" + time2text(world.timeofday, "MM-DD") +#define DAY *864000 +#define DAYS *864000 -proc/time_stamp() - return time2text(world.timeofday, "hh:mm:ss") +#define TimeOfGame (get_game_time()) +#define TimeOfTick (world.tick_usage*0.01*world.tick_lag) + +/proc/get_game_time() + var/global/time_offset = 0 + var/global/last_time = 0 + var/global/last_usage = 0 + + var/wtime = world.time + var/wusage = world.tick_usage * 0.01 + + if(last_time < wtime && last_usage > 1) + time_offset += last_usage - 1 + + last_time = wtime + last_usage = wusage + + return wtime + (time_offset + wusage) * world.tick_lag + +var/roundstart_hour +var/station_date = "" +var/next_station_date_change = 1 DAY + +#define duration2stationtime(time) time2text(station_time_in_ticks + time, "hh:mm") +#define worldtime2stationtime(time) time2text(roundstart_hour HOURS + time, "hh:mm") +#define round_duration_in_ticks (round_start_time ? world.time - round_start_time : 0) +#define station_time_in_ticks (roundstart_hour HOURS + round_duration_in_ticks) + +/proc/stationtime2text() + return time2text(station_time_in_ticks, "hh:mm") + +/proc/stationdate2text() + var/update_time = FALSE + if(station_time_in_ticks > next_station_date_change) + next_station_date_change += 1 DAY + update_time = TRUE + if(!station_date || update_time) + var/extra_days = round(station_time_in_ticks / (1 DAY)) DAYS + var/timeofday = world.timeofday + extra_days + station_date = num2text((text2num(time2text(timeofday, "YYYY"))+544)) + "-" + time2text(timeofday, "MM-DD") + return station_date + +/proc/time_stamp() + return time2text(station_time_in_ticks, "hh:mm:ss") /* Returns 1 if it is the selected month and day */ proc/isDay(var/month, var/day) @@ -36,9 +75,7 @@ var/round_start_time = 0 round_start_time = world.time return 1 -#define round_duration_in_ticks (round_start_time ? world.time - round_start_time : 0) - -/proc/round_duration_as_text() +/proc/roundduration2text() if(!round_start_time) return "00:00" if(last_round_duration && world.time < next_duration_update) @@ -55,3 +92,12 @@ var/round_start_time = 0 last_round_duration = "[hours]:[mins]" next_duration_update = world.time + 1 MINUTES return last_round_duration + +//Can be useful for things dependent on process timing +/proc/process_schedule_interval(var/process_name) + var/datum/controller/process/process = processScheduler.getProcess(process_name) + return process.schedule_interval + +/hook/startup/proc/set_roundstart_hour() + roundstart_hour = pick(2,7,12,17) + return 1 \ No newline at end of file diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm index 3365a4384d5..262ece09e48 100644 --- a/code/_onclick/hud/spell_screen_objects.dm +++ b/code/_onclick/hud/spell_screen_objects.dm @@ -73,8 +73,8 @@ var/obj/screen/spell/S = spell_objects[i] var/xpos = x_position + (x_position < 8 ? 1 : -1)*(i%7) var/ypos = y_position + (y_position < 8 ? round(i/7) : -round(i/7)) - S.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]" if(spell_holder && spell_holder.client) + S.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]" spell_holder.client.screen += S S.handle_icon_updates = 1 diff --git a/code/controllers/ProcessScheduler/core/_stubs.dm b/code/controllers/ProcessScheduler/core/_stubs.dm deleted file mode 100644 index 1aa2c8efb8c..00000000000 --- a/code/controllers/ProcessScheduler/core/_stubs.dm +++ /dev/null @@ -1,19 +0,0 @@ -/** - * _stubs.dm - * - * This file contains constructs that the process scheduler expects to exist - * in a standard ss13 fork. - */ - -/** - * logTheThing - * - * In goonstation, this proc writes a message to either the world log or diary. - * - * Blame Keelin. - */ -/proc/logTheThing(type, source, target, text, diaryType) - if(diaryType) - log_debug("Diary: \[[diaryType]:[type]] [text]") - else - log_debug("Log: \[[type]] [text]") diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index b7767c367fd..2d5b8b1b7dc 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -69,10 +69,10 @@ * recordkeeping vars */ - // Records the time (1/10s timeofday) at which the process last finished sleeping + // Records the time (1/10s timeoftick) at which the process last finished sleeping var/tmp/last_slept = 0 - // Records the time (1/10s timeofday) at which the process last began running + // Records the time (1/10s timeofgame) at which the process last began running var/tmp/run_start = 0 // Records the number of times this process has been killed and restarted @@ -106,12 +106,8 @@ last_object = null /datum/controller/process/proc/started() - var/timeofhour = TimeOfHour - // Initialize last_slept so we can know when to sleep - last_slept = timeofhour - // Initialize run_start so we can detect hung processes. - run_start = timeofhour + run_start = TimeOfGame // Initialize defer count cpu_defer_count = 0 @@ -163,18 +159,13 @@ setStatus(PROCESS_STATUS_HUNG) /datum/controller/process/proc/handleHung() - var/timeofhour = TimeOfHour var/datum/lastObj = last_object var/lastObjType = "null" if(istype(lastObj)) lastObjType = lastObj.type - // If timeofhour has rolled over, then we need to adjust. - if (timeofhour < run_start) - run_start -= 36000 - var/msg = "[name] process hung at tick #[ticks]. Process was unresponsive for [(timeofhour - run_start) / 10] seconds and was restarted. Last task: [last_task]. Last Object Type: [lastObjType]" - logTheThing("debug", null, null, msg) - logTheThing("diary", null, null, msg, "debug") + var/msg = "[name] process hung at tick #[ticks]. Process was unresponsive for [(TimeOfGame - run_start) / 10] seconds and was restarted. Last task: [last_task]. Last Object Type: [lastObjType]" + log_debug(msg) message_admins(msg) main.restartProcess(src.name) @@ -182,8 +173,8 @@ /datum/controller/process/proc/kill() if (!killed) var/msg = "[name] process was killed at tick #[ticks]." - logTheThing("debug", null, null, msg) - logTheThing("diary", null, null, msg, "debug") + log_debug(msg) + message_admins(msg) //finished() // Allow inheritors to clean up if needed @@ -208,17 +199,12 @@ if (main.getCurrentTickElapsedTime() > main.timeAllowance) sleep(world.tick_lag) cpu_defer_count++ - last_slept = TimeOfHour + last_slept = 0 else - var/timeofhour = TimeOfHour - // If timeofhour has rolled over, then we need to adjust. - if (timeofhour < last_slept) - last_slept -= 36000 - - if (timeofhour > last_slept + sleep_interval) + if (TimeOfTick > last_slept + sleep_interval) // If we haven't slept in sleep_interval deciseconds, sleep to allow other work to proceed. sleep(0) - last_slept = TimeOfHour + last_slept = TimeOfTick /datum/controller/process/proc/update() // Clear delta @@ -239,10 +225,7 @@ /datum/controller/process/proc/getElapsedTime() - var/timeofhour = TimeOfHour - if (timeofhour < run_start) - return timeofhour - (run_start - 36000) - return timeofhour - run_start + return TimeOfGame - run_start /datum/controller/process/proc/tickDetail() return @@ -343,6 +326,9 @@ stat("[name]", "T#[getTicks()] | AR [averageRunTime] | LR [lastRunTime] | HR [highestRunTime] | D [cpu_defer_count]") /datum/controller/process/proc/catchException(var/exception/e, var/thrower) + if(istype(e)) // Real runtimes go to the real error handler + log_runtime(e, thrower, "Caught by process: [name]") + return var/etext = "[e]" var/eid = "[e]" // Exception ID, for tracking repeated exceptions var/ptext = "" // "processing..." text, for what was being processed (if known) @@ -369,4 +355,4 @@ /datum/controller/process/proc/catchBadType(var/datum/caught) if(isnull(caught) || !istype(caught) || !isnull(caught.gcDestroyed)) return // Only bother with types we can identify and that don't belong - catchException("Type [caught.type] does not belong in process' queue") \ No newline at end of file + catchException("Type [caught.type] does not belong in process' queue") diff --git a/code/controllers/ProcessScheduler/core/processScheduler.dm b/code/controllers/ProcessScheduler/core/processScheduler.dm index bde79fba07b..dc412ee92ad 100644 --- a/code/controllers/ProcessScheduler/core/processScheduler.dm +++ b/code/controllers/ProcessScheduler/core/processScheduler.dm @@ -43,8 +43,6 @@ var/global/datum/controller/processScheduler/processScheduler var/tmp/currentTick = 0 - var/tmp/currentTickStart = 0 - var/tmp/timeAllowance = 0 var/tmp/cpuAverage = 0 @@ -247,7 +245,7 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/recordStart(var/datum/controller/process/process, var/time = null) if (isnull(time)) - time = TimeOfHour + time = TimeOfGame last_queued[process] = world.time last_start[process] = time else @@ -256,11 +254,7 @@ var/global/datum/controller/processScheduler/processScheduler /datum/controller/processScheduler/proc/recordEnd(var/datum/controller/process/process, var/time = null) if (isnull(time)) - time = TimeOfHour - - // If world.timeofday has rolled over, then we need to adjust. - if (time < last_start[process]) - last_start[process] -= 36000 + time = TimeOfGame var/lastRunTime = time - last_start[process] @@ -349,29 +343,23 @@ var/global/datum/controller/processScheduler/processScheduler updateCurrentTickData() return 0 else - return TimeOfHour - currentTickStart + return TimeOfTick /datum/controller/processScheduler/proc/updateCurrentTickData() if (world.time > currentTick) // New tick! currentTick = world.time - currentTickStart = TimeOfHour updateTimeAllowance() cpuAverage = (world.cpu + cpuAverage + cpuAverage) / 3 /datum/controller/processScheduler/proc/updateTimeAllowance() // Time allowance goes down linearly with world.cpu. var/tmp/error = cpuAverage - 100 - var/tmp/timeAllowanceDelta = sign(error) * -0.5 * world.tick_lag * max(0, 0.001 * abs(error)) + var/tmp/timeAllowanceDelta = SIMPLE_SIGN(error) * -0.5 * world.tick_lag * max(0, 0.001 * abs(error)) //timeAllowance = world.tick_lag * min(1, 0.5 * ((200/max(1,cpuAverage)) - 1)) timeAllowance = min(timeAllowanceMax, max(0, timeAllowance + timeAllowanceDelta)) -/datum/controller/processScheduler/proc/sign(var/x) - if (x == 0) - return 1 - return x / abs(x) - /datum/controller/processScheduler/proc/statProcesses() if(!isRunning) stat("Processes", "Scheduler not running") @@ -379,4 +367,7 @@ var/global/datum/controller/processScheduler/processScheduler stat("Processes", "[processes.len] (R [running.len] / Q [queued.len] / I [idle.len])") stat(null, "[round(cpuAverage, 0.1)] CPU, [round(timeAllowance, 0.1)/10] TA") for(var/datum/controller/process/p in processes) - p.statProcess() \ No newline at end of file + p.statProcess() + +/datum/controller/processScheduler/proc/getProcess(var/process_name) + return nameToProcessMap[process_name] diff --git a/code/controllers/ProcessScheduler/test/processScheduler.js b/code/controllers/ProcessScheduler/test/processScheduler.js deleted file mode 100644 index 0a4f111355d..00000000000 --- a/code/controllers/ProcessScheduler/test/processScheduler.js +++ /dev/null @@ -1,56 +0,0 @@ -(function ($) { - function setRef(theRef) { - ref = theRef; - } - - function jax(action, data) { - if (typeof data === 'undefined') - data = {}; - var params = []; - for (var k in data) { - if (data.hasOwnProperty(k)) { - params.push(encodeURIComponent(k) + '=' + encodeURIComponent(data[k])); - } - } - var newLoc = '?src=' + ref + ';action=' + action + ';' + params.join(';'); - window.location = newLoc; - } - - function requestRefresh(e) { - jax("refresh", null); - } - - function handleRefresh(processTable) { - $('#processTable').html(processTable); - initProcessTableButtons(); - } - - function requestKill(e) { - var button = $(e.currentTarget); - jax("kill", {name: button.data("process-name")}); - } - - function requestEnable(e) { - var button = $(e.currentTarget); - jax("enable", {name: button.data("process-name")}); - } - - function requestDisable(e) { - var button = $(e.currentTarget); - jax("disable", {name: button.data("process-name")}); - } - - function initProcessTableButtons() { - $(".kill-btn").on("click", requestKill); - $(".enable-btn").on("click", requestEnable); - $(".disable-btn").on("click", requestDisable); - } - - window.setRef = setRef; - window.handleRefresh = handleRefresh; - - $(function() { - initProcessTableButtons(); - $('#btn-refresh').on("click", requestRefresh); - }); -}(jQuery)); \ No newline at end of file diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm index e6f88731b6f..aa06984f692 100644 --- a/code/controllers/voting.dm +++ b/code/controllers/voting.dm @@ -120,7 +120,7 @@ var/global/list/round_voters = list() // Keeps track of the individuals voting f if(choices[current_votes[key]] == .) round_voters += key // Keep track of who voted for the winning round. if(mode != VOTE_GAMEMODE || . == "Extended" || ticker.hide_mode == 0) // Announce Extended gamemode, but not other gamemodes - text += "Vote Result: [.]" + text += "Vote Result: [mode == VOTE_GAMEMODE ? gamemode_names[.] : .]" else text += "The vote has ended." diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 2043febdb6b..1a736cd74ff 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -361,7 +361,7 @@ clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY) - if("Captain") + if("Station Administrator") clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) if("Head of Security") diff --git a/code/datums/locations/s_randarr.dm b/code/datums/locations/s_randarr.dm index 08d448348f8..ceed8025c79 100644 --- a/code/datums/locations/s_randarr.dm +++ b/code/datums/locations/s_randarr.dm @@ -1,3 +1,5 @@ +//TODO: Make this match current lore + //S'randarr /datum/locations/s_randarr diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm index 33886f997d7..2f0de005ca2 100644 --- a/code/datums/underwear/undershirts.dm +++ b/code/datums/underwear/undershirts.dm @@ -8,6 +8,11 @@ icon_state = "undershirt" has_color = TRUE +/datum/category_item/underwear/undershirt/shirt_long + name = "Longsleeve Shirt" + icon_state = "undershirt_long" + has_color = TRUE + /datum/category_item/underwear/undershirt/tank_top name = "Tank top" icon_state = "tanktop" diff --git a/code/datums/underwear/underwear.dm b/code/datums/underwear/underwear.dm index d14ddea1339..22f538a9a1e 100644 --- a/code/datums/underwear/underwear.dm +++ b/code/datums/underwear/underwear.dm @@ -9,27 +9,34 @@ *************/ /datum/category_group/underwear var/sort_order // Lower sort order is applied as icons first + var/display_name // For displaying in text + var/gender = NEUTER datum/category_group/underwear/dd_SortValue() return sort_order /datum/category_group/underwear/top name = "Underwear, top" + display_name = "top piece" sort_order = 1 category_item_type = /datum/category_item/underwear/top /datum/category_group/underwear/bottom name = "Underwear, bottom" + display_name = "bottom piece" sort_order = 2 category_item_type = /datum/category_item/underwear/bottom /datum/category_group/underwear/socks name = "Socks" + display_name = "socks" + gender = PLURAL sort_order = 3 category_item_type = /datum/category_item/underwear/socks /datum/category_group/underwear/undershirt name = "Undershirt" + display_name = "undershirt" sort_order = 4 // Undershirts currently have the highest sort order because they may cover both underwear and socks. category_item_type = /datum/category_item/underwear/undershirt diff --git a/code/datums/uplink/badassery.dm b/code/datums/uplink/badassery.dm index 2cfd2f72030..62c570a972b 100644 --- a/code/datums/uplink/badassery.dm +++ b/code/datums/uplink/badassery.dm @@ -61,17 +61,17 @@ /datum/uplink_item/item/badassery/surplus/merc2 name = "Surplus Crate - 240 TC" item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 2 - item_worth = 360 + item_worth = 540 /datum/uplink_item/item/badassery/surplus/merc4 name = "Surplus Crate - 480 TC" item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 4 - item_worth = 720 + item_worth = 1200 /datum/uplink_item/item/badassery/surplus/merc6 name = "Surplus Crate - 720 TC" item_cost = DEFAULT_TELECRYSTAL_AMOUNT * 6 - item_worth = 1440 + item_worth = 1980 /datum/uplink_item/item/badassery/surplus/New() ..() diff --git a/code/datums/uplink/stealth_items.dm b/code/datums/uplink/stealth_items.dm index 1da03813900..23e0593cad0 100644 --- a/code/datums/uplink/stealth_items.dm +++ b/code/datums/uplink/stealth_items.dm @@ -31,10 +31,10 @@ /datum/uplink_item/item/stealth_items/voice name = "Voice Changer" - item_cost = 30 + item_cost = 15 path = /obj/item/clothing/mask/gas/voice /datum/uplink_item/item/stealth_items/camera_floppy name = "Camera Network Access - Floppy" - item_cost = 30 + item_cost = 15 path = /obj/item/weapon/disk/file/cameras/syndicate diff --git a/code/datums/uplink/stealthy_weapons.dm b/code/datums/uplink/stealthy_weapons.dm index 7a60e42e139..5576ebcac58 100644 --- a/code/datums/uplink/stealthy_weapons.dm +++ b/code/datums/uplink/stealthy_weapons.dm @@ -26,10 +26,10 @@ /datum/uplink_item/item/stealthy_weapons/cigarette_kit name = "Cigarette Kit" - item_cost = 15 + item_cost = 10 path = /obj/item/weapon/storage/box/syndie_kit/cigarette /datum/uplink_item/item/stealthy_weapons/random_toxin name = "Random Toxin - Beaker" - item_cost = 15 + item_cost = 10 path = /obj/item/weapon/storage/box/syndie_kit/toxin diff --git a/code/datums/uplink/tools.dm b/code/datums/uplink/tools.dm index 51fd7d51fc5..17203e3d5df 100644 --- a/code/datums/uplink/tools.dm +++ b/code/datums/uplink/tools.dm @@ -14,16 +14,78 @@ item_cost = 10 path = /obj/item/weapon/storage/toolbox/syndicate +/datum/uplink_item/item/tools/clerical + name = "Morphic Clerical Kit" + item_cost = 10 + path = /obj/item/weapon/storage/box/syndie_kit/clerical + +/datum/uplink_item/item/tools/encryptionkey_radio + name = "Encrypted Radio Channel Key" + item_cost = 10 + path = /obj/item/device/encryptionkey/syndicate + +/datum/uplink_item/item/tools/money + name = "Operations Funding" + item_cost = 10 + path = /obj/item/weapon/storage/secure/briefcase/money + desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." + /datum/uplink_item/item/tools/plastique name = "C-4 (Destroys walls)" item_cost = 10 path = /obj/item/weapon/plastique +/datum/uplink_item/item/tools/duffle + name = "Black Duffle Bag" + item_cost = 10 + path = /obj/item/weapon/storage/backpack/dufflebag/syndie + +/datum/uplink_item/item/tools/duffle/med + name = "Black Medical Duffle Bag" + path = /obj/item/weapon/storage/backpack/dufflebag/syndie/med + +/datum/uplink_item/item/tools/duffle/ammo + name = "Black Ammunition Duffle Bag" + path = /obj/item/weapon/storage/backpack/dufflebag/syndie/ammo + +/datum/uplink_item/item/tools/space_suit + name = "Space Suit" + item_cost = 15 + path = /obj/item/weapon/storage/box/syndie_kit/space + +/datum/uplink_item/item/tools/encryptionkey_binary + name = "Binary Translator Key" + item_cost = 15 + path = /obj/item/device/encryptionkey/binary + /datum/uplink_item/item/tools/packagebomb name = "Package Bomb (Small)" item_cost = 20 path = /obj/item/weapon/storage/box/syndie_kit/demolitions +/datum/uplink_item/item/tools/hacking_tool + name = "Door Hacking Tool" + item_cost = 20 + path = /obj/item/device/multitool/hacktool + desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \ + When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \ + This device will also be able to immediately access the last 6 to 8 hacked airlocks." + +/datum/uplink_item/item/tools/emag + name = "Cryptographic Sequencer" + item_cost = 30 + path = /obj/item/weapon/card/emag + +/datum/uplink_item/item/tools/thermal + name = "Thermal Imaging Glasses" + item_cost = 30 + path = /obj/item/clothing/glasses/thermal/syndi + +/datum/uplink_item/item/tools/powersink + name = "Powersink (DANGER!)" + item_cost = 40 + path = /obj/item/device/powersink + /datum/uplink_item/item/tools/packagebomb/large name = "Package Bomb (Large)" item_cost = 40 @@ -36,55 +98,6 @@ path = /obj/item/weapon/storage/box/syndie_kit/demolitions_super_heavy */ -/datum/uplink_item/item/tools/encryptionkey_radio - name = "Encrypted Radio Channel Key" - item_cost = 20 - path = /obj/item/device/encryptionkey/syndicate - -/datum/uplink_item/item/tools/hacking_tool - name = "Door Hacking Tool" - item_cost = 20 - path = /obj/item/device/multitool/hacktool - desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \ - When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \ - This device will also be able to immediately access the last 6 to 8 hacked airlocks." - -/datum/uplink_item/item/tools/encryptionkey_binary - name = "Binary Translator Key" - item_cost = 20 - path = /obj/item/device/encryptionkey/binary - -/datum/uplink_item/item/tools/emag - name = "Cryptographic Sequencer" - item_cost = 30 - path = /obj/item/weapon/card/emag - -/datum/uplink_item/item/tools/clerical - name = "Morphic Clerical Kit" - item_cost = 15 - path = /obj/item/weapon/storage/box/syndie_kit/clerical - -/datum/uplink_item/item/tools/money - name = "Operations Funding" - item_cost = 15 - path = /obj/item/weapon/storage/secure/briefcase/money - desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities." - -/datum/uplink_item/item/tools/space_suit - name = "Space Suit" - item_cost = 15 - path = /obj/item/weapon/storage/box/syndie_kit/space - -/datum/uplink_item/item/tools/thermal - name = "Thermal Imaging Glasses" - item_cost = 30 - path = /obj/item/clothing/glasses/thermal/syndi - -/datum/uplink_item/item/tools/powersink - name = "Powersink (DANGER!)" - item_cost = 50 - path = /obj/item/device/powersink - /datum/uplink_item/item/tools/ai_module name = "Hacked AI Upload Module" item_cost = 60 diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm index 58b054b849b..41a1779322b 100644 --- a/code/datums/uplink/visible_weapons.dm +++ b/code/datums/uplink/visible_weapons.dm @@ -11,7 +11,7 @@ /datum/uplink_item/item/visible_weapons/combatknife name = "Combat Knife" - item_cost = 30 + item_cost = 20 path = /obj/item/weapon/material/hatchet/tacknife/combatknife /datum/uplink_item/item/visible_weapons/energy_sword diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm index ace1ba9ec35..a665fd75a5c 100644 --- a/code/datums/wires/alarm.dm +++ b/code/datums/wires/alarm.dm @@ -11,7 +11,7 @@ var/const/AALARM_WIRE_AALARM = 16 /datum/wires/alarm/CanUse(var/mob/living/L) var/obj/machinery/alarm/A = holder - if(A.wiresexposed) + if(A.panel_open) return 1 return 0 diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 291cef46822..ddf88533e13 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -87,7 +87,7 @@ var/global/list/PDA_Manifest = list() heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 depthead = 1 - if(rank=="Captain" && heads.len != 1) + if(rank=="Station Administrator" && heads.len != 1) heads.Swap(1,heads.len) if(real_rank in security_positions) diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index 9bf83d2d6d7..cbfb17adf09 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -50,7 +50,7 @@ var/flags = 0 // Various runtime options. // Used for setting appearance. - var/list/valid_species = list("Unathi","Tajara","Skrell","Human") + var/list/valid_species = list("Unathi","Tajara","Skrell","Human","Diona","Teshari") // Runtime vars. var/datum/mind/leader // Current leader, if any. diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index dbbae8a5e12..7cf17b5640a 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -14,7 +14,8 @@ if(!preserve_appearance && (flags & ANTAG_SET_APPEARANCE)) spawn(3) var/mob/living/carbon/human/H = player.current - if(istype(H)) H.change_appearance(APPEARANCE_ALL, H.loc, H, valid_species, state = z_state) + if(istype(H)) + H.change_appearance(APPEARANCE_ALL, H.loc, H, species_whitelist = valid_species, state = z_state) return player.current /datum/antagonist/proc/update_access(var/mob/living/player) diff --git a/code/game/antagonist/mutiny/mutineer.dm b/code/game/antagonist/mutiny/mutineer.dm index c0d764b3be4..eb341e36cfe 100644 --- a/code/game/antagonist/mutiny/mutineer.dm +++ b/code/game/antagonist/mutiny/mutineer.dm @@ -6,7 +6,7 @@ var/datum/antagonist/mutineer/mutineers role_text_plural = "Mutineers" id = MODE_MUTINEER antag_indicator = "mutineer" - restricted_jobs = list("Captain") + restricted_jobs = list("Station Administrator") /datum/antagonist/mutineer/New(var/no_reference) ..() @@ -39,7 +39,7 @@ var/datum/antagonist/mutineer/mutineers proc/get_head_loyalist_candidates() var/list/candidates[0] for(var/mob/loyalist in player_list) - if(loyalist.mind && loyalist.mind.assigned_role == "Captain") + if(loyalist.mind && loyalist.mind.assigned_role == "Station Administrator") candidates.Add(loyalist.mind) return candidates @@ -47,7 +47,7 @@ var/datum/antagonist/mutineer/mutineers var/list/candidates[0] for(var/mob/mutineer in player_list) if(mutineer.client.prefs.be_special & BE_MUTINEER) - for(var/job in command_positions - "Captain") + for(var/job in command_positions - "Station Administrator") if(mutineer.mind && mutineer.mind.assigned_role == job) candidates.Add(mutineer.mind) return candidates diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index 29ea3d27c10..658e32e4aad 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -13,7 +13,7 @@ var/datum/antagonist/ert/ert and before taking extreme actions, please try to also contact the administration! \ Think through your actions and make the roleplay immersive! Please remember all \ rules aside from those without explicit exceptions apply to the ERT." - leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however." + leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Station Administrator where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the Station Administrator where possible, however." landmark_id = "Response Team" id_type = /obj/item/weapon/card/id/centcom/ERT diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index b420b3d59ed..8ce55ca8e4b 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -60,7 +60,7 @@ var/datum/antagonist/raider/raiders /obj/item/clothing/suit/storage/toggle/hoodie, /obj/item/clothing/suit/storage/toggle/hoodie/black, /obj/item/clothing/suit/unathi/mantle, - /obj/item/clothing/suit/poncho, + /obj/item/clothing/accessory/poncho, ) var/list/raider_guns = list( diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm index 044e968f496..686de4d8182 100644 --- a/code/game/antagonist/station/changeling.dm +++ b/code/game/antagonist/station/changeling.dm @@ -6,7 +6,7 @@ bantype = "changeling" feedback_tag = "changeling_objective" restricted_jobs = list("AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Station Administrator") welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them." flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE antaghud_indicator = "hudchangeling" diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index 6bb049dcb0b..d3ba6c1ad76 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -11,7 +11,7 @@ var/datum/antagonist/cultist/cult role_text = "Cultist" role_text_plural = "Cultists" bantype = "cultist" - restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Captain") + restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Station Administrator") protected_jobs = list("Security Officer", "Warden", "Detective") role_type = BE_CULTIST feedback_tag = "cult_objective" diff --git a/code/game/antagonist/station/revolutionary.dm b/code/game/antagonist/station/revolutionary.dm index 96e37529915..d2efe7262b5 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/code/game/antagonist/station/revolutionary.dm @@ -29,7 +29,7 @@ var/datum/antagonist/revolutionary/revs faction_indicator = "rev" faction_invisible = 1 - restricted_jobs = list("Internal Affairs Agent", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") + restricted_jobs = list("Internal Affairs Agent", "AI", "Cyborg", "Station Administrator", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") protected_jobs = list("Security Officer", "Warden", "Detective") /datum/antagonist/revolutionary/New() diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index acc0bd3d8d1..ae8925be47b 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -3,7 +3,7 @@ var/datum/antagonist/traitor/traitors // Inherits most of its vars from the base datum. /datum/antagonist/traitor id = MODE_TRAITOR - protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Captain") + protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Station Administrator") flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE /datum/antagonist/traitor/auto diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 8905d5fd9a1..c904571608d 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -1137,7 +1137,7 @@ area/space/atmosalert() sound_env = MEDIUM_SOFTFLOOR /area/crew_quarters/captain - name = "\improper Command - Captain's Office" + name = "\improper Command - Station Administrator's Office" icon_state = "captain" sound_env = MEDIUM_SOFTFLOOR diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 23bd46243ee..13b8db962dd 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -12,7 +12,7 @@ certain though... there is never just one of them. Good luck." config_tag = "changeling" required_players = 2 - required_players_secret = 5 + required_players_secret = 3 required_enemies = 1 end_on_antag_death = 0 antag_scaling_coeff = 10 diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm index b27b0ef5236..87a3eee4493 100644 --- a/code/game/gamemodes/changeling/powers/armor.dm +++ b/code/game/gamemodes/changeling/powers/armor.dm @@ -2,7 +2,7 @@ name = "Organic Space Suit" desc = "We grow an organic suit to protect ourselves from space exposure." helptext = "To remove the suit, use the ability again." - ability_icon_state = "ling_space_suit" + ability_icon_state = "lingspacesuit" genomecost = 1 verbpath = /mob/proc/changeling_spacesuit @@ -17,7 +17,7 @@ name = "Chitinous Spacearmor" desc = "We turn our skin into tough chitin to protect us from damage and space exposure." helptext = "To remove the armor, use the ability again." - ability_icon_state = "ling_armor" + ability_icon_state = "lingarmor" genomecost = 3 verbpath = /mob/proc/changeling_spacearmor @@ -34,7 +34,6 @@ /obj/item/clothing/suit/space/changeling name = "flesh mass" icon_state = "lingspacesuit" - item_state = "lingspacehelmet" desc = "A huge, bulky mass of pressure and temperature-resistant organic tissue, evolved to facilitate space travel." flags = STOPPRESSUREDAMAGE //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, //it still ends up in your blood. (also balance but muh fluff) @@ -55,7 +54,6 @@ /obj/item/clothing/head/helmet/space/changeling name = "flesh mass" icon_state = "lingspacehelmet" - item_state = "lingspacehelmet" desc = "A covering of pressure and temperature-resistant organic tissue with a glass-like chitin front." flags = BLOCKHAIR | STOPPRESSUREDAMAGE //Again, no THICKMATERIAL. armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) diff --git a/code/game/gamemodes/changeling/powers/rapid_regen.dm b/code/game/gamemodes/changeling/powers/rapid_regen.dm index 1688c81f317..7df99753d4b 100644 --- a/code/game/gamemodes/changeling/powers/rapid_regen.dm +++ b/code/game/gamemodes/changeling/powers/rapid_regen.dm @@ -33,6 +33,7 @@ C.adjustCloneLoss(-healing_amount) C.adjustBrainLoss(-healing_amount) C.restore_blood() + C.species.create_organs(C) C.restore_all_organs() C.blinded = 0 C.eye_blind = 0 diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 72dfd6ec5c3..2f0b9c57e75 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -27,16 +27,19 @@ C.radiation = 0 C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss()) C.reagents.clear_reagents() - C.restore_all_organs(ignore_prosthetic_prefs=1) //Covers things like fractures and other things not covered by the above. if(ishuman(C)) var/mob/living/carbon/human/H = src + H.species.create_organs(H) + H.restore_all_organs(ignore_prosthetic_prefs=1) //Covers things like fractures and other things not covered by the above. H.restore_blood() H.mutations.Remove(HUSK) H.status_flags -= DISFIGURED H.update_body(1) for(var/limb in H.organs_by_name) var/obj/item/organ/external/current_limb = H.organs_by_name[limb] - current_limb.undislocate() + if(current_limb) + current_limb.undislocate() + current_limb.open = 0 C.halloss = 0 C.shock_stage = 0 //Pain diff --git a/code/game/gamemodes/changeling/powers/self_respiration.dm b/code/game/gamemodes/changeling/powers/self_respiration.dm index 96b8f3d277c..6d6228eba88 100644 --- a/code/game/gamemodes/changeling/powers/self_respiration.dm +++ b/code/game/gamemodes/changeling/powers/self_respiration.dm @@ -2,15 +2,30 @@ name = "Self Respiration" desc = "We evolve our body to no longer require drawing oxygen from the atmosphere." helptext = "We will no longer require internals, and we cannot inhale any gas, including harmful ones." + ability_icon_state = "ling_toggle_breath" genomecost = 0 - isVerb = 0 verbpath = /mob/proc/changeling_self_respiration //No breathing required /mob/proc/changeling_self_respiration() + set category = "Changeling" + set name = "Toggle Breathing" + set desc = "We choose whether or not to breathe." + + var/datum/changeling/changeling = changeling_power(0,0,100,UNCONSCIOUS) + if(!changeling) + return 0 + if(istype(src,/mob/living/carbon)) var/mob/living/carbon/C = src - C.does_not_breathe = 1 - src << "We stop breathing, as we no longer need to." - return 1 + if(C.suiciding) + src << "You're committing suicide, this isn't going to work." + return 0 + if(C.does_not_breathe == 0) + C.does_not_breathe = 1 + src << "We stop breathing, as we no longer need to." + return 1 + else + C.does_not_breathe = 0 + src << "We resume breathing, as we now need to again." return 0 \ No newline at end of file diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 22f36c106b3..df162f74ca2 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -4,7 +4,7 @@ extended_round_description = "The station has been infiltrated by a fanatical group of death-cultists! They will use powers from beyond your comprehension to subvert you to their cause and ultimately please their gods through sacrificial summons and physical immolation! Try to survive!" config_tag = "cult" required_players = 5 - required_players_secret = 10 + required_players_secret = 5 required_enemies = 3 end_on_antag_death = 0 antag_tags = list(MODE_CULTIST) diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 4bf9e808ddc..797dddc8749 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -301,9 +301,9 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE") if(5) M << "
" - M << "THE CAPTAIN, HOP AND HOS ARE [who2]...LAWS UPDATED" + M << "THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]...LAWS UPDATED" M << "
" - M.add_ion_law("THE CAPTAIN, HOP AND HOS ARE [who2]") + M.add_ion_law("THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]") if(6) M << "
" M << "THE STATION IS BUILT FOR [who2]...LAWS UPDATED" diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm index de65d9f0be0..7838ba3dd39 100644 --- a/code/game/gamemodes/events/holidays/Holidays.dm +++ b/code/game/gamemodes/events/holidays/Holidays.dm @@ -34,9 +34,6 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t switch(DD) if(1) Holiday["New Years's Day"] = "The day of the new solar year on Sol." - if(10) - Holiday["Messa's Day"] = "A Tajaran holiday. It takes place on the shortest day of the year on \ - Ahdomai, and is named after Messa, the Tajaran deity of Change." if(12) Holiday["Vertalliq-Qerr"] = "Vertalliq-Qerr, translated to mean 'Festival of the Royals', is a \ Skrell holiday that celebrates the Qerr-Katish and all they have provided for the rest of Skrell society, \ @@ -79,9 +76,6 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t Holiday["April Fool's Day"] = "An old holiday that endevours one to pull pranks and spread hoaxes on their friends." if(YY == 18) Holiday["Easter"] = "" - if(7) - Holiday["Tajaran Independence Day"] = "A Tajaran holiday celebrating their independence by winning the \ - war against the Slavemasters, the former ruling elite that went known as 'The Overseers'." if(8) if(YY == 15) Holiday["Easter"] = "" @@ -123,9 +117,11 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t if(8) //Aug switch(DD) - if(10) - Holiday["S'randarr's Day"] = "A Tajaran holiday that occurs on the longest day of the year in summer, \ - on Ahdomai. It is named after the Tajaran deity of Light, and huge celebrations are common." +// if(10) +// Holiday["S'randarr's Day"] = "A Tajaran holiday that occurs on the longest day of the year in summer, \ +// on Ahdomai. It is named after the Tajaran deity of Light, and huge celebrations are common." + if(27) + Holiday["Forgiveness Day"] = "A time to forgive and be forgiven." if(9) //Sep switch(DD) diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 4c390e7c690..7c1f4229872 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -288,7 +288,7 @@ var/global/datum/controller/gameticker/ticker var/captainless=1 for(var/mob/living/carbon/human/player in player_list) if(player && player.mind && player.mind.assigned_role) - if(player.mind.assigned_role == "Captain") + if(player.mind.assigned_role == "Station Administrator") captainless=0 if(!player_is_antag(player.mind, only_offstation_roles = 1)) job_master.EquipRank(player, player.mind.assigned_role, 0) @@ -297,7 +297,7 @@ var/global/datum/controller/gameticker/ticker if(captainless) for(var/mob/M in player_list) if(!istype(M,/mob/new_player)) - M << "Captainship not forced on anyone." + M << "Station Administratorship not forced on anyone." proc/process() diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index de868328b31..835185fdcde 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -4,7 +4,7 @@ extended_round_description = "The AI will attempt to hack the APCs around the station in order to gain as much control as possible." config_tag = "malfunction" required_players = 2 - required_players_secret = 7 + required_players_secret = 2 required_enemies = 1 end_on_antag_death = 0 auto_recall_shuttle = 0 diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm index 480c69d27fa..9109d9297be 100644 --- a/code/game/gamemodes/ninja/ninja.dm +++ b/code/game/gamemodes/ninja/ninja.dm @@ -10,7 +10,7 @@ only hope this unknown assassin isn't here for you." config_tag = "ninja" required_players = 1 - required_players_secret = 6 + required_players_secret = 3 required_enemies = 1 end_on_antag_death = 0 antag_tags = list(MODE_NINJA) \ No newline at end of file diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 5f268bba16b..3bf4299cd22 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -13,7 +13,7 @@ var/list/nuke_disks = list() attempts of robbery, fraud and other malicious actions." config_tag = "mercenary" required_players = 15 - required_players_secret = 20 // 20 players - 5 players to be the nuke ops = 15 players remaining + required_players_secret = 15 required_enemies = 1 end_on_antag_death = 0 var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 98fc360160f..54f75a0032f 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -8,6 +8,5 @@ required_enemies = 3 auto_recall_shuttle = 0 //un-wanted on polaris end_on_antag_death = 0 - shuttle_delay = 3 antag_tags = list(MODE_REVOLUTIONARY, MODE_LOYALIST) require_all_templates = 1 diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm index 891ca926de4..c253d441995 100644 --- a/code/game/gamemodes/technomancer/catalog.dm +++ b/code/game/gamemodes/technomancer/catalog.dm @@ -1,8 +1,13 @@ +#define ALL_SPELLS "All" +#define OFFENSIVE_SPELLS "Offensive" +#define DEFENSIVE_SPELLS "Defensive" +#define UTILITY_SPELLS "Utility" +#define SUPPORT_SPELLS "Support" + var/list/all_technomancer_spells = typesof(/datum/technomancer/spell) - /datum/technomancer/spell var/list/all_technomancer_equipment = typesof(/datum/technomancer/equipment) - /datum/technomancer/equipment var/list/all_technomancer_consumables = typesof(/datum/technomancer/consumable) - /datum/technomancer/consumable var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) - /datum/technomancer/assistance -var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datum/technomancer/presets /datum/technomancer var/name = "technomancer thing" @@ -13,6 +18,9 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu var/obj_path = null var/ability_icon_state = null +/datum/technomancer/spell + var/category = ALL_SPELLS + /obj/item/weapon/technomancer_catalog name = "catalog" desc = "A \"book\" featuring a holographic display, metal cover, and miniaturized teleportation device, allowing the user to \ @@ -27,8 +35,8 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu var/list/equipment_instances = list() var/list/consumable_instances = list() var/list/assistance_instances = list() - var/list/preset_instances = list() var/tab = 0 + var/spell_tab = ALL_SPELLS var/show_scepter_text = 0 /obj/item/weapon/technomancer_catalog/apprentice @@ -72,15 +80,23 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu if(!assistance_instances.len) for(var/A in all_technomancer_assistance) assistance_instances += new A() - if(!preset_instances.len) - for(var/P in all_technomancer_presets) - preset_instances += new P() /obj/item/weapon/technomancer_catalog/apprentice/set_up() ..() for(var/datum/technomancer/assistance/apprentice/A in assistance_instances) assistance_instances.Remove(A) +// Proc: show_categories() +// Parameters: 1 (category - the category link to display) +// Description: Shows an href link to go to a spell subcategory if the category is not already selected, otherwise is bold, to reduce +// code duplicating. +/obj/item/weapon/technomancer_catalog/proc/show_categories(var/category) + if(category) + if(spell_tab != category) + return "[category]" + else + return "[category]" + // Proc: attack_self() // Parameters: 1 (user - the mob clicking on the catelog) // Description: Shows an HTML window, to buy equipment and spells, if the user is the legitimate owner. Otherwise it cannot be used. @@ -100,13 +116,17 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu dat += "Functions | " dat += "Equipment | " dat += "Consumables | " - dat += "Assistance | " - dat += "Presets
" + dat += "Assistance
" dat += "You currently have a budget of [budget]/[max_budget].

" dat += "Refund Functions

" - for(var/datum/technomancer/spell in spell_instances) + + dat += "[show_categories(ALL_SPELLS)] | [show_categories(OFFENSIVE_SPELLS)] | [show_categories(DEFENSIVE_SPELLS)] | \ + [show_categories(UTILITY_SPELLS)] | [show_categories(SUPPORT_SPELLS)]
" + for(var/datum/technomancer/spell/spell in spell_instances) if(spell.hidden) continue + if(spell_tab != ALL_SPELLS && spell.category != spell_tab) + continue dat += "[spell.name]
" dat += "[spell.desc]
" if(show_scepter_text) @@ -123,8 +143,7 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu dat += "Functions | " dat += "Equipment | " dat += "Consumables | " - dat += "Assistance | " - dat += "Presets
" + dat += "Assistance
" dat += "You currently have a budget of [budget]/[max_budget].

" for(var/datum/technomancer/equipment/E in equipment_instances) dat += "[E.name]
" @@ -141,8 +160,7 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu dat += "Functions | " dat += "Equipment | " dat += "Consumables | " - dat += "Assistance | " - dat += "Presets
" + dat += "Assistance
" dat += "You currently have a budget of [budget]/[max_budget].

" for(var/datum/technomancer/consumable/C in consumable_instances) dat += "[C.name]
" @@ -159,8 +177,7 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu dat += "Functions | " dat += "Equipment | " dat += "Consumables | " - dat += "Assistance | " - dat += "Presets
" + dat += "Assistance
" dat += "You currently have a budget of [budget]/[max_budget].

" for(var/datum/technomancer/assistance/A in assistance_instances) dat += "[A.name]
" @@ -171,24 +188,6 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu dat += "Cannot afford!

" user << browse(dat, "window=radio") onclose(user, "radio") - if(4) //Presets - var/dat = "" - user.set_machine(src) - dat += "Functions | " - dat += "Equipment | " - dat += "Consumables | " - dat += "Assistance | " - dat += "Presets
" - dat += "You currently have a budget of [budget]/[max_budget].

" - for(var/datum/technomancer/presets/P in preset_instances) - dat += "[P.name]
" - dat += "[P.desc]
" - if(P.cost <= budget) - dat += "Purchase ([P.cost])

" - else - dat += "Cannot afford!

" - user << browse(dat, "window=radio") - onclose(user, "radio") // Proc: Topic() // Parameters: 2 (href - don't know, href_list - the choice that the person using the interface above clicked on.) @@ -210,6 +209,8 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu H.set_machine(src) if(href_list["tab_choice"]) tab = text2num(href_list["tab_choice"]) + if(href_list["spell_category"]) + spell_tab = href_list["spell_category"] if(href_list["spell_choice"]) var/datum/technomancer/new_spell = null //Locate the spell. @@ -269,4 +270,4 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu budget += spell_datum.cost core.remove_spell(spell) break - attack_self(H) \ No newline at end of file + attack_self(H) diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm index efec413e309..2e0fe3833a0 100644 --- a/code/game/gamemodes/technomancer/equipment.dm +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -82,8 +82,7 @@ /obj/item/weapon/storage/belt/holding name = "Belt of Holding" desc = "Can hold more than you'd expect." - icon_state = "emsbelt" - item_state = "emsbelt" + icon_state = "ems" max_w_class = 3 // Can hold normal sized items. storage_slots = 14 // Twice the capacity of a typical belt. max_storage_space = 42 diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index 5d5432fa4e9..6be83aef7b9 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -212,4 +212,4 @@ outgoing_instability = outgoing_instability * armor_factor H.adjust_instability(outgoing_instability) - set_light(distance, distance, l_color = "#C26DDE") + set_light(distance, distance * 2, l_color = "#C26DDE") diff --git a/code/game/gamemodes/technomancer/spells/abjuration.dm b/code/game/gamemodes/technomancer/spells/abjuration.dm index 6e4f7d73b32..2422ef00bfc 100644 --- a/code/game/gamemodes/technomancer/spells/abjuration.dm +++ b/code/game/gamemodes/technomancer/spells/abjuration.dm @@ -4,6 +4,7 @@ far away from the caster. Failing that, it may inhibit those entities in some form." cost = 40 obj_path = /obj/item/weapon/spell/abjuration + category = UTILITY_SPELLS /obj/item/weapon/spell/abjuration name = "abjuration" diff --git a/code/game/gamemodes/technomancer/spells/apportation.dm b/code/game/gamemodes/technomancer/spells/apportation.dm index ad4fcdc9efa..150559b9cdd 100644 --- a/code/game/gamemodes/technomancer/spells/apportation.dm +++ b/code/game/gamemodes/technomancer/spells/apportation.dm @@ -4,6 +4,7 @@ will grab them automatically." cost = 50 obj_path = /obj/item/weapon/spell/apportation + category = UTILITY_SPELLS /obj/item/weapon/spell/apportation name = "apportation" diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm index 38b55c1342e..06930828afb 100644 --- a/code/game/gamemodes/technomancer/spells/audible_deception.dm +++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm @@ -6,6 +6,7 @@ cost = 150 obj_path = /obj/item/weapon/spell/audible_deception ability_icon_state = "tech_audibledeception" + category = UTILITY_SPELLS /obj/item/weapon/spell/audible_deception name = "audible deception" diff --git a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm index a1c0940f14e..52cbdfbfdf9 100644 --- a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm @@ -4,6 +4,7 @@ cost = 150 obj_path = /obj/item/weapon/spell/aura/biomed ability_icon_state = "tech_biomedaura" + category = SUPPORT_SPELLS /obj/item/weapon/spell/aura/biomed name = "restoration aura" diff --git a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm index 83ab173762a..0c28f31577a 100644 --- a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm @@ -7,6 +7,7 @@ cost = 150 obj_path = /obj/item/weapon/spell/aura/fire ability_icon_state = "tech_fireaura" + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/aura/fire name = "Fire Storm" @@ -20,7 +21,6 @@ qdel(src) var/list/nearby_things = range(4,owner) - var/fire_prob = 10 var/temp_change = 25 var/temp_cap = 500 var/fire_power = 2 @@ -28,7 +28,6 @@ if(check_for_scepter()) temp_change = 50 temp_cap = 700 - fire_prob = 25 fire_power = 4 for(var/mob/living/carbon/human/H in nearby_things) if(is_ally(H)) @@ -41,16 +40,11 @@ turf_check: for(var/turf/simulated/T in nearby_things) - if(prob(fire_prob)) + if(prob(30)) for(var/mob/living/carbon/human/H in T) if(is_ally(H)) continue turf_check T.hotspot_expose(1000, 50, 1) T.create_fire(fire_power) - -// //We use hotspot_expose() to allow firesuits to protect from this aura. -// var/turf/location = get_turf(H) -// location.hotspot_expose(1000, 50, 1) - owner.adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm index 44bd8feea0d..d5dd78b793d 100644 --- a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm @@ -6,6 +6,7 @@ cost = 150 obj_path = /obj/item/weapon/spell/aura/frost ability_icon_state = "tech_frostaura" + category = DEFENSIVE_SPELLS // Scepter-less frost aura is nonlethal. /obj/item/weapon/spell/aura/frost name = "chilling aura" @@ -35,8 +36,4 @@ var/cold_factor = abs(protection - 1) H.bodytemperature = max( (H.bodytemperature - temp_change) * cold_factor, temp_cap) -// //We use hotspot_expose() to allow firesuits to protect from this aura. -// var/turf/location = get_turf(H) -// location.hotspot_expose(1, 50, 1) - owner.adjust_instability(1) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm index a270ef16e35..a9e50b2fa3a 100644 --- a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm @@ -4,6 +4,7 @@ cost = 150 obj_path = /obj/item/weapon/spell/aura/shock ability_icon_state = "tech_shockaura" + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/aura/shock name = "electric aura" diff --git a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm index 6307d2f4ca2..15aae46ad32 100644 --- a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm @@ -5,6 +5,7 @@ cost = 150 obj_path = /obj/item/weapon/spell/aura/unstable ability_icon_state = "tech_unstableaura" + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/aura/unstable name = "degen aura" diff --git a/code/game/gamemodes/technomancer/spells/blink.dm b/code/game/gamemodes/technomancer/spells/blink.dm index 43ca683fd58..9dae12e39e7 100644 --- a/code/game/gamemodes/technomancer/spells/blink.dm +++ b/code/game/gamemodes/technomancer/spells/blink.dm @@ -5,6 +5,7 @@ enhancement_desc = "Blink distance is increased greatly." cost = 100 obj_path = /obj/item/weapon/spell/blink + category = UTILITY_SPELLS /obj/item/weapon/spell/blink name = "blink" diff --git a/code/game/gamemodes/technomancer/spells/chroma.dm b/code/game/gamemodes/technomancer/spells/chroma.dm index fb459620c0f..18c4afcf659 100644 --- a/code/game/gamemodes/technomancer/spells/chroma.dm +++ b/code/game/gamemodes/technomancer/spells/chroma.dm @@ -4,6 +4,7 @@ useful to trick someone into believing you're casting a different spell, or perhaps just for fun." cost = 25 obj_path = /obj/item/weapon/spell/chroma + category = UTILITY_SPELLS /obj/item/weapon/spell/chroma name = "chroma" diff --git a/code/game/gamemodes/technomancer/spells/condensation.dm b/code/game/gamemodes/technomancer/spells/condensation.dm index 9425b920a59..285f414f153 100644 --- a/code/game/gamemodes/technomancer/spells/condensation.dm +++ b/code/game/gamemodes/technomancer/spells/condensation.dm @@ -5,6 +5,7 @@ ability_icon_state = "tech_condensation" cost = 50 obj_path = /obj/item/weapon/spell/condensation + category = UTILITY_SPELLS /obj/item/weapon/spell/condensation name = "condensation" diff --git a/code/game/gamemodes/technomancer/spells/control.dm b/code/game/gamemodes/technomancer/spells/control.dm index 566f3d7ceb5..b5eaad8f44a 100644 --- a/code/game/gamemodes/technomancer/spells/control.dm +++ b/code/game/gamemodes/technomancer/spells/control.dm @@ -7,6 +7,7 @@ around the entity is merely a hologram used to allow the user to know if the creature is safe or not." cost = 200 obj_path = /obj/item/weapon/spell/control + category = UTILITY_SPELLS /mob/living/carbon/human/proc/technomancer_control() place_spell_in_hand(/obj/item/weapon/spell/control) diff --git a/code/game/gamemodes/technomancer/spells/dispel.dm b/code/game/gamemodes/technomancer/spells/dispel.dm index e0de7920c10..771bc6b6258 100644 --- a/code/game/gamemodes/technomancer/spells/dispel.dm +++ b/code/game/gamemodes/technomancer/spells/dispel.dm @@ -6,6 +6,7 @@ cost = 25 obj_path = /obj/item/weapon/spell/dispel ability_icon_state = "tech_dispel" + category = SUPPORT_SPELLS /obj/item/weapon/spell/dispel name = "dispel" diff --git a/code/game/gamemodes/technomancer/spells/energy_siphon.dm b/code/game/gamemodes/technomancer/spells/energy_siphon.dm index 0657111f159..0e8e23ffd8b 100644 --- a/code/game/gamemodes/technomancer/spells/energy_siphon.dm +++ b/code/game/gamemodes/technomancer/spells/energy_siphon.dm @@ -7,6 +7,7 @@ cost = 150 obj_path = /obj/item/weapon/spell/energy_siphon ability_icon_state = "tech_energysiphon" + category = UTILITY_SPELLS /obj/item/weapon/spell/energy_siphon name = "energy siphon" diff --git a/code/game/gamemodes/technomancer/spells/flame_tongue.dm b/code/game/gamemodes/technomancer/spells/flame_tongue.dm index 772ee579cc4..5afa25ae90f 100644 --- a/code/game/gamemodes/technomancer/spells/flame_tongue.dm +++ b/code/game/gamemodes/technomancer/spells/flame_tongue.dm @@ -4,6 +4,7 @@ cost = 100 obj_path = /obj/item/weapon/spell/flame_tongue ability_icon_state = "tech_flametongue" + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/flame_tongue name = "flame tongue" diff --git a/code/game/gamemodes/technomancer/spells/gambit.dm b/code/game/gamemodes/technomancer/spells/gambit.dm index 797536cc456..0541e5473ed 100644 --- a/code/game/gamemodes/technomancer/spells/gambit.dm +++ b/code/game/gamemodes/technomancer/spells/gambit.dm @@ -4,6 +4,7 @@ ability_icon_state = "tech_gambit" cost = 50 obj_path = /obj/item/weapon/spell/gambit + category = UTILITY_SPELLS /var/global/list/all_technomancer_gambit_spells = typesof(/obj/item/weapon/spell) - list( /obj/item/weapon/spell, diff --git a/code/game/gamemodes/technomancer/spells/illusion.dm b/code/game/gamemodes/technomancer/spells/illusion.dm index 3c725063204..e450e4480fc 100644 --- a/code/game/gamemodes/technomancer/spells/illusion.dm +++ b/code/game/gamemodes/technomancer/spells/illusion.dm @@ -5,6 +5,7 @@ cost = 100 obj_path = /obj/item/weapon/spell/illusion ability_icon_state = "tech_illusion" + category = UTILITY_SPELLS /obj/item/weapon/spell/illusion name = "illusion" diff --git a/code/game/gamemodes/technomancer/spells/insert/corona.dm b/code/game/gamemodes/technomancer/spells/insert/corona.dm index fbeb2555178..bde3ee99843 100644 --- a/code/game/gamemodes/technomancer/spells/insert/corona.dm +++ b/code/game/gamemodes/technomancer/spells/insert/corona.dm @@ -5,6 +5,7 @@ cost = 100 obj_path = /obj/item/weapon/spell/insert/corona ability_icon_state = "tech_corona" + category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/corona name = "corona" diff --git a/code/game/gamemodes/technomancer/spells/insert/haste.dm b/code/game/gamemodes/technomancer/spells/insert/haste.dm index a378d98b875..8a3455701a6 100644 --- a/code/game/gamemodes/technomancer/spells/insert/haste.dm +++ b/code/game/gamemodes/technomancer/spells/insert/haste.dm @@ -1,10 +1,11 @@ /datum/technomancer/spell/haste name = "Haste" - desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For three seconds, the target \ + desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For five seconds, the target \ runs extremly fast, and cannot be slowed by any means." cost = 100 obj_path = /obj/item/weapon/spell/insert/haste ability_icon_state = "tech_haste" + category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/haste name = "haste" @@ -22,7 +23,7 @@ L.force_max_speed = 1 L << "You suddenly find it much easier to move." L.adjust_instability(10) - spawn(3 SECONDS) + spawn(5 SECONDS) if(src) on_expire() diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm b/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm index 37a9be3b189..6588f1617f9 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm @@ -5,6 +5,7 @@ cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_burns ability_icon_state = "tech_mendburns" + category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/mend_burns name = "mend burns" @@ -19,10 +20,10 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host - for(var/i = 0, i<25,i++) + for(var/i = 0, i<5,i++) if(H) - H.adjustFireLoss(-1) - H.adjust_instability(0.5) - origin.adjust_instability(0.5) + H.adjustFireLoss(-5) + H.adjust_instability(2.5) + origin.adjust_instability(2.5) sleep(10) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm b/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm index 3d621dc5ed2..7ad6976b54b 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm @@ -4,6 +4,7 @@ cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_metal ability_icon_state = "tech_mendwounds" + category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/mend_metal name = "mend metal" @@ -18,14 +19,14 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host - for(var/i = 0, i<25,i++) + for(var/i = 0, i<5,i++) if(H) for(var/obj/item/organ/external/O in H.organs) if(O.robotic < ORGAN_ROBOT) // Robot parts only. continue - O.heal_damage(1, 0, internal = 1, robo_repair = 1) + O.heal_damage(5, 0, internal = 1, robo_repair = 1) - H.adjust_instability(0.5) - origin.adjust_instability(0.5) - sleep(10) + H.adjust_instability(2.5) + origin.adjust_instability(2.5) + sleep(1 SECOND) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm index cdc319dd735..e9450b95869 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm @@ -5,6 +5,7 @@ cost = 75 obj_path = /obj/item/weapon/spell/insert/mend_organs ability_icon_state = "tech_mendwounds" + category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/mend_organs name = "mend organs" @@ -19,13 +20,13 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host - for(var/i = 0, i<25,i++) + for(var/i = 0, i<5,i++) if(H) for(var/obj/item/organ/O in H.internal_organs) if(O.damage > 0) - O.damage = max(O.damage - 0.2, 0) + O.damage = max(O.damage - 1, 0) - H.adjust_instability(0.5) - origin.adjust_instability(0.5) - sleep(10) + H.adjust_instability(2.5) + origin.adjust_instability(2.5) + sleep(1 SECOND) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm index 6f24704d4a9..fbafb7c0447 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm @@ -5,6 +5,7 @@ cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_wires ability_icon_state = "tech_mendwounds" + category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/mend_wires name = "mend wires" @@ -19,14 +20,14 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host - for(var/i = 0, i<25,i++) + for(var/i = 0, i<5,i++) if(H) for(var/obj/item/organ/external/O in H.organs) if(O.robotic < ORGAN_ROBOT) // Robot parts only. continue - O.heal_damage(0, 1, internal = 1, robo_repair = 1) + O.heal_damage(0, 5, internal = 1, robo_repair = 1) - H.adjust_instability(0.5) - origin.adjust_instability(0.5) + H.adjust_instability(2.5) + origin.adjust_instability(2.5) sleep(10) on_expire() \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm index 5ae40915d0b..c1c507b5528 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm @@ -5,6 +5,7 @@ cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_wounds ability_icon_state = "tech_mendwounds" + category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/mend_wounds name = "mend wounds" @@ -19,10 +20,10 @@ spawn(1) if(ishuman(host)) var/mob/living/carbon/human/H = host - for(var/i = 0, i<25,i++) + for(var/i = 0, i<5,i++) if(H) - H.adjustBruteLoss(-1) - H.adjust_instability(0.5) - origin.adjust_instability(0.5) - sleep(10) + H.adjustBruteLoss(-5) + H.adjust_instability(2.5) + origin.adjust_instability(2.5) + sleep(1 SECOND) on_expire() diff --git a/code/game/gamemodes/technomancer/spells/insert/purify.dm b/code/game/gamemodes/technomancer/spells/insert/purify.dm index 0f5d404c4e7..7ca94f78e61 100644 --- a/code/game/gamemodes/technomancer/spells/insert/purify.dm +++ b/code/game/gamemodes/technomancer/spells/insert/purify.dm @@ -1,10 +1,11 @@ /datum/technomancer/spell/purify name = "Purify" - desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, and such. \ + desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such. \ Instability is split between the target and technomancer, if seperate." cost = 25 obj_path = /obj/item/weapon/spell/insert/purify ability_icon_state = "tech_purify" + category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/purify name = "purify" @@ -23,12 +24,12 @@ H.disabilities = 0 // for(var/datum/disease/D in H.viruses) // D.cure() - for(var/i = 0, i<25,i++) + for(var/i = 0, i<5,i++) if(H) - H.adjustToxLoss(-1) - H.adjustCloneLoss(-1) - H.radiation = max(host.radiation - 2, 0) - H.adjust_instability(0.5) - origin.adjust_instability(0.5) - sleep(10) + H.adjustToxLoss(-5) + H.adjustCloneLoss(-5) + H.radiation = max(host.radiation - 10, 0) + H.adjust_instability(2.5) + origin.adjust_instability(2.5) + sleep(1 SECOND) on_expire() diff --git a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm b/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm index 9ebeda9676c..8fb549039fb 100644 --- a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm +++ b/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm @@ -1,10 +1,11 @@ /datum/technomancer/spell/repel_missiles name = "Repel Missiles" desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \ - to hit you. The field lasts for two minutes and can be granted to yourself or an ally." + to hit you. The field lasts for five minutes and can be granted to yourself or an ally." cost = 60 obj_path = /obj/item/weapon/spell/insert/repel_missiles ability_icon_state = "tech_repelmissiles" + category = SUPPORT_SPELLS /obj/item/weapon/spell/insert/repel_missiles name = "repel missiles" @@ -21,7 +22,7 @@ var/mob/living/L = host L.evasion += 2 L << "You have a repulsion field around you, which will attempt to deflect projectiles." - spawn(2 MINUTES) + spawn(5 MINUTES) if(src) on_expire() diff --git a/code/game/gamemodes/technomancer/spells/instability_tap.dm b/code/game/gamemodes/technomancer/spells/instability_tap.dm index 07f7db42fea..ada2989444c 100644 --- a/code/game/gamemodes/technomancer/spells/instability_tap.dm +++ b/code/game/gamemodes/technomancer/spells/instability_tap.dm @@ -5,6 +5,7 @@ cost = 120 obj_path = /obj/item/weapon/spell/instability_tap ability_icon_state = "tech_instabilitytap" + category = UTILITY_SPELLS /obj/item/weapon/spell/instability_tap name = "instability tap" diff --git a/code/game/gamemodes/technomancer/spells/mark_recall.dm b/code/game/gamemodes/technomancer/spells/mark_recall.dm index 0fe6be78084..63e6d67fad4 100644 --- a/code/game/gamemodes/technomancer/spells/mark_recall.dm +++ b/code/game/gamemodes/technomancer/spells/mark_recall.dm @@ -6,6 +6,7 @@ cost = 50 obj_path = /obj/item/weapon/spell/mark ability_icon_state = "tech_mark" + category = UTILITY_SPELLS //The object to teleport to when Recall is used. /obj/effect/mark_spell @@ -52,6 +53,7 @@ cost = 50 obj_path = /obj/item/weapon/spell/recall ability_icon_state = "tech_recall" + category = UTILITY_SPELLS /obj/item/weapon/spell/recall name = "recall" diff --git a/code/game/gamemodes/technomancer/spells/oxygenate.dm b/code/game/gamemodes/technomancer/spells/oxygenate.dm index 9acda5227a9..3f9bb6f9e5b 100644 --- a/code/game/gamemodes/technomancer/spells/oxygenate.dm +++ b/code/game/gamemodes/technomancer/spells/oxygenate.dm @@ -5,6 +5,7 @@ cost = 70 obj_path = /obj/item/weapon/spell/oxygenate ability_icon_state = "oxygenate" + category = SUPPORT_SPELLS /obj/item/weapon/spell/oxygenate name = "oxygenate" diff --git a/code/game/gamemodes/technomancer/spells/passwall.dm b/code/game/gamemodes/technomancer/spells/passwall.dm index faffe94972c..aa16a8a4fc6 100644 --- a/code/game/gamemodes/technomancer/spells/passwall.dm +++ b/code/game/gamemodes/technomancer/spells/passwall.dm @@ -6,6 +6,7 @@ cost = 100 obj_path = /obj/item/weapon/spell/passwall ability_icon_state = "tech_passwall" + category = UTILITY_SPELLS /obj/item/weapon/spell/passwall name = "passwall" @@ -21,53 +22,55 @@ if(!allowed_to_teleport()) user << "You can't teleport here!" return 0 - if(isturf(hit_atom)) - var/turf/T = hit_atom //Turf we touched. - var/turf/our_turf = get_turf(user) //Where we are. - if(!T.density) - user << "Perhaps you should try using passWALL on a wall." +// if(isturf(hit_atom)) + + var/turf/T = get_turf(hit_atom) //Turf we touched. + var/turf/our_turf = get_turf(user) //Where we are. + if(!T.density) + if(!T.check_density()) + user << "Perhaps you should try using passWALL on a wall, or other solid object." return 0 - var/direction = get_dir(our_turf, T) - var/total_cost = 0 - var/turf/checked_turf = T //Turf we're currently checking for density in the loop below. - var/turf/found_turf = null //Our destination, if one is found. - var/i = maximum_distance + var/direction = get_dir(our_turf, T) + var/total_cost = 0 + var/turf/checked_turf = T //Turf we're currently checking for density in the loop below. + var/turf/found_turf = null //Our destination, if one is found. + var/i = maximum_distance - visible_message("[user] rests a hand on \the [T].") - busy = 1 + visible_message("[user] rests a hand on \the [hit_atom].") + busy = 1 - var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread) - spark_system.set_up(5, 0, our_turf) + var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread) + spark_system.set_up(5, 0, our_turf) - while(i) - checked_turf = get_step(checked_turf, direction) //Advance in the given direction - total_cost += check_for_scepter() ? 400 : 800 //Phasing through matter's expensive, you know. - i-- - if(!checked_turf.density) //If we found a destination (a non-dense turf), then we can stop. - var/dense_objs_on_turf = 0 - for(var/atom/movable/stuff in checked_turf.contents) //Make sure nothing dense is where we want to go, like an airlock or window. - if(stuff.density) - dense_objs_on_turf = 1 + while(i) + checked_turf = get_step(checked_turf, direction) //Advance in the given direction + total_cost += check_for_scepter() ? 400 : 800 //Phasing through matter's expensive, you know. + i-- + if(!checked_turf.density) //If we found a destination (a non-dense turf), then we can stop. + var/dense_objs_on_turf = 0 + for(var/atom/movable/stuff in checked_turf.contents) //Make sure nothing dense is where we want to go, like an airlock or window. + if(stuff.density) + dense_objs_on_turf = 1 - if(!dense_objs_on_turf) //If we found a non-dense turf with nothing dense on it, then that's our destination. - found_turf = checked_turf - break - sleep(10) + if(!dense_objs_on_turf) //If we found a non-dense turf with nothing dense on it, then that's our destination. + found_turf = checked_turf + break + sleep(10) - if(found_turf) - if(user.loc != our_turf) - user << "You need to stand still in order to phase through the wall." - return 0 - if(pay_energy(total_cost) && !user.incapacitated() ) - visible_message("[user] appears to phase through \the [T]!") - user << "You find a destination on the other side of \the [T], and phase through it." - spark_system.start() - user.forceMove(found_turf) - qdel(src) - return 1 - else - user << "You don't have enough energy to phase through these walls!" - busy = 0 + if(found_turf) + if(user.loc != our_turf) + user << "You need to stand still in order to phase through \the [hit_atom]." + return 0 + if(pay_energy(total_cost) && !user.incapacitated() ) + visible_message("[user] appears to phase through \the [hit_atom]!") + user << "You find a destination on the other side of \the [hit_atom], and phase through it." + spark_system.start() + user.forceMove(found_turf) + qdel(src) + return 1 else - user << "You weren't able to find an open space to go to." + user << "You don't have enough energy to phase through these walls!" busy = 0 + else + user << "You weren't able to find an open space to go to." + busy = 0 diff --git a/code/game/gamemodes/technomancer/spells/phase_shift.dm b/code/game/gamemodes/technomancer/spells/phase_shift.dm index 142134abc9f..20fb033872e 100644 --- a/code/game/gamemodes/technomancer/spells/phase_shift.dm +++ b/code/game/gamemodes/technomancer/spells/phase_shift.dm @@ -4,6 +4,7 @@ draining your powercell." cost = 80 obj_path = /obj/item/weapon/spell/phase_shift + category = DEFENSIVE_SPELLS /obj/item/weapon/spell/phase_shift name = "phase shift" diff --git a/code/game/gamemodes/technomancer/spells/projectile/beam.dm b/code/game/gamemodes/technomancer/spells/projectile/beam.dm index bfee4ec3f17..429a83dd9bb 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/beam.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/beam.dm @@ -4,6 +4,7 @@ cost = 150 ability_icon_state = "tech_beam" obj_path = /obj/item/weapon/spell/projectile/beam + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/projectile/beam name = "beam" @@ -12,12 +13,13 @@ cast_methods = CAST_RANGED aspect = ASPECT_LIGHT spell_projectile = /obj/item/projectile/beam/blue - energy_cost_per_shot = 500 + energy_cost_per_shot = 400 instability_per_shot = 3 cooldown = 10 + fire_sound = 'sound/weapons/Laser.ogg' /obj/item/projectile/beam/blue - damage = 20 + damage = 30 muzzle_type = /obj/effect/projectile/laser_blue/muzzle tracer_type = /obj/effect/projectile/laser_blue/tracer diff --git a/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm b/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm index 5d4da458a08..7cdd4565e28 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm @@ -5,6 +5,7 @@ strike up to four targets, including yourself if conditions allow it to occur." cost = 150 obj_path = /obj/item/weapon/spell/projectile/chain_lightning + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/projectile/chain_lightning name = "chain lightning" @@ -16,6 +17,7 @@ energy_cost_per_shot = 3000 instability_per_shot = 10 cooldown = 20 + fire_sound = 'sound/weapons/gauss_shoot.ogg' /obj/item/projectile/beam/chain_lightning name = "lightning" diff --git a/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm b/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm index c13d2363d89..dad3c88f45d 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm @@ -4,6 +4,7 @@ that armor designed to protect from blunt force will mitigate this function as well." cost = 100 obj_path = /obj/item/weapon/spell/projectile/force_missile + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/projectile/force_missile name = "force missile" @@ -12,13 +13,14 @@ cast_methods = CAST_RANGED aspect = ASPECT_FORCE spell_projectile = /obj/item/projectile/force_missile - energy_cost_per_shot = 400 + energy_cost_per_shot = 300 instability_per_shot = 2 - cooldown = 10 + cooldown = 5 + fire_sound = 'sound/weapons/wave.ogg' /obj/item/projectile/force_missile name = "force missile" icon_state = "force_missile" - damage = 20 + damage = 25 damage_type = BRUTE check_armour = "melee" \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/spells/projectile/lightning.dm b/code/game/gamemodes/technomancer/spells/projectile/lightning.dm index 3c77f89b0f0..c4b69a923a8 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/lightning.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/lightning.dm @@ -5,6 +5,7 @@ strike." cost = 150 obj_path = /obj/item/weapon/spell/projectile/lightning + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/projectile/lightning name = "lightning strike" @@ -16,7 +17,8 @@ energy_cost_per_shot = 2500 instability_per_shot = 10 cooldown = 20 - pre_shot_delay = 20 + pre_shot_delay = 10 + fire_sound = 'sound/weapons/gauss_shoot.ogg' /obj/item/projectile/beam/lightning name = "lightning" diff --git a/code/game/gamemodes/technomancer/spells/projectile/overload.dm b/code/game/gamemodes/technomancer/spells/projectile/overload.dm index 8a3debd4ae5..e6f0c898e23 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/overload.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/overload.dm @@ -4,6 +4,7 @@ This energy pierces all known armor." cost = 150 obj_path = /obj/item/weapon/spell/projectile/overload + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/projectile/overload name = "overload" @@ -13,27 +14,28 @@ aspect = ASPECT_UNSTABLE spell_projectile = /obj/item/projectile/overload energy_cost_per_shot = 0 // Handled later - instability_per_shot = 15 + instability_per_shot = 12 cooldown = 10 pre_shot_delay = 4 + fire_sound = 'sound/effects/supermatter.ogg' /obj/item/projectile/overload name = "overloaded bolt" icon_state = "bluespace" // nodamage = 1 damage_type = BURN - check_armour = null + armor_penetration = 100 /obj/item/weapon/spell/projectile/overload/on_ranged_cast(atom/hit_atom, mob/living/user) - energy_cost_per_shot = round(core.max_energy * 0.15) + energy_cost_per_shot = round(core.max_energy * 0.10) var/energy_before_firing = core.energy if(set_up(hit_atom, user)) var/obj/item/projectile/overload/P = new spell_projectile(get_turf(user)) P.launch(hit_atom) if(check_for_scepter()) - P.damage = round(energy_before_firing * 0.003) // 3% of their current energy pool. + P.damage = round(energy_before_firing * 0.004) // 4% of their current energy pool. else - P.damage = round(energy_before_firing * 0.002) // 2% of their current energy pool. + P.damage = round(energy_before_firing * 0.003) // 3% of their current energy pool. owner.adjust_instability(instability_per_shot) return 1 diff --git a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm index d4e8474aed2..69e1efc92fd 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm @@ -7,12 +7,15 @@ var/energy_cost_per_shot = 0 var/instability_per_shot = 0 var/pre_shot_delay = 0 + var/fire_sound = null /obj/item/weapon/spell/projectile/on_ranged_cast(atom/hit_atom, mob/living/user) var/turf/T = get_turf(hit_atom) if(set_up(hit_atom, user)) var/obj/item/projectile/new_projectile = new spell_projectile(get_turf(user)) new_projectile.launch(T) + if(fire_sound) + playsound(get_turf(src), fire_sound, 75, 1) owner.adjust_instability(instability_per_shot) return 1 return 0 @@ -23,7 +26,7 @@ if(pre_shot_delay) var/image/target_image = image(icon = 'icons/obj/spells.dmi', loc = get_turf(hit_atom), icon_state = "target") user << target_image - user.Stun(pre_shot_delay) + user.Stun(pre_shot_delay / 10) sleep(pre_shot_delay) qdel(target_image) return 1 diff --git a/code/game/gamemodes/technomancer/spells/radiance.dm b/code/game/gamemodes/technomancer/spells/radiance.dm index b8eb1401f12..9d484ddc5c6 100644 --- a/code/game/gamemodes/technomancer/spells/radiance.dm +++ b/code/game/gamemodes/technomancer/spells/radiance.dm @@ -3,6 +3,7 @@ desc = "Causes you to be very radiant, glowing brightly in visible light, thermal energy, and deadly ionizing radiation." cost = 180 obj_path = /obj/item/weapon/spell/radiance + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/radiance name = "radiance" diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm index 6944bd49bce..7a8fa0a4de6 100644 --- a/code/game/gamemodes/technomancer/spells/reflect.dm +++ b/code/game/gamemodes/technomancer/spells/reflect.dm @@ -4,6 +4,7 @@ cost = 120 obj_path = /obj/item/weapon/spell/reflect ability_icon_state = "tech_reflect" + category = DEFENSIVE_SPELLS /obj/item/weapon/spell/reflect name = "\proper reflect shield" diff --git a/code/game/gamemodes/technomancer/spells/resurrect.dm b/code/game/gamemodes/technomancer/spells/resurrect.dm index 2aee98bc1e3..dcdcbb1f187 100644 --- a/code/game/gamemodes/technomancer/spells/resurrect.dm +++ b/code/game/gamemodes/technomancer/spells/resurrect.dm @@ -6,6 +6,7 @@ cost = 100 obj_path = /obj/item/weapon/spell/resurrect ability_icon_state = "tech_resurrect" + category = SUPPORT_SPELLS /obj/item/weapon/spell/resurrect name = "resurrect" diff --git a/code/game/gamemodes/technomancer/spells/shared_burden.dm b/code/game/gamemodes/technomancer/spells/shared_burden.dm index c7e8e35107c..95523d99ff7 100644 --- a/code/game/gamemodes/technomancer/spells/shared_burden.dm +++ b/code/game/gamemodes/technomancer/spells/shared_burden.dm @@ -3,6 +3,7 @@ desc = "One of the few functions able to adjust instability, this allows you to take someone else's instability." cost = 50 obj_path = /obj/item/weapon/spell/shared_burden + category = SUPPORT_SPELLS /obj/item/weapon/spell/shared_burden name = "shared burden" diff --git a/code/game/gamemodes/technomancer/spells/shield.dm b/code/game/gamemodes/technomancer/spells/shield.dm index 807ea698a2b..330de0ff266 100644 --- a/code/game/gamemodes/technomancer/spells/shield.dm +++ b/code/game/gamemodes/technomancer/spells/shield.dm @@ -5,6 +5,7 @@ cost = 120 obj_path = /obj/item/weapon/spell/shield ability_icon_state = "tech_shield" + category = DEFENSIVE_SPELLS /obj/item/weapon/spell/shield name = "\proper energy shield" diff --git a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm index 627be97e363..ac5e799d729 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm @@ -3,6 +3,7 @@ desc = "Disrupts photons moving in a local area, causing darkness to shroud yourself or a position of your choosing." cost = 30 obj_path = /obj/item/weapon/spell/spawner/darkness + category = UTILITY_SPELLS /obj/item/weapon/spell/spawner/darkness name = "darkness" diff --git a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm index 7cf519ddbda..50ed504b40a 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm @@ -4,6 +4,7 @@ sure to not be close to the disturbance yourself." cost = 175 obj_path = /obj/item/weapon/spell/spawner/fire_blast + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/spawner/fire_blast name = "fire blast" diff --git a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm index 4704cda8b9d..a2c22b0f76c 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm @@ -3,6 +3,7 @@ desc = "Emits electronic pulses to destroy, disable, or otherwise harm devices and machines. Be sure to not hit yourself with this." cost = 150 obj_path = /obj/item/weapon/spell/spawner/pulsar + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/spawner/pulsar name = "pulsar" diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm b/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm index eac1c67b409..497a8422bdf 100644 --- a/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm +++ b/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm @@ -8,6 +8,7 @@ enhancement_desc = "Summoned entities will never harm their summoner." cost = 200 obj_path = /obj/item/weapon/spell/summon/summon_creature + category = UTILITY_SPELLS /obj/item/weapon/spell/summon/summon_creature name = "summon creature" diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm index 1bbab4d2998..5323c5beda2 100644 --- a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm +++ b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm @@ -5,6 +5,7 @@ enhancement_desc = "Wards can detect invisibile entities, and are more specific in relaying information about what it sees." cost = 100 obj_path = /obj/item/weapon/spell/summon/summon_ward + category = UTILITY_SPELLS /obj/item/weapon/spell/summon/summon_ward name = "summon ward" diff --git a/code/game/gamemodes/technomancer/spells/targeting_matrix.dm b/code/game/gamemodes/technomancer/spells/targeting_matrix.dm index a74aab2ff56..aff00f0197b 100644 --- a/code/game/gamemodes/technomancer/spells/targeting_matrix.dm +++ b/code/game/gamemodes/technomancer/spells/targeting_matrix.dm @@ -5,6 +5,7 @@ cost = 150 ability_icon_state = "tech_targetingmatrix" obj_path = /obj/item/weapon/spell/targeting_matrix + category = UTILITY_SPELLS /obj/item/weapon/spell/targeting_matrix name = "targeting matrix" diff --git a/code/game/gamemodes/technomancer/spells/track.dm b/code/game/gamemodes/technomancer/spells/track.dm index 90e65182004..166f3f5b439 100644 --- a/code/game/gamemodes/technomancer/spells/track.dm +++ b/code/game/gamemodes/technomancer/spells/track.dm @@ -3,9 +3,10 @@ desc = "Acts as directional guidance towards an object that belongs to you or your team. It can also point towards your allies. \ Wonderful if you're worried someone will steal your valuables, like a certain shiny Scepter..." enhancement_desc = "You will be able to track most other entities in addition to your belongings and allies." - cost = 30 + cost = 25 obj_path = /obj/item/weapon/spell/track ability_icon_state = "tech_track" + category = UTILITY_SPELLS // This stores a ref to all important items that belong to a Technomancer, in case of theft. Used by the spell below. // I feel dirty for adding yet another global list used by one thing, but the only alternative is to loop through world, and yeahhh. diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm index ffb97498998..a308066ae5a 100644 --- a/code/game/gamemodes/technomancer/spells/warp_strike.dm +++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm @@ -4,6 +4,7 @@ cost = 200 obj_path = /obj/item/weapon/spell/warp_strike ability_icon_state = "tech_warpstrike" + category = OFFENSIVE_SPELLS /obj/item/weapon/spell/warp_strike name = "warp strike" diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index c4b5d787a44..13b03e00e61 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -11,8 +11,8 @@ friends and family as they try to use your emotions and trust to their advantage, leaving you with nothing \ but the painful reminder that space is cruel and unforgiving." config_tag = "traitor" - required_players = 0 - required_players_secret = 5 + required_players = 1 + required_players_secret = 1 required_enemies = 1 end_on_antag_death = 0 antag_tags = list(MODE_TRAITOR) @@ -23,5 +23,5 @@ config_tag = "autotraitor" antag_tags = list(MODE_AUTOTRAITOR) round_autoantag = 1 - required_players_secret = 3 + required_players_secret = 1 antag_scaling_coeff = 5 diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 4e28c4e5775..349f0edb14b 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -5,7 +5,7 @@ config_tag = "wizard" votable = 0 required_players = 1 - required_players_secret = 6 + required_players_secret = 3 required_enemies = 1 end_on_antag_death = 0 antag_tags = list(MODE_WIZARD) diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 514d3cf0478..c091a599c34 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -1,7 +1,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) /datum/job/captain - title = "Captain" + title = "Station Administrator" flag = CAPTAIN department = "Command" head_position = 1 @@ -11,7 +11,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) spawn_positions = 1 supervisors = "company officials and Corporate Regulations" selection_color = "#1D1D4F" - alt_titles = list("Station Administrator") + alt_titles = list("Site Manager") idtype = /obj/item/weapon/card/id/gold req_admin_notify = 1 access = list() //See get_access() @@ -69,7 +69,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the station administrator" selection_color = "#2F2F7F" idtype = /obj/item/weapon/card/id/silver alt_titles = list("Crew Resources Officer") diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index c02048450b6..b617c65da9e 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -105,6 +105,7 @@ economic_modifier = 5 access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) + alt_titles = list("Supply Chief") ideal_character_age = 40 @@ -133,10 +134,9 @@ supervisors = "the quartermaster and the head of personnel" selection_color = "#515151" idtype = /obj/item/weapon/card/id/cargo - access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) + access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) - equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear) @@ -160,7 +160,7 @@ selection_color = "#515151" idtype = /obj/item/weapon/card/id/cargo economic_modifier = 5 - access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) + access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station) minimal_access = list(access_mining, access_mining_station, access_mailsorting) alt_titles = list("Drill Technician","Prospector") @@ -201,7 +201,7 @@ idtype = /obj/item/weapon/card/id/civilian access = list(access_janitor, access_maint_tunnels) minimal_access = list(access_janitor, access_maint_tunnels) - alt_titles = list("Custodian") + alt_titles = list("Custodian", "Sanitation Technician") equip(var/mob/living/carbon/human/H) @@ -228,7 +228,7 @@ idtype = /obj/item/weapon/card/id/civilian access = list(access_library, access_maint_tunnels) minimal_access = list(access_library) - alt_titles = list("Journalist") + alt_titles = list("Journalist", "Professor", "Historian") equip(var/mob/living/carbon/human/H) diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm index 9ce0e2b8118..26065fe1e9e 100644 --- a/code/game/jobs/job/civilian_chaplain.dm +++ b/code/game/jobs/job/civilian_chaplain.dm @@ -11,7 +11,7 @@ selection_color = "#515151" idtype = /obj/item/weapon/card/id/civilian access = list(access_morgue, access_chapel_office, access_crematorium, access_maint_tunnels) - minimal_access = list(access_morgue, access_chapel_office, access_crematorium) + minimal_access = list(access_chapel_office, access_crematorium) alt_titles = list("Counselor") diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 1a9351496e1..53c642b8160 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the station administrator" selection_color = "#7F6E2C" idtype = /obj/item/weapon/card/id/engineering/head req_admin_notify = 1 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 08faeff78b0..69a94f0ade7 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the station administrator" selection_color = "#026865" idtype = /obj/item/weapon/card/id/medical/head req_admin_notify = 1 @@ -35,7 +35,7 @@ H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) + H.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(H), slot_s_store) return 1 /datum/job/doctor @@ -94,7 +94,7 @@ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store) + H.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(H), slot_s_store) return 1 diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 7055aa7cb37..891ecc27154 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the station administrator" selection_color = "#AD6BAD" idtype = /obj/item/weapon/card/id/science/head req_admin_notify = 1 @@ -20,6 +20,7 @@ access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch) + alt_titles = list("Research Supervisor") minimum_character_age = 25 minimal_player_age = 14 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 04adecc3229..071c1cbf1bc 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the station administrator" selection_color = "#8E2929" idtype = /obj/item/weapon/card/id/security/head req_admin_notify = 1 @@ -20,6 +20,7 @@ access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) + alt_titles = list("Commander") minimum_character_age = 25 minimal_player_age = 14 diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 14d772437d6..dd07f7a7166 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -343,10 +343,12 @@ var/global/datum/controller/occupations/job_master permitted = 1 if(G.whitelisted && !is_alien_whitelisted(H, all_species[G.whitelisted])) + + //if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted))) permitted = 0 if(!permitted) - H << "Your current job or whitelist status does not permit you to spawn with [thing]!" + H << "Your current species, job or whitelist status does not permit you to spawn with [thing]!" continue if(G.slot && !(G.slot in custom_equip_slots)) @@ -427,9 +429,9 @@ var/global/datum/controller/occupations/job_master return H.Robotize() if("AI") return H - if("Captain") + if("Station Administrator") var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP)? null : sound('sound/misc/boatswain.ogg', volume=20) - captain_announcement.Announce("All hands, Captain [H.real_name] on deck!", new_sound=announce_sound) + captain_announcement.Announce("All hands, [alt_title ? alt_title : "Station Administrator"] [H.real_name] on deck!", new_sound=announce_sound) //Deferred item spawning. if(spawn_in_storage && spawn_in_storage.len) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 35026659dd2..61324580ffe 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -51,7 +51,7 @@ var/list/assistant_occupations = list( var/list/command_positions = list( - "Captain", + "Station Administrator", "Head of Personnel", "Head of Security", "Chief Engineer", diff --git a/code/game/jobs/whitelist.dm b/code/game/jobs/whitelist.dm index 4d7106d2134..9a13e066a54 100644 --- a/code/game/jobs/whitelist.dm +++ b/code/game/jobs/whitelist.dm @@ -75,7 +75,7 @@ var/list/whitelist = list() /proc/whitelist_overrides(mob/M) if(!config.usealienwhitelist) return 1 - if(check_rights(R_ADMIN, 0)) + if(check_rights(R_ADMIN, 0, M)) return 1 return 0 diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index ac736ddfe29..c59c67c3001 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -1,5 +1,4 @@ /obj/machinery/bluespace_beacon - icon = 'icons/obj/objects.dmi' icon_state = "floor_beaconf" name = "Bluespace Gigabeacon" @@ -11,45 +10,42 @@ idle_power_usage = 0 var/obj/item/device/radio/beacon/Beacon - New() - ..() - var/turf/T = loc +/obj/machinery/bluespace_beacon/New() + ..() + var/turf/T = src.loc + Beacon = new /obj/item/device/radio/beacon + Beacon.invisibility = INVISIBILITY_MAXIMUM + Beacon.loc = T + + hide(!T.is_plating()) + +/obj/machinery/bluespace_beacon/Destroy() + if(Beacon) + qdel(Beacon) + ..() + +// update the invisibility and icon +/obj/machinery/bluespace_beacon/hide(var/intact) + invisibility = intact ? 101 : 0 + updateicon() + +// update the icon_state +/obj/machinery/bluespace_beacon/proc/updateicon() + var/state="floor_beacon" + + if(invisibility) + icon_state = "[state]f" + else + icon_state = "[state]" + +/obj/machinery/bluespace_beacon/process() + if(!Beacon) + var/turf/T = src.loc Beacon = new /obj/item/device/radio/beacon Beacon.invisibility = INVISIBILITY_MAXIMUM Beacon.loc = T + if(Beacon) + if(Beacon.loc != src.loc) + Beacon.loc = src.loc - hide(!T.is_plating()) - - Destroy() - if(Beacon) - qdel(Beacon) - ..() - - // update the invisibility and icon - hide(var/intact) - invisibility = intact ? 101 : 0 - updateicon() - - // update the icon_state - proc/updateicon() - var/state="floor_beacon" - - if(invisibility) - icon_state = "[state]f" - - else - icon_state = "[state]" - - process() - if(!Beacon) - var/turf/T = loc - Beacon = new /obj/item/device/radio/beacon - Beacon.invisibility = INVISIBILITY_MAXIMUM - Beacon.loc = T - if(Beacon) - if(Beacon.loc != loc) - Beacon.loc = loc - - updateicon() - - + updateicon() \ No newline at end of file diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 277742a22be..a5625e9253b 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -1,6 +1,5 @@ /obj/machinery/cablelayer name = "automatic cable layer" - icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" density = 1 @@ -42,7 +41,7 @@ m = min(m, cable.amount) m = min(m, 30) if(m) - playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) use_cable(m) var/obj/item/stack/cable_coil/CC = new (get_turf(src)) CC.amount = m diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 8f0a0535b14..ba083031e75 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -10,41 +10,39 @@ active_power_usage = 5 var/mob/living/carbon/human/victim = null var/strapped = 0.0 - var/obj/machinery/computer/operating/computer = null /obj/machinery/optable/New() ..() for(dir in list(NORTH,EAST,SOUTH,WEST)) computer = locate(/obj/machinery/computer/operating, get_step(src, dir)) - if (computer) + if(computer) computer.table = src break // spawn(100) //Wont the MC just call this process() before and at the 10 second mark anyway? // process() /obj/machinery/optable/ex_act(severity) - switch(severity) if(1.0) //SN src = null qdel(src) return if(2.0) - if (prob(50)) + if(prob(50)) //SN src = null qdel(src) return if(3.0) - if (prob(25)) - src.density = 0 + if(prob(25)) + density = 0 else return /obj/machinery/optable/attack_hand(mob/user as mob) - if (HULK in usr.mutations) + if(HULK in usr.mutations) visible_message("\The [usr] destroys \the [src]!") - src.density = 0 + density = 0 qdel(src) return @@ -56,13 +54,12 @@ else return 0 - /obj/machinery/optable/MouseDrop_T(obj/O as obj, mob/user as mob) - if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O)) + if((!(istype(O, /obj/item/weapon)) || user.get_active_hand() != O)) return user.drop_item() - if (O.loc != src.loc) + if(O.loc != src.loc) step(O, get_dir(O, src)) return @@ -70,10 +67,10 @@ if(locate(/mob/living/carbon/human, src.loc)) var/mob/living/carbon/human/M = locate(/mob/living/carbon/human, src.loc) if(M.lying) - src.victim = M + victim = M icon_state = M.pulse ? "table2-active" : "table2-idle" return 1 - src.victim = null + victim = null icon_state = "table2-idle" return 0 @@ -81,21 +78,21 @@ check_victim() /obj/machinery/optable/proc/take_victim(mob/living/carbon/C, mob/living/carbon/user as mob) - if (C == user) + if(C == user) user.visible_message("[user] climbs on \the [src].","You climb on \the [src].") else visible_message("\The [C] has been laid on \the [src] by [user].", 3) - if (C.client) + if(C.client) C.client.perspective = EYE_PERSPECTIVE C.client.eye = src C.resting = 1 C.loc = src.loc for(var/obj/O in src) O.loc = src.loc - src.add_fingerprint(user) + add_fingerprint(user) if(ishuman(C)) var/mob/living/carbon/human/H = C - src.victim = H + victim = H icon_state = H.pulse ? "table2-active" : "table2-idle" else icon_state = "table2-idle" @@ -121,7 +118,7 @@ take_victim(usr,usr) /obj/machinery/optable/attackby(obj/item/weapon/W as obj, mob/living/carbon/user as mob) - if (istype(W, /obj/item/weapon/grab)) + if(istype(W, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W if(iscarbon(G.affecting) && check_table(G.affecting)) take_victim(G.affecting,usr) @@ -130,10 +127,10 @@ /obj/machinery/optable/proc/check_table(mob/living/carbon/patient as mob) check_victim() - if(src.victim && get_turf(victim) == get_turf(src) && victim.lying) + if(victim && get_turf(victim) == get_turf(src) && victim.lying) usr << "\The [src] is already occupied!" return 0 if(patient.buckled) usr << "Unbuckle \the [patient] first!" return 0 - return 1 + return 1 \ No newline at end of file diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index c0ef428f998..7193a7907b8 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -2,7 +2,7 @@ name = "Sleeper Console" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "sleeperconsole" - var/obj/machinery/sleeper/connected = null + var/obj/machinery/sleeper/sleeper anchored = 1 //About time someone fixed this. density = 0 dir = 8 @@ -11,21 +11,19 @@ interact_offline = 1 circuit = /obj/item/weapon/circuitboard/sleeper_console -//obj/machinery/sleep_console/New() - //..() - //spawn( 5 ) - //src.connected = locate(/obj/machinery/sleeper, get_step(src, WEST)) //We assume dir = 8 so sleeper is WEST. Other sprites do exist. - //return - //return - /obj/machinery/sleep_console/New() ..() - spawn(5) - //src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir)) - src.connected = locate(/obj/machinery/sleeper) in range(2,src) - return - return + findsleeper() +/obj/machinery/sleep_console/proc/findsleeper() + spawn(5) + var/obj/machinery/sleeper/sleepernew = null + for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction + sleepernew = locate(/obj/machinery/sleeper, get_step(src, dir)) // Try to find a scanner in that direction + if(sleepernew) + sleeper = sleepernew + sleepernew.console = src + return /obj/machinery/sleep_console/attack_ai(var/mob/user) return attack_hand(user) @@ -33,39 +31,25 @@ /obj/machinery/sleep_console/attack_hand(var/mob/user) if(..()) return 1 - if(connected) - connected.ui_interact(user) + + if(sleeper.panel_open) + user << "Close the maintenance panel first." + return + + if(!sleeper) + findsleeper() + if(sleeper) + return sleeper.ui_interact(user) + else if(sleeper) + return sleeper.ui_interact(user) + else + user << "Sleeper not found!" /obj/machinery/sleep_console/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.circuit = M - A.anchored = 1 - A.density = 1 - A.frame_type = M.board_type - for (var/obj/C in src) - C.forceMove(loc) - if (src.stat & BROKEN) - user << "The broken glass falls out." - new /obj/item/weapon/material/shard( src.loc ) - A.state = 3 - A.icon_state = "[A.frame_type]_3" - else - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "[A.frame_type]_4" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.dir = dir - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return else - src.attack_hand(user) - return + return attack_hand(user) /obj/machinery/sleep_console/power_change() ..() @@ -86,6 +70,7 @@ var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 + var/obj/machinery/sleep_console/console use_power = 1 idle_power_usage = 15 @@ -94,7 +79,6 @@ /obj/machinery/sleeper/New() ..() beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src) @@ -105,13 +89,6 @@ component_parts += new /obj/item/weapon/reagent_containers/syringe(src) component_parts += new /obj/item/stack/material/glass/reinforced(src, 2) - spawn(5) - //src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir)) - var/obj/machinery/sleep_console/C = locate(/obj/machinery/sleep_console) in range(2,src) - if(C) - C.connected = src - return - RefreshParts() /obj/machinery/sleeper/initialize() @@ -208,12 +185,12 @@ return 1 /obj/machinery/sleeper/attackby(var/obj/item/I, var/mob/user) + add_fingerprint(user) if(default_deconstruction_screwdriver(user, I)) return - if(default_deconstruction_crowbar(user, I)) + else if(default_deconstruction_crowbar(user, I)) return - add_fingerprint(user) - if(istype(I, /obj/item/weapon/reagent_containers/glass)) + else if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(!beaker) beaker = I user.drop_item() @@ -283,21 +260,21 @@ if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE - occupant.loc = loc + occupant.loc = src.loc occupant = null for(var/atom/movable/A in src) // In case an object was dropped inside or something if(A == beaker || A == circuit) continue if(A in component_parts) continue - A.loc = loc + A.loc = src.loc update_use_power(1) update_icon() toggle_filter() /obj/machinery/sleeper/proc/remove_beaker() if(beaker) - beaker.loc = loc + beaker.loc = src.loc beaker = null toggle_filter() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 43ca9d2fc3f..9d90f018ef5 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -1,6 +1,5 @@ // Pretty much everything here is stolen from the dna scanner FYI - /obj/machinery/bodyscanner var/mob/living/carbon/occupant var/locked @@ -9,25 +8,15 @@ icon_state = "body_scanner_0" density = 1 anchored = 1 - circuit = /obj/item/weapon/circuitboard/body_scanner - use_power = 1 idle_power_usage = 60 active_power_usage = 10000 //10 kW. It's a big all-body scanner. - light_color = "#00FF00" + var/obj/machinery/body_scanconsole/console /obj/machinery/bodyscanner/New() ..() - spawn( 5 ) - var/obj/machinery/body_scanconsole/C = locate(/obj/machinery/body_scanconsole) in range(2,src) - if(C) - C.connected = src - -/obj/machinery/bodyscanner/map/New() - ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) @@ -45,10 +34,9 @@ /obj/machinery/bodyscanner/attackby(var/obj/item/G, user as mob) if(default_deconstruction_screwdriver(user, G)) return - if(default_deconstruction_crowbar(user, G)) + else if(default_deconstruction_crowbar(user, G)) return - - if(istype(G, /obj/item/weapon/grab)) + else if(istype(G, /obj/item/weapon/grab)) var/obj/item/weapon/grab/H = G if(panel_open) user << "Close the maintenance panel first." @@ -126,14 +114,14 @@ add_fingerprint(usr) /obj/machinery/bodyscanner/proc/go_out() - if ((!( src.occupant ) || src.locked)) + if ((!(occupant) || src.locked)) return - if (src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE - src.occupant.loc = src.loc - src.occupant = null - src.icon_state = "body_scanner_0" + if (occupant.client) + occupant.client.eye = occupant.client.mob + occupant.client.perspective = MOB_PERSPECTIVE + occupant.loc = src.loc + occupant = null + icon_state = "body_scanner_0" return /obj/machinery/bodyscanner/ex_act(severity) @@ -169,7 +157,7 @@ //Body Scan Console /obj/machinery/body_scanconsole - var/obj/machinery/bodyscanner/connected + var/obj/machinery/bodyscanner/scanner var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking) var/delete var/temphtml @@ -188,35 +176,22 @@ findscanner() /obj/machinery/body_scanconsole/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.circuit = M - A.anchored = 1 - A.density = 1 - A.frame_type = M.board_type - for (var/obj/C in src) - C.forceMove(loc) - if (src.stat & BROKEN) - user << "The broken glass falls out." - new /obj/item/weapon/material/shard( src.loc ) - A.state = 3 - A.icon_state = "[A.frame_type]_3" - else - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "[A.frame_type]_4" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.dir = dir - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return + else if(istype(I, /obj/item/device/multitool)) //Did you want to link it? + var/obj/item/device/multitool/P = I + if(P.connectable) + if(istype(P.connectable, /obj/machinery/bodyscanner)) + var/obj/machinery/bodyscanner/C = P.connectable + scanner = C + C.console = src + user << " You link the [src] to the [P.connectable]!" + else + user << " You store the [src] in the [P]'s buffer!" + P.connectable = src + return else - src.attack_hand(user) - return + return attack_hand(user) /obj/machinery/body_scanconsole/power_change() if(stat & BROKEN) @@ -226,7 +201,7 @@ stat &= ~NOPOWER else spawn(rand(0, 15)) - src.icon_state = "body_scannerconsole-p" + icon_state = "body_scannerconsole-p" stat |= NOPOWER /obj/machinery/body_scanconsole/ex_act(severity) @@ -244,13 +219,14 @@ return /obj/machinery/body_scanconsole/proc/findscanner() - spawn( 5 ) + spawn(5) var/obj/machinery/bodyscanner/bodyscannernew = null // Loop through every direction - for(dir in list(NORTH,EAST,SOUTH,WEST)) - // Try to find a scanner in that direction - bodyscannernew = locate(/obj/machinery/bodyscanner, get_step(src, dir)) - src.connected = bodyscannernew + for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction + bodyscannernew = locate(/obj/machinery/bodyscanner, get_step(src, dir)) // Try to find a scanner in that direction + if(bodyscannernew) + scanner = bodyscannernew + bodyscannernew.console = src return /obj/machinery/body_scanconsole/attack_ai(user as mob) @@ -263,26 +239,30 @@ if(stat & (NOPOWER|BROKEN)) return - if (panel_open) + if (scanner.panel_open) user << "Close the maintenance panel first." return - if(!src.connected) + if(!scanner) findscanner() - - ui_interact(user) + if(scanner) + return ui_interact(user) + else if(scanner) + return ui_interact(user) + else + user << "Scanner not found!" /obj/machinery/body_scanconsole/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] - data["connected"] = connected ? 1 : 0 + data["connected"] = scanner ? 1 : 0 - if(connected) - data["occupied"] = connected.occupant ? 1 : 0 + if(scanner) + data["occupied"] = scanner.occupant ? 1 : 0 var/occupantData[0] - if(connected.occupant && ishuman(connected.occupant)) - var/mob/living/carbon/human/H = connected.occupant + if(scanner.occupant && ishuman(scanner.occupant)) + var/mob/living/carbon/human/H = scanner.occupant occupantData["name"] = H.name occupantData["stat"] = H.stat occupantData["health"] = H.health @@ -410,7 +390,7 @@ visible_message("\The [src] rattles and prints out a sheet of paper.") var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) P.info = "
Body Scan - [href_list["name"]]

" - P.info += "Time of scan: [worldtime2text(world.time)]

" + P.info += "Time of scan: [worldtime2stationtime(world.time)]

" P.info += "[printing_text]" P.info += "

Notes:
" P.name = "Body Scan - [href_list["name"]]" @@ -420,8 +400,8 @@ /obj/machinery/body_scanconsole/proc/generate_printing_text() var/dat = "" - if(connected) - var/mob/living/carbon/human/occupant = connected.occupant + if(scanner) + var/mob/living/carbon/human/occupant = scanner.occupant dat = "Occupant Statistics:
" //Blah obvious if(istype(occupant)) //is there REALLY someone in there? var/t1 diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 9d45b14414e..0ea5527df21 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -15,7 +15,6 @@ var/cooldown_on = 0 req_access = list(access_ai_upload) - /obj/machinery/ai_slipper/New() ..() update_icon() @@ -25,32 +24,32 @@ update_icon() /obj/machinery/ai_slipper/update_icon() - if (stat & NOPOWER || stat & BROKEN) + if(stat & NOPOWER || stat & BROKEN) icon_state = "motion0" else icon_state = disabled ? "motion0" : "motion3" /obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses) - src.disabled = disabled - src.uses = uses - src.power_change() + disabled = disabled + uses = uses + power_change() /obj/machinery/ai_slipper/attackby(obj/item/weapon/W, mob/user) if(stat & (NOPOWER|BROKEN)) return - if (istype(user, /mob/living/silicon)) - return src.attack_hand(user) + if(istype(user, /mob/living/silicon)) + return attack_hand(user) else // trying to unlock the interface - if (src.allowed(usr)) + if(allowed(usr)) locked = !locked user << "You [ locked ? "lock" : "unlock"] the device." - if (locked) - if (user.machine==src) + if(locked) + if(user.machine==src) user.unset_machine() user << browse(null, "window=ai_slipper") else - if (user.machine==src) - src.attack_hand(usr) + if(user.machine==src) + attack_hand(usr) else user << "Access denied." return @@ -62,8 +61,8 @@ /obj/machinery/ai_slipper/attack_hand(mob/user as mob) if(stat & (NOPOWER|BROKEN)) return - if ( (get_dist(src, user) > 1 )) - if (!istype(user, /mob/living/silicon)) + if((get_dist(src, user) > 1)) + if(!istype(user, /mob/living/silicon)) user << text("Too far away.") user.unset_machine() user << browse(null, "window=ai_slipper") @@ -71,18 +70,18 @@ user.set_machine(src) var/loc = src.loc - if (istype(loc, /turf)) + if(istype(loc, /turf)) loc = loc:loc - if (!istype(loc, /area)) + if(!istype(loc, /area)) user << text("Turret badly positioned - loc.loc is [].", loc) return var/area/area = loc var/t = "AI Liquid Dispenser ([area.name])
" - if(src.locked && (!istype(user, /mob/living/silicon))) + if(locked && (!istype(user, /mob/living/silicon))) t += "(Swipe ID card to unlock control panel.)
" else - t += text("Dispenser [] - []?
\n", src.disabled?"deactivated":"activated", src, src.disabled?"Enable":"Disable") + t += text("Dispenser [] - []?
\n", disabled?"deactivated":"activated", src, disabled?"Enable":"Disable") t += text("Uses Left: [uses]. Activate the dispenser?
\n") user << browse(t, "window=computer;size=575x450") @@ -91,25 +90,25 @@ /obj/machinery/ai_slipper/Topic(href, href_list) ..() - if (src.locked) - if (!istype(usr, /mob/living/silicon)) + if(locked) + if(!istype(usr, /mob/living/silicon)) usr << "Control panel is locked!" return - if (href_list["toggleOn"]) - src.disabled = !src.disabled + if(href_list["toggleOn"]) + disabled = !disabled update_icon() - if (href_list["toggleUse"]) + if(href_list["toggleUse"]) if(cooldown_on || disabled) return else new /obj/effect/effect/foam(src.loc) - src.uses-- + uses-- cooldown_on = 1 cooldown_time = world.timeofday + 100 slip_process() return - src.attack_hand(usr) + attack_hand(usr) return /obj/machinery/ai_slipper/proc/slip_process() @@ -122,9 +121,9 @@ cooldown_timeleft = (ticksleft / 10) sleep(5) - if (uses <= 0) + if(uses <= 0) return - if (uses >= 0) + if(uses >= 0) cooldown_on = 0 - src.power_change() - return + power_change() + return \ No newline at end of file diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 699898fde07..398bac9c544 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -51,10 +51,10 @@ var/rcon_setting = 2 var/rcon_time = 0 var/locked = 1 - var/wiresexposed = 0 // If it's been screwdrivered open. + panel_open = 0 // If it's been screwdrivered open. var/aidisabled = 0 var/shorted = 0 - circuit = /obj/item/weapon/circuitboard/airalarm + circuit = /obj/item/weapon/circuitboard/airalarm var/datum/wires/alarm/wires @@ -112,7 +112,7 @@ /obj/machinery/alarm/proc/first_run() alarm_area = get_area(src) area_uid = alarm_area.uid - if (name == "alarm") + if(name == "alarm") name = "[alarm_area.name] Air Alarm" if(!wires) @@ -123,20 +123,20 @@ TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa TLV["phoron"] = list(-1.0, -1.0, 0.2, 0.5) // Partial pressure, kpa TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa - TLV["pressure"] = list(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.10,ONE_ATMOSPHERE*1.20) /* kpa */ - TLV["temperature"] = list(T0C-26, T0C, T0C+40, T0C+66) // K + TLV["pressure"] = list(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE * 0.90, ONE_ATMOSPHERE * 1.10, ONE_ATMOSPHERE * 1.20) /* kpa */ + TLV["temperature"] = list(T0C - 26, T0C, T0C + 40, T0C + 66) // K /obj/machinery/alarm/initialize() set_frequency(frequency) - if (!master_is_operating()) + if(!master_is_operating()) elect_master() /obj/machinery/alarm/process() if((stat & (NOPOWER|BROKEN)) || shorted) return - var/turf/simulated/location = loc + var/turf/simulated/location = src.loc if(!istype(location)) return//returns if loc is not simulated var/datum/gas_mixture/environment = location.return_air() @@ -148,16 +148,16 @@ var/old_pressurelevel = pressure_dangerlevel danger_level = overall_danger_level(environment) - if (old_level != danger_level) + if(old_level != danger_level) apply_danger_level(danger_level) - if (old_pressurelevel != pressure_dangerlevel) - if (breach_detected()) + if(old_pressurelevel != pressure_dangerlevel) + if(breach_detected()) mode = AALARM_MODE_OFF apply_mode() - if (mode==AALARM_MODE_CYCLE && environment.return_pressure() 2.0) update_use_power(2) @@ -184,13 +184,13 @@ "You hear a click and a faint electronic hum.") else //check for when we should stop adjusting temperature - if (get_danger_level(target_temperature, TLV["temperature"]) || abs(environment.temperature - target_temperature) <= 0.5) + if(get_danger_level(target_temperature, TLV["temperature"]) || abs(environment.temperature - target_temperature) <= 0.5) update_use_power(1) regulating_temperature = 0 visible_message("\The [src] clicks quietly as it stops [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ "You hear a click as a faint electronic humming stops.") - if (regulating_temperature) + if(regulating_temperature) if(target_temperature > T0C + MAX_TEMPERATURE) target_temperature = T0C + MAX_TEMPERATURE @@ -198,11 +198,11 @@ target_temperature = T0C + MIN_TEMPERATURE var/datum/gas_mixture/gas - gas = environment.remove(0.25*environment.total_moles) + gas = environment.remove(0.25 * environment.total_moles) if(gas) - if (gas.temperature <= target_temperature) //gas heating - var/energy_used = min( gas.get_thermal_energy_change(target_temperature) , active_power_usage) + if(gas.temperature <= target_temperature) //gas heating + var/energy_used = min(gas.get_thermal_energy_change(target_temperature) , active_power_usage) gas.add_thermal_energy(energy_used) //use_power(energy_used, ENVIRON) //handle by update_use_power instead @@ -212,7 +212,7 @@ //Assume the heat is being pumped into the hull which is fixed at 20 C //none of this is really proper thermodynamics but whatever - var/cop = gas.temperature/T20C //coefficient of performance -> power used = heat_transfer/cop + var/cop = gas.temperature / T20C //coefficient of performance -> power used = heat_transfer/cop heat_transfer = min(heat_transfer, cop * active_power_usage) //this ensures that we don't use more than active_power_usage amount of power @@ -223,7 +223,7 @@ environment.merge(gas) /obj/machinery/alarm/proc/overall_danger_level(var/datum/gas_mixture/environment) - var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume + var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature/environment.volume var/environment_pressure = environment.return_pressure() var/other_moles = 0 @@ -248,7 +248,7 @@ // Returns whether this air alarm thinks there is a breach, given the sensors that are available to it. /obj/machinery/alarm/proc/breach_detected() - var/turf/simulated/location = loc + var/turf/simulated/location = src.loc if(!istype(location)) return 0 @@ -260,20 +260,18 @@ var/environment_pressure = environment.return_pressure() var/pressure_levels = TLV["pressure"] - if (environment_pressure <= pressure_levels[1]) //low pressures - if (!(mode == AALARM_MODE_PANIC || mode == AALARM_MODE_CYCLE)) + if(environment_pressure <= pressure_levels[1]) //low pressures + if(!(mode == AALARM_MODE_PANIC || mode == AALARM_MODE_CYCLE)) return 1 return 0 - /obj/machinery/alarm/proc/master_is_operating() - return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN)) - + return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER | BROKEN)) /obj/machinery/alarm/proc/elect_master() - for (var/obj/machinery/alarm/AA in alarm_area) - if (!(AA.stat & (NOPOWER|BROKEN))) + for(var/obj/machinery/alarm/AA in alarm_area) + if(!(AA.stat & (NOPOWER|BROKEN))) alarm_area.master_air_alarm = AA return 1 return 0 @@ -286,7 +284,7 @@ return 0 /obj/machinery/alarm/update_icon() - if(wiresexposed) + if(panel_open) icon_state = "alarmx" set_light(0) return @@ -296,18 +294,18 @@ return var/icon_level = danger_level - if (alarm_area.atmosalm) + if(alarm_area.atmosalm) icon_level = max(icon_level, 1) //if there's an atmos alarm but everything is okay locally, no need to go past yellow var/new_color = null switch(icon_level) - if (0) + if(0) icon_state = "alarm0" new_color = "#03A728" - if (1) + if(1) icon_state = "alarm2" //yes, alarm2 is yellow alarm new_color = "#EC8B2F" - if (2) + if(2) icon_state = "alarm1" new_color = "#DA0205" @@ -316,20 +314,20 @@ /obj/machinery/alarm/receive_signal(datum/signal/signal) if(stat & (NOPOWER|BROKEN)) return - if (alarm_area.master_air_alarm != src) - if (master_is_operating()) + if(alarm_area.master_air_alarm != src) + if(master_is_operating()) return elect_master() - if (alarm_area.master_air_alarm != src) + if(alarm_area.master_air_alarm != src) return if(!signal || signal.encryption) return var/id_tag = signal.data["tag"] - if (!id_tag) + if(!id_tag) return - if (signal.data["area"] != area_uid) + if(signal.data["area"] != area_uid) return - if (signal.data["sigtype"] != "status") + if(signal.data["sigtype"] != "status") return var/dev_type = signal.data["device"] @@ -342,28 +340,28 @@ /obj/machinery/alarm/proc/register_env_machine(var/m_id, var/device_type) var/new_name - if (device_type=="AVP") + if(device_type == "AVP") new_name = "[alarm_area.name] Vent Pump #[alarm_area.air_vent_names.len+1]" alarm_area.air_vent_names[m_id] = new_name - else if (device_type=="AScr") + else if(device_type == "AScr") new_name = "[alarm_area.name] Air Scrubber #[alarm_area.air_scrub_names.len+1]" alarm_area.air_scrub_names[m_id] = new_name else return - spawn (10) - send_signal(m_id, list("init" = new_name) ) + spawn(10) + send_signal(m_id, list("init" = new_name)) /obj/machinery/alarm/proc/refresh_all() for(var/id_tag in alarm_area.air_vent_names) var/list/I = alarm_area.air_vent_info[id_tag] - if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) + if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time) continue - send_signal(id_tag, list("status") ) + send_signal(id_tag, list("status")) for(var/id_tag in alarm_area.air_scrub_names) var/list/I = alarm_area.air_scrub_info[id_tag] - if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) + if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time) continue - send_signal(id_tag, list("status") ) + send_signal(id_tag, list("status")) /obj/machinery/alarm/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) @@ -390,42 +388,42 @@ /obj/machinery/alarm/proc/apply_mode() //propagate mode to other air alarms in the area //TODO: make it so that players can choose between applying the new mode to the room they are in (related area) vs the entire alarm area - for (var/obj/machinery/alarm/AA in alarm_area) + for(var/obj/machinery/alarm/AA in alarm_area) AA.mode = mode switch(mode) if(AALARM_MODE_SCRUBBING) for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 1, "co2_scrub"= 1, "scrubbing"= 1, "panic_siphon"= 0) ) + send_signal(device_id, list("power"= 1, "co2_scrub"= 1, "scrubbing"= 1, "panic_siphon"= 0)) for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default") ) + send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default")) if(AALARM_MODE_PANIC, AALARM_MODE_CYCLE) for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 1, "panic_siphon"= 1) ) + send_signal(device_id, list("power"= 1, "panic_siphon"= 1)) for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 0) ) + send_signal(device_id, list("power"= 0)) if(AALARM_MODE_REPLACEMENT) for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 1, "panic_siphon"= 1) ) + send_signal(device_id, list("power"= 1, "panic_siphon"= 1)) for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default") ) + send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default")) if(AALARM_MODE_FILL) for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 0) ) + send_signal(device_id, list("power"= 0)) for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default") ) + send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default")) if(AALARM_MODE_OFF) for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 0) ) + send_signal(device_id, list("power"= 0)) for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 0) ) + send_signal(device_id, list("power"= 0)) /obj/machinery/alarm/proc/apply_danger_level(var/new_danger_level) - if (report_danger_level && alarm_area.atmosalert(new_danger_level, src)) + if(report_danger_level && alarm_area.atmosalert(new_danger_level, src)) post_alert(new_danger_level) update_icon() @@ -443,9 +441,9 @@ if(alert_level==2) alert_signal.data["alert"] = "severe" - else if (alert_level==1) + else if(alert_level==1) alert_signal.data["alert"] = "minor" - else if (alert_level==0) + else if(alert_level==0) alert_signal.data["alert"] = "clear" frequency.post_signal(src, alert_signal) @@ -455,7 +453,7 @@ /obj/machinery/alarm/attack_hand(mob/user) . = ..() - if (.) + if(.) return return interact(user) @@ -485,7 +483,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) - ui = new(user, src, ui_key, "air_alarm.tmpl", src.name, 325, 625, master_ui = master_ui, state = state) + ui = new(user, src, ui_key, "air_alarm.tmpl", name, 325, 625, master_ui = master_ui, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -570,7 +568,7 @@ "carbon dioxide" = "CO2", "phoron" = "Toxin", "other" = "Other") - for (var/g in gas_names) + for(var/g in gas_names) thresholds[++thresholds.len] = list("name" = gas_names[g], "settings" = list()) selected = TLV[g] for(var/i = 1, i <= 4, i++) @@ -586,7 +584,6 @@ for(var/i = 1, i <= 4, i++) thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = i, "selected" = selected[i])) - data["thresholds"] = thresholds /obj/machinery/alarm/CanUseTopic(var/mob/user, var/datum/topic_state/state, var/href_list = list()) @@ -660,7 +657,7 @@ "panic_siphon", "scrubbing") - send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]) ) ) + send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]))) return 1 if("set_threshold") @@ -668,16 +665,16 @@ var/threshold = text2num(href_list["var"]) var/list/selected = TLV[env] var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound") - var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null|num - if (isnull(newval)) + var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null | num + if(isnull(newval)) return 1 - if (newval<0) + if(newval<0) selected[threshold] = -1.0 - else if (env=="temperature" && newval>5000) + else if(env=="temperature" && newval>5000) selected[threshold] = 5000 - else if (env=="pressure" && newval>50*ONE_ATMOSPHERE) + else if(env=="pressure" && newval>50*ONE_ATMOSPHERE) selected[threshold] = 50*ONE_ATMOSPHERE - else if (env!="temperature" && env!="pressure" && newval>200) + else if(env!="temperature" && env!="pressure" && newval>200) selected[threshold] = 200 else newval = round(newval,0.01) @@ -727,13 +724,13 @@ return 1 if(href_list["atmos_alarm"]) - if (alarm_area.atmosalert(2, src)) + if(alarm_area.atmosalert(2, src)) apply_danger_level(2) update_icon() return 1 if(href_list["atmos_reset"]) - if (alarm_area.atmosalert(0, src)) + if(alarm_area.atmosalert(0, src)) apply_danger_level(0) update_icon() return 1 @@ -744,35 +741,13 @@ return 1 /obj/machinery/alarm/attackby(obj/item/W as obj, mob/user as mob) - src.add_fingerprint(user) - if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up. - //user << "You pop the Air Alarm's maintence panel open." - wiresexposed = !wiresexposed - user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" - update_icon() + add_fingerprint(user) + if(alarm_deconstruction_screwdriver(user, W)) + return + if(alarm_deconstruction_wirecutters(user, W)) return - if (wiresexposed && istype(W, /obj/item/weapon/wirecutters)) - user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - new/obj/item/stack/cable_coil(get_turf(src), 5) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "airalarm" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.set_dir(dir) - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - A.state = 2 - A.icon_state = "airalarm_2" - M.deconstruct(src) - qdel(src) - return - - if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card + if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card if(stat & (NOPOWER|BROKEN)) user << "It does nothing" return @@ -822,14 +797,14 @@ FIRE ALARM active_power_usage = 6 power_channel = ENVIRON var/last_process = 0 - var/wiresexposed = 0 + panel_open = 0 var/seclevel - circuit = /obj/item/weapon/circuitboard/firealarm + circuit = /obj/item/weapon/circuitboard/firealarm /obj/machinery/firealarm/update_icon() overlays.Cut() - if(wiresexposed) + if(panel_open) set_light(0) return @@ -840,7 +815,7 @@ FIRE ALARM icon_state = "firep" set_light(0) else - if(!src.detecting) + if(!detecting) icon_state = "fire1" set_light(l_range = 4, l_power = 2, l_color = "#ff0000") else @@ -851,79 +826,56 @@ FIRE ALARM if("red") set_light(l_range = 4, l_power = 2, l_color = "#ff0000") if("delta") set_light(l_range = 4, l_power = 2, l_color = "#FF6633") - src.overlays += image('icons/obj/monitors.dmi', "overlay_[seclevel]") + overlays += image('icons/obj/monitors.dmi', "overlay_[seclevel]") /obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume) - if(src.detecting) - if(temperature > T0C+200) - src.alarm() // added check of detector status here + if(detecting) + if(temperature > T0C + 200) + alarm() // added check of detector status here return /obj/machinery/firealarm/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/firealarm/bullet_act() - return src.alarm() + return alarm() /obj/machinery/firealarm/emp_act(severity) - if(prob(50/severity)) - alarm(rand(30/severity, 60/severity)) + if(prob(50 / severity)) + alarm(rand(30 / severity, 60 / severity)) ..() /obj/machinery/firealarm/attackby(obj/item/W as obj, mob/user as mob) - src.add_fingerprint(user) + add_fingerprint(user) - if (istype(W, /obj/item/weapon/screwdriver)) - wiresexposed = !wiresexposed - update_icon() - return - - if(wiresexposed) - if (istype(W, /obj/item/device/multitool)) - src.detecting = !( src.detecting ) - if (src.detecting) + if(panel_open) + if(istype(W, /obj/item/device/multitool)) + detecting = !(detecting) + if(detecting) user.visible_message("\The [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") else user.visible_message("\The [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") - else if (istype(W, /obj/item/weapon/wirecutters)) - user.visible_message("\The [user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") - new/obj/item/stack/cable_coil(get_turf(src), 5) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "firealarm" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.set_dir(dir) - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - A.state = 2 - A.icon_state = "firealarm_2" - M.deconstruct(src) - qdel(src) return - src.alarm() + alarm() return /obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed if(stat & (NOPOWER|BROKEN)) return - if(src.timing) - if(src.time > 0) - src.time = src.time - ((world.timeofday - last_process)/10) + if(timing) + if(time > 0) + time = time - ((world.timeofday - last_process) / 10) else - src.alarm() - src.time = 0 - src.timing = 0 + alarm() + time = 0 + timing = 0 processing_objects.Remove(src) - src.updateDialog() + updateDialog() last_process = world.timeofday - if(locate(/obj/fire) in loc) + if(locate(/obj/fire) in src.loc) alarm() return @@ -934,41 +886,41 @@ FIRE ALARM update_icon() /obj/machinery/firealarm/attack_hand(mob/user as mob) - if(user.stat || stat & (NOPOWER|BROKEN)) + if(user.stat || stat & (NOPOWER | BROKEN)) return user.set_machine(src) var/area/A = src.loc var/d1 var/d2 - if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) + if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) A = A.loc - if (A.fire) + if(A.fire) d1 = text("Reset - Lockdown", src) else d1 = text("Alarm - Lockdown", src) - if (src.timing) + if(timing) d2 = text("Stop Time Lock", src) else d2 = text("Initiate Time Lock", src) - var/second = round(src.time) % 60 - var/minute = (round(src.time) - second) / 60 + var/second = round(time) % 60 + var/minute = (round(time) - second) / 60 var/dat = "Fire alarm [d1]\n
The current alert level is: [get_security_level()]

\nTimer System: [d2]
\nTime Left: [(minute ? "[minute]:" : null)][second] - - + +\n
" user << browse(dat, "window=firealarm") onclose(user, "firealarm") else A = A.loc - if (A.fire) + if(A.fire) d1 = text("[]", src, stars("Reset - Lockdown")) else d1 = text("[]", src, stars("Alarm - Lockdown")) - if (src.timing) + if(timing) d2 = text("[]", src, stars("Stop Time Lock")) else d2 = text("[]", src, stars("Initiate Time Lock")) - var/second = round(src.time) % 60 - var/minute = (round(src.time) - second) / 60 + var/second = round(time) % 60 + var/minute = (round(time) - second) / 60 var/dat = "[stars("Fire alarm")] [d1]\n
The current alert level is: [stars(get_security_level())]

\nTimer System: [d2]
\nTime Left: [(minute ? text("[]:", minute) : null)][second] - - + +\n
" user << browse(dat, "window=firealarm") onclose(user, "firealarm") @@ -976,43 +928,43 @@ FIRE ALARM /obj/machinery/firealarm/Topic(href, href_list) ..() - if (usr.stat || stat & (BROKEN|NOPOWER)) + if(usr.stat || stat & (BROKEN | NOPOWER)) return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) - if (href_list["reset"]) - src.reset() - else if (href_list["alarm"]) - src.alarm() - else if (href_list["time"]) - src.timing = text2num(href_list["time"]) + if(href_list["reset"]) + reset() + else if(href_list["alarm"]) + alarm() + else if(href_list["time"]) + timing = text2num(href_list["time"]) last_process = world.timeofday processing_objects.Add(src) - else if (href_list["tp"]) + else if(href_list["tp"]) var/tp = text2num(href_list["tp"]) - src.time += tp - src.time = min(max(round(src.time), 0), 120) + time += tp + time = min(max(round(time), 0), 120) - src.updateUsrDialog() + updateUsrDialog() - src.add_fingerprint(usr) + add_fingerprint(usr) else usr << browse(null, "window=firealarm") return return /obj/machinery/firealarm/proc/reset() - if (!( src.working )) + if(!(working)) return var/area/area = get_area(src) for(var/obj/machinery/firealarm/FA in area) - fire_alarm.clearAlarm(loc, FA) + fire_alarm.clearAlarm(src.loc, FA) update_icon() return /obj/machinery/firealarm/proc/alarm(var/duration = 0) - if (!( src.working)) + if(!(working)) return var/area/area = get_area(src) for(var/obj/machinery/firealarm/FA in area) @@ -1066,13 +1018,13 @@ Just a object used in constructing fire alarms ASSERT(isarea(A)) var/d1 var/d2 - if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) + if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) - if (A.party) + if(A.party) d1 = text("No Party :(", src) else d1 = text("PARTY!!!", src) - if (timing) + if(timing) d2 = text("Stop Time Lock", src) else d2 = text("Initiate Time Lock", src) @@ -1082,11 +1034,11 @@ Just a object used in constructing fire alarms user << browse(dat, "window=partyalarm") onclose(user, "partyalarm") else - if (A.fire) + if(A.fire) d1 = text("[]", src, stars("No Party :(")) else d1 = text("[]", src, stars("PARTY!!!")) - if (timing) + if(timing) d2 = text("[]", src, stars("Stop Time Lock")) else d2 = text("[]", src, stars("Initiate Time Lock")) @@ -1098,7 +1050,7 @@ Just a object used in constructing fire alarms return /obj/machinery/partyalarm/proc/reset() - if (!( working )) + if(!(working)) return var/area/A = get_area(src) ASSERT(isarea(A)) @@ -1106,7 +1058,7 @@ Just a object used in constructing fire alarms return /obj/machinery/partyalarm/proc/alarm() - if (!( working )) + if(!(working)) return var/area/A = get_area(src) ASSERT(isarea(A)) @@ -1115,23 +1067,20 @@ Just a object used in constructing fire alarms /obj/machinery/partyalarm/Topic(href, href_list) ..() - if (usr.stat || stat & (BROKEN|NOPOWER)) + if(usr.stat || stat & (BROKEN|NOPOWER)) return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) + if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) usr.machine = src - if (href_list["reset"]) + if(href_list["reset"]) reset() - else - if (href_list["alarm"]) - alarm() - else - if (href_list["time"]) - timing = text2num(href_list["time"]) - else - if (href_list["tp"]) - var/tp = text2num(href_list["tp"]) - time += tp - time = min(max(round(time), 0), 120) + else if(href_list["alarm"]) + alarm() + else if(href_list["time"]) + timing = text2num(href_list["time"]) + else if(href_list["tp"]) + var/tp = text2num(href_list["tp"]) + time += tp + time = min(max(round(time), 0), 120) updateUsrDialog() add_fingerprint(usr) diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 19d1ee12532..83c6f81e305 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -58,7 +58,6 @@ signal.data["sigtype"]="status" radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - /obj/machinery/air_sensor/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) frequency = new_frequency @@ -76,12 +75,9 @@ obj/machinery/air_sensor/Destroy() icon = 'icons/obj/computer.dmi' icon_keyboard = "atmos_key" icon_screen = "tank" - name = "Computer" - var/frequency = 1439 var/list/sensors = list() - var/list/sensor_information = list() var/datum/radio_frequency/radio_connection circuit = /obj/item/weapon/circuitboard/air_management @@ -121,8 +117,8 @@ obj/machinery/computer/general_air_control/Destroy() data["sensors"] = sensors_ui ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "atmo_control.tmpl", src.name, 525, 600) + if(!ui) + ui = new(user, src, ui_key, "atmo_control.tmpl", name, 525, 600) ui.set_initial_data(data) ui.open() ui.set_auto_update(5) @@ -137,14 +133,11 @@ obj/machinery/computer/general_air_control/Destroy() /obj/machinery/computer/general_air_control/large_tank_control icon = 'icons/obj/computer.dmi' - frequency = 1441 var/input_tag var/output_tag - var/list/input_info var/list/output_info - var/input_flow_setting = 200 var/pressure_setting = ONE_ATMOSPHERE * 45 circuit = /obj/item/weapon/circuitboard/air_management/tank_control @@ -179,8 +172,8 @@ obj/machinery/computer/general_air_control/Destroy() data["pressure_setting"] = pressure_setting ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "atmo_control.tmpl", src.name, 660, 500) + if(!ui) + ui = new(user, src, ui_key, "atmo_control.tmpl", name, 660, 500) ui.set_initial_data(data) ui.open() ui.set_auto_update(5) @@ -251,14 +244,11 @@ obj/machinery/computer/general_air_control/Destroy() /obj/machinery/computer/general_air_control/supermatter_core icon = 'icons/obj/computer.dmi' - frequency = 1438 var/input_tag var/output_tag - var/list/input_info var/list/output_info - var/input_flow_setting = 700 var/pressure_setting = 100 circuit = /obj/item/weapon/circuitboard/air_management/supermatter_core @@ -292,8 +282,8 @@ obj/machinery/computer/general_air_control/Destroy() data["pressure_setting"] = pressure_setting ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "atmo_control.tmpl", src.name, 650, 500) + if(!ui) + ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500) ui.set_initial_data(data) ui.open() ui.set_auto_update(5) @@ -365,12 +355,9 @@ obj/machinery/computer/general_air_control/Destroy() /obj/machinery/computer/general_air_control/fuel_injection icon = 'icons/obj/computer.dmi' icon_screen = "alert:0" - var/device_tag var/list/device_info - var/automation = 0 - var/cutoff_temperature = 2000 var/on_temperature = 1200 circuit = /obj/item/weapon/circuitboard/air_management/injector_control @@ -427,8 +414,8 @@ obj/machinery/computer/general_air_control/Destroy() data["device_info"] = null ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "atmo_control.tmpl", src.name, 650, 500) + if(!ui) + ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500) ui.set_initial_data(data) ui.open() ui.set_auto_update(5) @@ -494,8 +481,4 @@ obj/machinery/computer/general_air_control/Destroy() "sigtype"="command" ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - - - - + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) \ No newline at end of file diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 236079f8e31..e9c7df22b2b 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -26,7 +26,6 @@ /obj/machinery/autolathe/New() ..() wires = new(src) - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) @@ -48,7 +47,6 @@ current_category = machine_recipes.categories[1] /obj/machinery/autolathe/interact(mob/user as mob) - update_recipe_list() if(..() || (disabled && !panel_open)) @@ -119,7 +117,6 @@ onclose(user, "autolathe") /obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(busy) user << "\The [src] is busy. Please wait for completion of previous operation." return @@ -223,7 +220,6 @@ interact(user) /obj/machinery/autolathe/Topic(href, href_list) - if(..()) return @@ -277,7 +273,7 @@ if(!making || !src) return //Create the desired item. - var/obj/item/I = new making.path(loc) + var/obj/item/I = new making.path(src.loc) if(multiplier > 1 && istype(I, /obj/item/stack)) var/obj/item/stack/S = I S.amount = multiplier @@ -303,7 +299,6 @@ mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.8. Maximum rating of parts is 3 /obj/machinery/autolathe/dismantle() - for(var/mat in stored_material) var/material/M = get_material_by_name(mat) if(!istype(M)) diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 986d20e3b91..07f0b8f9bd9 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -15,7 +15,6 @@ var/build_eff = 1 var/eat_eff = 1 - /obj/machinery/biogenerator/New() ..() var/datum/reagents/R = new/datum/reagents(1000) @@ -23,11 +22,9 @@ R.my_atom = src beaker = new /obj/item/weapon/reagent_containers/glass/bottle(src) - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) - RefreshParts() /obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well. @@ -96,13 +93,13 @@ return user.set_machine(src) var/dat = "BiogeneratorBiogenerator:
" - if (processing) + if(processing) dat += "Biogenerator is processing! Please wait..." else dat += "Biomass: [points] points.
" switch(menustat) if("menu") - if (beaker) + if(beaker) dat += "Activate Biogenerator!
" dat += "Detach Container

" dat += "Food
" @@ -139,9 +136,9 @@ interact(user) /obj/machinery/biogenerator/proc/activate() - if (usr.stat) + if(usr.stat) return - if (stat) //NOPOWER etc + if(stat) //NOPOWER etc return if(processing) usr << "The biogenerator is in the process of working." @@ -255,4 +252,4 @@ man_rating += P.rating build_eff = man_rating - eat_eff = bin_rating + eat_eff = bin_rating \ No newline at end of file diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 70557a2e18b..b072a7e4889 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -10,9 +10,8 @@ idle_power_usage = 2 active_power_usage = 4 - /obj/machinery/button/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/button/attackby(obj/item/weapon/W, mob/user as mob) - return src.attack_hand(user) \ No newline at end of file + return attack_hand(user) \ No newline at end of file diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 136bafa90ed..bf4839e7c75 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -17,7 +17,8 @@ var/global/list/station_networks = list( NETWORK_RESEARCH_OUTPOST, NETWORK_ROBOTS, NETWORK_PRISON, - NETWORK_SECURITY + NETWORK_SECURITY, + NETWORK_INTERROGATION ) var/global/list/engineering_networks = list( NETWORK_ENGINE, @@ -66,6 +67,9 @@ var/global/list/engineering_networks = list( /obj/machinery/camera/network/exodus network = list(NETWORK_EXODUS) +/obj/machinery/camera/network/interrogation + network = list(NETWORK_INTERROGATION) + /obj/machinery/camera/network/mining network = list(NETWORK_MINE) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 9ff0b2f894a..1e5c6ec73b5 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -14,7 +14,7 @@ /obj/machinery/cell_charger/update_icon() icon_state = "ccharger[charging ? 1 : 0]" - if(charging && !(stat & (BROKEN|NOPOWER)) ) + if(charging && !(stat & (BROKEN|NOPOWER))) var/newlevel = round(charging.percent() * 4.0 / 99) //world << "nl: [newlevel]" @@ -73,14 +73,14 @@ charging.add_fingerprint(user) charging.update_icon() - src.charging = null + charging = null user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.") chargelevel = -1 update_icon() /obj/machinery/cell_charger/attack_ai(mob/user) if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) // Borgs can remove the cell if they are near enough - if(!src.charging) + if(!charging) return charging.loc = src.loc @@ -104,7 +104,7 @@ update_use_power(0) return - if (charging && !charging.fully_charged()) + if(charging && !charging.fully_charged()) charging.give(active_power_usage*CELLRATE) update_use_power(2) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 19d187ade42..88bafe5cd36 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -47,7 +47,6 @@ /obj/machinery/clonepod/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -184,7 +183,7 @@ else if((occupant.health >= heal_level) && (!eject_wait)) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - src.audible_message("\The [src] signals that the cloning process is complete.") + audible_message("\The [src] signals that the cloning process is complete.") connected_message("Cloning Process Complete.") locked = 0 go_out() @@ -235,7 +234,7 @@ connected = null else anchored = 1 - playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) if(anchored) user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.") else @@ -298,7 +297,7 @@ if(mess) //Clean that mess and dump those gibs! mess = 0 - gibs(loc) + gibs(src.loc) update_icon() return @@ -308,7 +307,7 @@ if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE - occupant.loc = loc + occupant.loc = src.loc eject_wait = 0 //If it's still set somehow. domutcheck(occupant) //Waiting until they're out before possible transforming. occupant = null @@ -342,21 +341,21 @@ switch(severity) if(1.0) for(var/atom/movable/A as mob|obj in src) - A.loc = loc + A.loc = src.loc ex_act(severity) qdel(src) return if(2.0) if(prob(50)) for(var/atom/movable/A as mob|obj in src) - A.loc = loc + A.loc = src.loc ex_act(severity) qdel(src) return if(3.0) if(prob(25)) for(var/atom/movable/A as mob|obj in src) - A.loc = loc + A.loc = src.loc ex_act(severity) qdel(src) return @@ -366,9 +365,9 @@ /obj/machinery/clonepod/update_icon() ..() icon_state = "pod_0" - if (occupant && !(stat & NOPOWER)) + if(occupant && !(stat & NOPOWER)) icon_state = "pod_1" - else if (mess) + else if(mess) icon_state = "pod_g" //Health Tracker Implant diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 4b64cbadce9..1f0b5f454fe 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -14,138 +14,140 @@ var/cache_id = 0 circuit = /obj/item/weapon/circuitboard/security - New() - if(!network) - network = station_networks.Copy() - ..() - if(network.len) - current_network = network[1] +/obj/machinery/computer/security/New() + if(!network) + network = station_networks.Copy() + ..() + if(network.len) + current_network = network[1] - attack_ai(var/mob/user as mob) - return attack_hand(user) +/obj/machinery/computer/security/attack_ai(var/mob/user as mob) + return attack_hand(user) - check_eye(var/mob/user as mob) - if (user.stat || ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded) && !istype(user, /mob/living/silicon))) //user can't see - not sure why canmove is here. - return -1 - if(!current_camera) - return 0 - var/viewflag = current_camera.check_eye(user) - if ( viewflag < 0 ) //camera doesn't work - reset_current() - return viewflag +/obj/machinery/computer/security/check_eye(var/mob/user as mob) + if (user.stat || ((get_dist(user, src) > 1 || !( user.canmove ) || user.blinded) && !istype(user, /mob/living/silicon))) //user can't see - not sure why canmove is here. + return -1 + if(!current_camera) + return 0 + var/viewflag = current_camera.check_eye(user) + if ( viewflag < 0 ) //camera doesn't work + reset_current() + return viewflag - ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) - if(src.z > 6) return - if(stat & (NOPOWER|BROKEN)) return - if(user.stat) return +/obj/machinery/computer/security/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1) + if(src.z > 6) return + if(stat & (NOPOWER|BROKEN)) return + if(user.stat) return - var/data[0] + var/data[0] - data["current_camera"] = current_camera ? current_camera.nano_structure() : null - data["current_network"] = current_network - data["networks"] = network ? network : list() - if(current_network) - data["cameras"] = camera_repository.cameras_in_network(current_network) + data["current_camera"] = current_camera ? current_camera.nano_structure() : null + data["current_network"] = current_network + data["networks"] = network ? network : list() + if(current_network) + data["cameras"] = camera_repository.cameras_in_network(current_network) + if(current_camera) + switch_to_camera(user, current_camera) - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "sec_camera.tmpl", "Camera Console", 900, 800) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + ui = new(user, src, ui_key, "sec_camera.tmpl", "Camera Console", 900, 800) - // adding a template with the key "mapContent" enables the map ui functionality - ui.add_template("mapContent", "sec_camera_map_content.tmpl") - // adding a template with the key "mapHeader" replaces the map header content - ui.add_template("mapHeader", "sec_camera_map_header.tmpl") + // adding a template with the key "mapContent" enables the map ui functionality + ui.add_template("mapContent", "sec_camera_map_content.tmpl") + // adding a template with the key "mapHeader" replaces the map header content + ui.add_template("mapHeader", "sec_camera_map_header.tmpl") - ui.set_initial_data(data) - ui.open() + ui.set_initial_data(data) + ui.open() - Topic(href, href_list) - if(..()) - return 1 - if(href_list["switch_camera"]) - if(src.z>6 || stat&(NOPOWER|BROKEN)) return - if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return - var/obj/machinery/camera/C = locate(href_list["switch_camera"]) in cameranet.cameras - if(!C) - return - if(!(current_network in C.network)) - return - - switch_to_camera(usr, C) - return 1 - else if(href_list["switch_network"]) - if(src.z>6 || stat&(NOPOWER|BROKEN)) return - if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return - if(href_list["switch_network"] in network) - current_network = href_list["switch_network"] - return 1 - else if(href_list["reset"]) - if(src.z>6 || stat&(NOPOWER|BROKEN)) return - if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return - reset_current() - usr.reset_view(current_camera) - return 1 - else - . = ..() - - attack_hand(var/mob/user as mob) - if (src.z > 6) - user << "Unable to establish a connection: You're too far away from the station!" +/obj/machinery/computer/security/Topic(href, href_list) + if(..()) + return 1 + if(href_list["switch_camera"]) + if(src.z>6 || stat&(NOPOWER|BROKEN)) return + if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return + var/obj/machinery/camera/C = locate(href_list["switch_camera"]) in cameranet.cameras + if(!C) + return + if(!(current_network in C.network)) return - if(stat & (NOPOWER|BROKEN)) return - if(!isAI(user)) - user.set_machine(src) - ui_interact(user) + switch_to_camera(usr, C) + return 1 + else if(href_list["switch_network"]) + if(src.z>6 || stat&(NOPOWER|BROKEN)) return + if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return + if(href_list["switch_network"] in network) + current_network = href_list["switch_network"] + return 1 + else if(href_list["reset"]) + if(src.z>6 || stat&(NOPOWER|BROKEN)) return + if(usr.stat || ((get_dist(usr, src) > 1 || !( usr.canmove ) || usr.blinded) && !istype(usr, /mob/living/silicon))) return + reset_current() + usr.reset_view(current_camera) + return 1 + else + . = ..() - proc/switch_to_camera(var/mob/user, var/obj/machinery/camera/C) - //don't need to check if the camera works for AI because the AI jumps to the camera location and doesn't actually look through cameras. - if(isAI(user)) - var/mob/living/silicon/ai/A = user - // Only allow non-carded AIs to view because the interaction with the eye gets all wonky otherwise. - if(!A.is_in_chassis()) - return 0 +/obj/machinery/computer/security/attack_hand(var/mob/user as mob) + if (src.z > 6) + user << "Unable to establish a connection: You're too far away from the station!" + return + if(stat & (NOPOWER|BROKEN)) return - A.eyeobj.setLoc(get_turf(C)) - A.client.eye = A.eyeobj - return 1 + if(!isAI(user)) + user.set_machine(src) + ui_interact(user) - if (!C.can_use() || user.stat || (get_dist(user, src) > 1 || user.machine != src || user.blinded || !( user.canmove ) && !istype(user, /mob/living/silicon))) +/obj/machinery/computer/security/proc/switch_to_camera(var/mob/user, var/obj/machinery/camera/C) + //don't need to check if the camera works for AI because the AI jumps to the camera location and doesn't actually look through cameras. + if(isAI(user)) + var/mob/living/silicon/ai/A = user + // Only allow non-carded AIs to view because the interaction with the eye gets all wonky otherwise. + if(!A.is_in_chassis()) return 0 - set_current(C) - user.reset_view(current_camera) - check_eye(user) + + A.eyeobj.setLoc(get_turf(C)) + A.client.eye = A.eyeobj return 1 + if (!C.can_use() || user.stat || (get_dist(user, src) > 1 || user.machine != src || user.blinded || !( user.canmove ) && !istype(user, /mob/living/silicon))) + return 0 + set_current(C) + user.reset_view(current_camera) + check_eye(user) + return 1 + //Camera control: moving. - proc/jump_on_click(var/mob/user,var/A) - if(user.machine != src) - return - var/obj/machinery/camera/jump_to - if(istype(A,/obj/machinery/camera)) - jump_to = A - else if(ismob(A)) - if(ishuman(A)) - jump_to = locate() in A:head - else if(isrobot(A)) - jump_to = A:camera - else if(isobj(A)) - jump_to = locate() in A - else if(isturf(A)) - var/best_dist = INFINITY - for(var/obj/machinery/camera/camera in get_area(A)) - if(!camera.can_use()) - continue - if(!can_access_camera(camera)) - continue - var/dist = get_dist(camera,A) - if(dist < best_dist) - best_dist = dist - jump_to = camera - if(isnull(jump_to)) - return - if(can_access_camera(jump_to)) - switch_to_camera(user,jump_to) +/obj/machinery/computer/security/proc/jump_on_click(var/mob/user,var/A) + if(user.machine != src) + return + var/obj/machinery/camera/jump_to + if(istype(A,/obj/machinery/camera)) + jump_to = A + else if(ismob(A)) + if(ishuman(A)) + jump_to = locate() in A:head + else if(isrobot(A)) + jump_to = A:camera + else if(isobj(A)) + jump_to = locate() in A + else if(isturf(A)) + var/best_dist = INFINITY + for(var/obj/machinery/camera/camera in get_area(A)) + if(!camera.can_use()) + continue + if(!can_access_camera(camera)) + continue + var/dist = get_dist(camera,A) + if(dist < best_dist) + best_dist = dist + jump_to = camera + if(isnull(jump_to)) + return + if(can_access_camera(jump_to)) + switch_to_camera(user,jump_to) /obj/machinery/computer/security/process() if(cache_id != camera_repository.camera_cache_id) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 3bc9a17fce0..293ff22ef99 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -250,7 +250,7 @@ var/obj/item/weapon/paper/P = new(loc) if (mode) - P.name = text("crew manifest ([])", worldtime2text()) + P.name = text("crew manifest ([])", stationtime2text()) P.info = {"

Crew Manifest


[data_core ? data_core.get_manifest(0) : ""] diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 6f380739cc4..5cdbdeab9c6 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -7,7 +7,6 @@ use_power = 1 idle_power_usage = 300 active_power_usage = 300 - frame_type = "computer" var/processing = 0 var/icon_keyboard = "generic_key" @@ -97,37 +96,8 @@ return text /obj/machinery/computer/attackby(I as obj, user as mob) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.circuit = M - A.anchored = 1 - A.density = 1 - A.frame_type = M.board_type - for (var/obj/C in src) - C.forceMove(loc) - if (src.stat & BROKEN) - user << "The broken glass falls out." - new /obj/item/weapon/material/shard( src.loc ) - A.state = 3 - A.icon_state = "[A.frame_type]_3" - else - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "[A.frame_type]_4" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return else - src.attack_hand(user) - return - - - - - - + attack_hand(user) + return \ No newline at end of file diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index b3f97657464..3fced68e654 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -20,17 +20,17 @@ /obj/item/weapon/card/id/guest/examine(mob/user) ..(user) if (world.time < expiration_time) - user << "This pass expires at [worldtime2text(expiration_time)]." + user << "This pass expires at [worldtime2stationtime(expiration_time)]." else - user << "It expired at [worldtime2text(expiration_time)]." + user << "It expired at [worldtime2stationtime(expiration_time)]." /obj/item/weapon/card/id/guest/read() if(!Adjacent(usr)) return //Too far to read if (world.time > expiration_time) - usr << "This pass expired at [worldtime2text(expiration_time)]." + usr << "This pass expired at [worldtime2stationtime(expiration_time)]." else - usr << "This pass expires at [worldtime2text(expiration_time)]." + usr << "This pass expires at [worldtime2stationtime(expiration_time)]." usr << "It grants access to following areas:" for (var/A in temp_access) @@ -65,25 +65,6 @@ /obj/machinery/computer/guestpass/attackby(obj/I, mob/user) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "guestpass" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "guestpass_4" - M.deconstruct(src) - qdel(src) - return if(istype(I, /obj/item/weapon/card/id)) if(!giver && user.unEquip(I)) I.forceMove(src) @@ -207,13 +188,13 @@ if ("issue") if (giver) var/number = add_zero("[rand(0,9999)]", 4) - var/entry = "\[[worldtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: " + var/entry = "\[[stationtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: " for (var/i=1 to accesses.len) var/A = accesses[i] if (A) var/area = get_access_desc(A) entry += "[i > 1 ? ", [area]" : "[area]"]" - entry += ". Expires at [worldtime2text(world.time + duration*10*60)]." + entry += ". Expires at [worldtime2stationtime(world.time + duration*10*60)]." internal_log.Add(entry) var/obj/item/weapon/card/id/guest/pass = new(src.loc) diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 3150003f46b..4f73301e843 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -454,7 +454,7 @@ var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) counter++ - src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]") + src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year]
[t1]") if (href_list["del_c"]) if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 2624c4ff287..eda3a3b7991 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -391,7 +391,7 @@ What a mess.*/ var/counter = 1 while(active2.fields[text("com_[]", counter)]) counter++ - active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
[t1]") + active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year]
[t1]") if ("Delete Record (ALL)") if (active1) @@ -496,7 +496,7 @@ What a mess.*/ temp += "
  • Released
  • " temp += "" if("rank") - var/list/L = list( "Head of Personnel", "Captain", "AI" ) + var/list/L = list( "Head of Personnel", "Station Administrator", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 1fa38c4a719..2b4d898cfcb 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -343,7 +343,7 @@ What a mess.*/ return active1.fields["age"] = t1 if("rank") - var/list/L = list( "Head of Personnel", "Captain", "AI" ) + var/list/L = list( "Head of Personnel", "Station Administrator", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/computer3/computers/card.dm b/code/game/machinery/computer3/computers/card.dm index c57e9d0fe7a..3a510ac8360 100644 --- a/code/game/machinery/computer3/computers/card.dm +++ b/code/game/machinery/computer3/computers/card.dm @@ -35,8 +35,8 @@ var jobs_all = "" jobs_all += "" - jobs_all += ""//Captain in special because he is head of heads ~Intercross21 - jobs_all += "" + jobs_all += ""//Station Administrator in special because he is head of heads ~Intercross21 + jobs_all += "" jobs_all += "" counter = 0 @@ -311,11 +311,15 @@ writer.assignment = t1 writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])") + data_core.manifest_modify(writer.registered_name, writer.assignment) + callHook("reassign_employee", list(writer)) if("reg" in href_list) if(auth) writer.registered_name = href_list["reg"] writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])") + data_core.manifest_modify(writer.registered_name, writer.assignment) + callHook("reassign_employee", list(writer)) computer.updateUsrDialog() return diff --git a/code/game/machinery/computer3/computers/medical.dm b/code/game/machinery/computer3/computers/medical.dm index 4425dc236a0..57a662db46f 100644 --- a/code/game/machinery/computer3/computers/medical.dm +++ b/code/game/machinery/computer3/computers/medical.dm @@ -461,7 +461,7 @@ var/counter = 1 while(src.active2.fields[text("com_[]", counter)]) counter++ - src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
    [t1]") + src.active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year]
    [t1]") if (href_list["del_c"]) if ((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm index 59bb46fd696..a335cf1c73d 100644 --- a/code/game/machinery/computer3/computers/security.dm +++ b/code/game/machinery/computer3/computers/security.dm @@ -410,7 +410,7 @@ What a mess.*/ var/counter = 1 while(active2.fields[text("com_[]", counter)]) counter++ - active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [worldtime2text()], [game_year]
    [t1]") + active2.fields[text("com_[counter]")] = text("Made by [authenticated] ([rank]) on [time2text(world.realtime, "DDD MMM DD")] [stationtime2text()], [game_year]
    [t1]") if ("Delete Record (ALL)") if (active1) @@ -513,7 +513,7 @@ What a mess.*/ temp += "
  • Released
  • " temp += "" if("rank") - var/list/L = list( "Head of Personnel", "Captain", "AI" ) + var/list/L = list( "Head of Personnel", "Station Administrator", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm index 6acb530acc4..3800fb94406 100644 --- a/code/game/machinery/computer3/lapvend.dm +++ b/code/game/machinery/computer3/lapvend.dm @@ -201,7 +201,7 @@ T.amount = "[transaction_amount]" T.source_terminal = src.name T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() D.transaction_log.Add(T) // T = new() @@ -210,7 +210,7 @@ T.amount = "[transaction_amount]" T.source_terminal = src.name T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() vendor_account.transaction_log.Add(T) newlap = new /obj/machinery/computer3/laptop/vended(src.loc) @@ -350,7 +350,7 @@ T.amount = "[transaction_amount]" T.source_terminal = src.name T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() D.transaction_log.Add(T) // T = new() @@ -359,7 +359,7 @@ T.amount = "[transaction_amount]" T.source_terminal = src.name T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() vendor_account.transaction_log.Add(T) qdel(relap) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 665f74d926d..1236ae0e5ba 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -1,5 +1,4 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - //Circuit boards are in /code/game/objects/items/weapons/circuitboards/machinery/ /obj/machinery/constructable_frame //Made into a seperate type to make future revisions easier. diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 6c4c6160cd8..7a1b12509c6 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -27,10 +27,10 @@ initialize_directions = dir /obj/machinery/atmospherics/unary/cryo_cell/Destroy() - var/turf/T = loc + var/turf/T = src.loc T.contents += contents if(beaker) - beaker.loc = get_step(loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube + beaker.loc = get_step(src.loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube ..() /obj/machinery/atmospherics/unary/cryo_cell/initialize() @@ -64,7 +64,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/relaymove(mob/user as mob) // note that relaymove will also be called for mobs outside the cell with UI open - if(src.occupant == user && !user.stat) + if(occupant == user && !user.stat) go_out() /obj/machinery/atmospherics/unary/cryo_cell/attack_hand(mob/user) @@ -92,7 +92,7 @@ data["hasOccupant"] = occupant ? 1 : 0 var/occupantData[0] - if (occupant) + if(occupant) occupantData["name"] = occupant.name occupantData["stat"] = occupant.stat occupantData["health"] = occupant.health @@ -124,13 +124,13 @@ data["beakerVolume"] = 0 if(beaker) data["beakerLabel"] = beaker.label_text ? beaker.label_text : null - if (beaker.reagents && beaker.reagents.reagent_list.len) + if(beaker.reagents && beaker.reagents.reagent_list.len) for(var/datum/reagent/R in beaker.reagents.reagent_list) data["beakerVolume"] += R.volume // update the ui if it exists, returns null if no ui is passed/found ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) + 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, "cryo.tmpl", "Cryo Cell Control System", 520, 410) @@ -158,7 +158,7 @@ if(href_list["ejectBeaker"]) if(beaker) - beaker.loc = get_step(loc, SOUTH) + beaker.loc = get_step(src.loc, SOUTH) beaker = null if(href_list["ejectOccupant"]) @@ -235,7 +235,7 @@ occupant.adjustOxyLoss(-1) //severe damage should heal waaay slower without proper chemicals if(occupant.bodytemperature < 225) - if (occupant.getToxLoss()) + if(occupant.getToxLoss()) occupant.adjustToxLoss(max(-1, -20/occupant.getToxLoss())) var/heal_brute = occupant.getBruteLoss() ? min(1, 20/occupant.getBruteLoss()) : 0 var/heal_fire = occupant.getFireLoss() ? min(1, 20/occupant.getFireLoss()) : 0 @@ -267,15 +267,15 @@ //loc.assume_air(expel_gas) /obj/machinery/atmospherics/unary/cryo_cell/proc/go_out() - if(!( occupant )) + if(!(occupant)) return //for(var/obj/O in src) - // O.loc = loc - if (occupant.client) + // O.loc = src.loc + if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE - occupant.loc = get_step(loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem. - if (occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected + occupant.loc = get_step(src.loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem. + if(occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected occupant.bodytemperature = 261 // Changed to 70 from 140 by Zuhayr due to reoccurance of bug. // occupant.metabslow = 0 occupant = null @@ -284,22 +284,22 @@ update_icon() return /obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob) - if (stat & (NOPOWER|BROKEN)) + if(stat & (NOPOWER|BROKEN)) usr << "The cryo cell is not functioning." return - if (!istype(M)) + if(!istype(M)) usr << "The cryo cell cannot handle such a lifeform!" return - if (occupant) + if(occupant) usr << "The cryo cell is already occupied!" return - if (M.abiotic()) + if(M.abiotic()) usr << "Subject may not have abiotic items on." return if(!node) usr << "The cell is not correctly connected to its pipe network!" return - if (M.client) + if(M.client) M.client.perspective = EYE_PERSPECTIVE M.client.eye = src M.stop_pulling() @@ -320,7 +320,7 @@ set category = "Object" set src in oview(1) if(usr == occupant)//If the user is inside the tube... - if (usr.stat == 2)//and he's not dead.... + if(usr.stat == 2)//and he's not dead.... return usr << "Release sequence activated. This will take two minutes." sleep(1200) @@ -328,7 +328,7 @@ return go_out()//and release him from the eternal prison. else - if (usr.stat != 0) + if(usr.stat != 0) return go_out() add_fingerprint(usr) @@ -342,7 +342,7 @@ if(M.Victim == usr) usr << "You're too busy getting your life sucked out of you." return - if (usr.stat != 0) + if(usr.stat != 0) return put_mob(usr) return @@ -353,7 +353,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/return_air_for_internal_lifeform() //assume that the cryo cell has some kind of breath mask or something that //draws from the cryo tube's environment, instead of the cold internal air. - if(loc) + if(src.loc) return loc.return_air() else return null diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index e1c65243d98..aae961790a7 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -6,7 +6,6 @@ * ~ Zuhayr */ - //Main cryopod console. /obj/machinery/computer/cryopod @@ -73,18 +72,18 @@ allow_items = 1 /obj/machinery/computer/cryopod/attack_ai() - src.attack_hand() + attack_hand() /obj/machinery/computer/cryopod/attack_hand(mob/user = usr) if(stat & (NOPOWER|BROKEN)) return user.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) var/dat - if (!( ticker )) + if(!(ticker)) return dat += "

    [storage_name]
    " @@ -105,7 +104,7 @@ var/mob/user = usr - src.add_fingerprint(user) + add_fingerprint(user) if(href_list["log"]) @@ -159,7 +158,7 @@ I.forceMove(get_turf(src)) frozen_items -= I - src.updateUsrDialog() + updateUsrDialog() return /obj/item/weapon/circuitboard/cryopodcontrol @@ -395,25 +394,18 @@ O.forceMove(src) //Delete all items not on the preservation list. - var/list/items = src.contents.Copy() + var/list/items = contents.Copy() items -= occupant // Don't delete the occupant items -= announce // or the autosay radio. for(var/obj/item/W in items) var/preserve = null - // Snowflaaaake. - if(istype(W, /obj/item/device/mmi)) - var/obj/item/device/mmi/brain = W - if(brain.brainmob && brain.brainmob.client && brain.brainmob.key) + + for(var/T in preserve_items) + if(istype(W,T)) preserve = 1 - else - continue - else - for(var/T in preserve_items) - if(istype(W,T)) - preserve = 1 - break + break if(!preserve) qdel(W) @@ -451,13 +443,13 @@ if(PDA_Manifest.len) PDA_Manifest.Cut() for(var/datum/data/record/R in data_core.medical) - if ((R.fields["name"] == occupant.real_name)) + if((R.fields["name"] == occupant.real_name)) qdel(R) for(var/datum/data/record/T in data_core.security) - if ((T.fields["name"] == occupant.real_name)) + if((T.fields["name"] == occupant.real_name)) qdel(T) for(var/datum/data/record/G in data_core.general) - if ((G.fields["name"] == occupant.real_name)) + if((G.fields["name"] == occupant.real_name)) qdel(G) icon_state = base_icon_state @@ -466,8 +458,8 @@ //Make an announcement and log the person entering storage. - control_computer.frozen_crew += "[occupant.real_name], [occupant.mind.role_alt_title] - [worldtime2text()]" - control_computer._admin_logs += "[key_name(occupant)] ([occupant.mind.role_alt_title]) at [worldtime2text()]" + control_computer.frozen_crew += "[occupant.real_name], [occupant.mind.role_alt_title] - [stationtime2text()]" + control_computer._admin_logs += "[key_name(occupant)] ([occupant.mind.role_alt_title]) at [stationtime2text()]" log_and_message_admins("[key_name(occupant)] ([occupant.mind.role_alt_title]) entered cryostorage.") announce.autosay("[occupant.real_name], [occupant.mind.role_alt_title], [on_store_message]", "[on_store_name]") @@ -536,7 +528,7 @@ message_admins("[key_name_admin(M)] has entered a stasis pod.") //Despawning occurs when process() is called with an occupant without a client. - src.add_fingerprint(M) + add_fingerprint(M) /obj/machinery/cryopod/verb/eject() set name = "Eject Pod" @@ -548,14 +540,14 @@ icon_state = base_icon_state //Eject any items that aren't meant to be in the pod. - var/list/items = src.contents + var/list/items = contents if(occupant) items -= occupant if(announce) items -= announce for(var/obj/item/W in items) W.forceMove(get_turf(src)) - src.go_out() + go_out() add_fingerprint(usr) name = initial(name) @@ -569,7 +561,7 @@ if(usr.stat != 0 || !check_occupant_allowed(usr)) return - if(src.occupant) + if(occupant) usr << "\The [src] is in use." return @@ -585,7 +577,7 @@ if(!usr || !usr.client) return - if(src.occupant) + if(occupant) usr << "\The [src] is in use." return @@ -605,7 +597,7 @@ time_entered = world.time - src.add_fingerprint(usr) + add_fingerprint(usr) return @@ -626,7 +618,7 @@ return if(occupant.client) - occupant.client.eye = src.occupant.client.mob + occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE occupant.forceMove(get_turf(src)) @@ -639,8 +631,8 @@ return -/obj/machinery/cryopod/proc/set_occupant(var/occupant) - src.occupant = occupant +/obj/machinery/cryopod/proc/set_occupant(var/new_occupant) + occupant = new_occupant name = initial(name) if(occupant) name = "[name] ([occupant])" diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 0140a33fe37..fa4b601e91e 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -1,11 +1,9 @@ /* CONTAINS: - Deployable items Barricades for reference: - access_security = 1 access_brig = 2 access_armory = 3 @@ -50,7 +48,6 @@ for reference: access_court = 42 access_clown = 43 access_mime = 44 - */ //Barricades! @@ -83,17 +80,17 @@ for reference: return material /obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob) - if (istype(W, /obj/item/stack)) + if(istype(W, /obj/item/stack)) var/obj/item/stack/D = W if(D.get_material_name() != material.name) return //hitting things with the wrong type of stack usually doesn't produce messages, and probably doesn't need to. - if (health < maxhealth) - if (D.get_amount() < 1) + if(health < maxhealth) + if(D.get_amount() < 1) user << "You need one sheet of [material.display_name] to repair \the [src]." return visible_message("[user] begins to repair \the [src].") if(do_after(user,20) && health < maxhealth) - if (D.use(1)) + if(D.use(1)) health = maxhealth visible_message("[user] repairs \the [src].") return @@ -102,11 +99,11 @@ for reference: user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) switch(W.damtype) if("fire") - src.health -= W.force * 1 + health -= W.force * 1 if("brute") - src.health -= W.force * 0.75 + health -= W.force * 0.75 else - if (src.health <= 0) + if(health <= 0) visible_message("The barricade is smashed apart!") dismantle() qdel(src) @@ -125,8 +122,8 @@ for reference: qdel(src) return if(2.0) - src.health -= 25 - if (src.health <= 0) + health -= 25 + if(health <= 0) visible_message("\The [src] is blown apart!") dismantle() return @@ -158,114 +155,114 @@ for reference: var/locked = 0.0 // req_access = list(access_maint_tunnels) - New() +/obj/machinery/deployable/barrier/New() + ..() + + icon_state = "barrier[locked]" + +/obj/machinery/deployable/barrier/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/card/id/)) + if(allowed(user)) + if (emagged < 2.0) + locked = !locked + anchored = !anchored + icon_state = "barrier[locked]" + if((locked == 1.0) && (emagged < 2.0)) + user << "Barrier lock toggled on." + return + else if((locked == 0.0) && (emagged < 2.0)) + user << "Barrier lock toggled off." + return + else + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, src) + s.start() + visible_message("BZZzZZzZZzZT") + return + return + else if(istype(W, /obj/item/weapon/wrench)) + if(health < maxhealth) + health = maxhealth + emagged = 0 + req_access = list(access_security) + visible_message("[user] repairs \the [src]!") + return + else if(emagged > 0) + emagged = 0 + req_access = list(access_security) + visible_message("[user] repairs \the [src]!") + return + return + else + switch(W.damtype) + if("fire") + health -= W.force * 0.75 + if("brute") + health -= W.force * 0.5 + else + if(health <= 0) + explode() ..() - src.icon_state = "barrier[src.locked]" - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/card/id/)) - if (src.allowed(user)) - if (src.emagged < 2.0) - src.locked = !src.locked - src.anchored = !src.anchored - src.icon_state = "barrier[src.locked]" - if ((src.locked == 1.0) && (src.emagged < 2.0)) - user << "Barrier lock toggled on." - return - else if ((src.locked == 0.0) && (src.emagged < 2.0)) - user << "Barrier lock toggled off." - return - else - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, src) - s.start() - visible_message("BZZzZZzZZzZT") - return +/obj/machinery/deployable/barrier/ex_act(severity) + switch(severity) + if(1.0) + explode() return - else if (istype(W, /obj/item/weapon/wrench)) - if (src.health < src.maxhealth) - src.health = src.maxhealth - src.emagged = 0 - src.req_access = list(access_security) - visible_message("[user] repairs \the [src]!") - return - else if (src.emagged > 0) - src.emagged = 0 - src.req_access = list(access_security) - visible_message("[user] repairs \the [src]!") - return + if(2.0) + health -= 25 + if(health <= 0) + explode() return - else - switch(W.damtype) - if("fire") - src.health -= W.force * 0.75 - if("brute") - src.health -= W.force * 0.5 - else - if (src.health <= 0) - src.explode() - ..() + +/obj/machinery/deployable/barrier/emp_act(severity) + if(stat & (BROKEN|NOPOWER)) + return + if(prob(50/severity)) + locked = !locked + anchored = !anchored + icon_state = "barrier[locked]" - ex_act(severity) - switch(severity) - if(1.0) - src.explode() - return - if(2.0) - src.health -= 25 - if (src.health <= 0) - src.explode() - return - emp_act(severity) - if(stat & (BROKEN|NOPOWER)) - return - if(prob(50/severity)) - locked = !locked - anchored = !anchored - icon_state = "barrier[src.locked]" +/obj/machinery/deployable/barrier/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff. + if(air_group || (height==0)) + return 1 + if(istype(mover) && mover.checkpass(PASSTABLE)) + return 1 + else + return 0 - CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff. - if(air_group || (height==0)) - return 1 - if(istype(mover) && mover.checkpass(PASSTABLE)) - return 1 - else - return 0 +/obj/machinery/deployable/barrier/proc/explode() - proc/explode() + visible_message("[src] blows apart!") + var/turf/Tsec = get_turf(src) - visible_message("[src] blows apart!") - var/turf/Tsec = get_turf(src) +/* var/obj/item/stack/rods/ =*/ + PoolOrNew(/obj/item/stack/rods, Tsec) - /* var/obj/item/stack/rods/ =*/ - PoolOrNew(/obj/item/stack/rods, Tsec) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() + explosion(src.loc,-1,-1,0) + if(src) + qdel(src) - explosion(src.loc,-1,-1,0) - if(src) - qdel(src) - - /obj/machinery/deployable/barrier/emag_act(var/remaining_charges, var/mob/user) - if (src.emagged == 0) - src.emagged = 1 - src.req_access.Cut() - src.req_one_access.Cut() + if(emagged == 0) + emagged = 1 + req_access.Cut() + req_one_access.Cut() user << "You break the ID authentication lock on \the [src]." var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() visible_message("BZZzZZzZZzZT") return 1 - else if (src.emagged == 1) - src.emagged = 2 + else if(emagged == 1) + emagged = 2 user << "You short out the anchoring mechanism on \the [src]." var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() visible_message("BZZzZZzZZzZT") - return 1 + return 1 \ No newline at end of file diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index b51d72ccd8e..7f7ce32e036 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -19,12 +19,12 @@ /obj/machinery/button/remote/attack_ai(mob/user as mob) if(wires & 2) - return src.attack_hand(user) + return attack_hand(user) else user << "Error, no route to host." /obj/machinery/button/remote/attackby(obj/item/weapon/W, mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/button/remote/emag_act(var/remaining_charges, var/mob/user) if(req_access.len || req_one_access.len) @@ -37,7 +37,7 @@ if(..()) return - src.add_fingerprint(user) + add_fingerprint(user) if(stat & (NOPOWER|BROKEN)) return @@ -92,9 +92,9 @@ /obj/machinery/button/remote/airlock/trigger() for(var/obj/machinery/door/airlock/D in world) - if(D.id_tag == src.id) + if(D.id_tag == id) if(specialfunctions & OPEN) - if (D.density) + if(D.density) spawn(0) D.open() return @@ -136,7 +136,7 @@ /obj/machinery/button/remote/blast_door/trigger() for(var/obj/machinery/door/blast/M in world) - if(M.id == src.id) + if(M.id == id) if(M.density) spawn(0) M.open() @@ -155,7 +155,7 @@ /obj/machinery/button/remote/emitter/trigger(mob/user as mob) for(var/obj/machinery/power/emitter/E in world) - if(E.id == src.id) + if(E.id == id) spawn(0) E.activate(user) return @@ -174,21 +174,21 @@ update_icon() for(var/obj/machinery/door/blast/M in machines) - if (M.id == src.id) - spawn( 0 ) + if(M.id == id) + spawn(0) M.open() return sleep(20) for(var/obj/machinery/mass_driver/M in machines) - if(M.id == src.id) + if(M.id == id) M.drive() sleep(50) for(var/obj/machinery/door/blast/M in machines) - if (M.id == src.id) + if(M.id == id) spawn(0) M.close() return @@ -202,4 +202,4 @@ if(!active || (stat & NOPOWER)) icon_state = "launcherbtt" else - icon_state = "launcheract" + icon_state = "launcheract" \ No newline at end of file diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 517b9c7fee5..645ccc1fd0c 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -88,6 +88,7 @@ icon = 'icons/obj/doors/Doorext.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_ext opacity = 0 + glass = 1 /obj/machinery/door/airlock/glass name = "Glass Airlock" @@ -412,6 +413,8 @@ About the new airlock wires panel: if(electrified_until && isAllPowerLoss()) electrify(0) + update_icon() + /obj/machinery/door/airlock/proc/loseBackupPower() backup_power_lost_until = backupPowerCablesCut() ? -1 : world.time + SecondsToTicks(60) @@ -419,6 +422,8 @@ About the new airlock wires panel: if(electrified_until && isAllPowerLoss()) electrify(0) + update_icon() + /obj/machinery/door/airlock/proc/regainMainPower() if(!mainPowerCablesCut()) main_power_lost_until = 0 @@ -426,11 +431,15 @@ About the new airlock wires panel: if(!backup_power_lost_until) backup_power_lost_until = -1 + update_icon() + /obj/machinery/door/airlock/proc/regainBackupPower() if(!backupPowerCablesCut()) // Restore backup power only if main power is offline, otherwise permanently disable backup_power_lost_until = main_power_lost_until == 0 ? -1 : 0 + update_icon() + /obj/machinery/door/airlock/proc/electrify(var/duration, var/feedback = 0) var/message = "" if(src.isWireCut(AIRLOCK_WIRE_ELECTRIFY) && arePowerSystemsOn()) @@ -781,7 +790,7 @@ About the new airlock wires panel: if (istype(da, /obj/structure/door_assembly/multi_tile)) da.set_dir(src.dir) - da.anchored = 1 + da.anchored = 1 if(mineral) da.glass = mineral //else if(glass) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 72b878a49a3..209e3bb228f 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -90,34 +90,37 @@ // This only works on broken doors or doors without power. Also allows repair with Plasteel. /obj/machinery/door/blast/attackby(obj/item/weapon/C as obj, mob/user as mob) src.add_fingerprint(user) - if(C.pry == 1) - if(istype(C,/obj/item/weapon/material/twohanded/fireaxe)) - var/obj/item/weapon/material/twohanded/fireaxe/F = C - if(!F.wielded) - user << "You need to be wielding \the [F] to do that." - return + if(istype(C, /obj/item/weapon)) // For reasons unknown, sometimes C is actually not what it is advertised as, like a mob. + if(C.pry == 1) // Can we pry it open with something, like a crowbar/fireaxe/lingblade? + if(istype(C,/obj/item/weapon/material/twohanded/fireaxe)) // Fireaxes need to be in both hands to pry. + var/obj/item/weapon/material/twohanded/fireaxe/F = C + if(!F.wielded) + user << "You need to be wielding \the [F] to do that." + return - if(((stat & NOPOWER) || (stat & BROKEN)) && !( src.operating )) - force_toggle() - else - usr << "[src]'s motors resist your effort." - return - if(istype(C, /obj/item/stack/material) && C.get_material_name() == "plasteel") - var/amt = Ceiling((maxhealth - health)/150) - if(!amt) - usr << "\The [src] is already fully repaired." - return - var/obj/item/stack/P = C - if(P.amount < amt) - usr << "You don't have enough sheets to repair this! You need at least [amt] sheets." - return - usr << "You begin repairing [src]..." - if(do_after(usr, 30)) - if(P.use(amt)) - usr << "You have repaired \The [src]" - src.repair() + // If we're at this point, it's a fireaxe in both hands or something else that doesn't care for twohanding. + if(((stat & NOPOWER) || (stat & BROKEN)) && !( src.operating )) + force_toggle() else + usr << "[src]'s motors resist your effort." + return + + if(istype(C, /obj/item/stack/material) && C.get_material_name() == "plasteel") // Repairing. + var/amt = Ceiling((maxhealth - health)/150) + if(!amt) + usr << "\The [src] is already fully repaired." + return + var/obj/item/stack/P = C + if(P.amount < amt) usr << "You don't have enough sheets to repair this! You need at least [amt] sheets." + return + usr << "You begin repairing [src]..." + if(do_after(usr, 30)) + if(P.use(amt)) + usr << "You have repaired \The [src]" + src.repair() + else + usr << "You don't have enough sheets to repair this! You need at least [amt] sheets." diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index ac2c156fa40..2fea971119f 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -65,6 +65,7 @@ bound_height = width * world.icon_size health = maxhealth + update_icon() update_nearby_tiles(need_rebuild=1) return diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 2272cff0cc2..ed01c851494 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -24,10 +24,16 @@ src.base_state = src.icon_state return +/obj/machinery/door/window/update_icon() + if(density) + icon_state = base_state + else + icon_state = "[base_state]open" + /obj/machinery/door/window/proc/shatter(var/display_message = 1) new /obj/item/weapon/material/shard(src.loc) - var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src.loc) - CC.amount = 2 + new /obj/item/weapon/material/shard(src.loc) + new /obj/item/stack/cable_coil(src.loc, 1) var/obj/item/weapon/airlock_electronics/ae if(!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) @@ -103,43 +109,39 @@ return 1 /obj/machinery/door/window/open() - if (src.operating == 1) //doors can still open when emag-disabled + if (operating == 1) //doors can still open when emag-disabled return 0 if (!ticker) return 0 - if(!src.operating) //in case of emag - src.operating = 1 - flick(text("[]opening", src.base_state), src) + if (!operating) //in case of emag + operating = 1 + flick(text("[src.base_state]opening"), src) playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) - src.icon_state = text("[]open", src.base_state) sleep(10) explosion_resistance = 0 - src.density = 0 -// src.sd_SetOpacity(0) //TODO: why is this here? Opaque windoors? ~Carn + density = 0 + update_icon() update_nearby_tiles() if(operating == 1) //emag again - src.operating = 0 + operating = 0 return 1 /obj/machinery/door/window/close() - if (src.operating) + if (operating) return 0 src.operating = 1 flick(text("[]closing", src.base_state), src) playsound(src.loc, 'sound/machines/windowdoor.ogg', 100, 1) - src.icon_state = src.base_state - src.density = 1 + density = 1 + update_icon() explosion_resistance = initial(explosion_resistance) -// if(src.visible) -// SetOpacity(1) //TODO: why is this here? Opaque windoors? ~Carn update_nearby_tiles() sleep(10) - - src.operating = 0 + operating = 0 return 1 /obj/machinery/door/window/take_damage(var/damage) @@ -197,12 +199,14 @@ var/obj/structure/windoor_assembly/wa = new/obj/structure/windoor_assembly(src.loc) if (istype(src, /obj/machinery/door/window/brigdoor)) wa.secure = "secure_" - wa.name = "Secure Wired Windoor Assembly" + wa.name = "secure wired windoor assembly" else - wa.name = "Wired Windoor Assembly" + wa.name = "wired windoor assembly" if (src.base_state == "right" || src.base_state == "rightsecure") wa.facing = "r" wa.set_dir(src.dir) + wa.anchored = 1 + wa.created_name = name wa.state = "02" wa.update_icon() @@ -223,7 +227,7 @@ ae.icon_state = "door_electronics_smoked" operating = 0 - shatter(src) + qdel(src) return //If it's a weapon, smash windoor. Unless it's an id card, agent card, ect.. then ignore it (Cards really shouldnt damage a door anyway) @@ -262,6 +266,10 @@ maxhealth = 300 health = 300.0 //Stronger doors for prison (regular window door health is 150) +/obj/machinery/door/window/brigdoor/shatter() + new /obj/item/stack/rods(src.loc, 2) + ..() + /obj/machinery/door/window/northleft dir = NORTH diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 6661468f59e..7a4087e2c4d 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -4,7 +4,6 @@ var/list/doppler_arrays = list() name = "tachyon-doppler array" desc = "A highly precise directional sensor array which measures the release of quants from decaying tachyons. The doppler shifting of the mirror-image formed by these quants can reveal the size, location and temporal affects of energetic disturbances within a large radius ahead of the array." - /obj/machinery/doppler_array/New() ..() doppler_arrays += src @@ -39,13 +38,12 @@ var/list/doppler_arrays = list() for(var/mob/O in hearers(src, null)) O.show_message("[src] states coldly, \"[message]\"",2) - /obj/machinery/doppler_array/power_change() ..() if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" else - if( !(stat & NOPOWER) ) + if(!(stat & NOPOWER)) icon_state = initial(icon_state) else icon_state = "[initial(icon_state)]-off" \ No newline at end of file diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 7532cb14070..18844dcd735 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -1,5 +1,4 @@ // It is a gizmo that flashes a small area - /obj/machinery/flasher name = "Mounted flash" desc = "A wall-mounted flashbulb device." @@ -27,48 +26,48 @@ /obj/machinery/flasher/power_change() ..() - if ( !(stat & NOPOWER) ) + if(!(stat & NOPOWER)) icon_state = "[base_state]1" -// src.sd_SetLuminosity(2) +// sd_SetLuminosity(2) else icon_state = "[base_state]1-p" -// src.sd_SetLuminosity(0) +// sd_SetLuminosity(0) //Don't want to render prison breaks impossible /obj/machinery/flasher/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/wirecutters)) + if(istype(W, /obj/item/weapon/wirecutters)) add_fingerprint(user) - src.disable = !src.disable - if (src.disable) + disable = !disable + if(disable) user.visible_message("[user] has disconnected the [src]'s flashbulb!", "You disconnect the [src]'s flashbulb!") - if (!src.disable) + if(!disable) user.visible_message("[user] has connected the [src]'s flashbulb!", "You connect the [src]'s flashbulb!") //Let the AI trigger them directly. /obj/machinery/flasher/attack_ai() - if (src.anchored) - return src.flash() + if(anchored) + return flash() else return /obj/machinery/flasher/proc/flash() - if (!(powered())) + if(!(powered())) return - if ((src.disable) || (src.last_flash && world.time < src.last_flash + 150)) + if((disable) || (last_flash && world.time < last_flash + 150)) return playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) flick("[base_state]_flash", src) - src.last_flash = world.time + last_flash = world.time use_power(1500) for (var/mob/O in viewers(src, null)) - if (get_dist(src, O) > src.range) + if(get_dist(src, O) > range) continue var/flash_time = strength - if (istype(O, /mob/living/carbon/human)) + if(istype(O, /mob/living/carbon/human)) var/mob/living/carbon/human/H = O if(!H.eyecheck() <= 0) continue @@ -94,26 +93,26 @@ ..(severity) /obj/machinery/flasher/portable/HasProximity(atom/movable/AM as mob|obj) - if ((src.disable) || (src.last_flash && world.time < src.last_flash + 150)) + if((disable) || (last_flash && world.time < last_flash + 150)) return if(istype(AM, /mob/living/carbon)) var/mob/living/carbon/M = AM - if ((M.m_intent != "walk") && (src.anchored)) - src.flash() + if((M.m_intent != "walk") && (anchored)) + flash() /obj/machinery/flasher/portable/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/wrench)) + if(istype(W, /obj/item/weapon/wrench)) add_fingerprint(user) - src.anchored = !src.anchored + anchored = !anchored - if (!src.anchored) + if(!anchored) user.show_message(text("[src] can now be moved.")) - src.overlays.Cut() + overlays.Cut() - else if (src.anchored) + else if(anchored) user.show_message(text("[src] is now secured.")) - src.overlays += "[base_state]-s" + overlays += "[base_state]-s" /obj/machinery/button/flasher name = "flasher button" @@ -130,7 +129,7 @@ icon_state = "launcheract" for(var/obj/machinery/flasher/M in machines) - if(M.id == src.id) + if(M.id == id) spawn() M.flash() @@ -139,4 +138,4 @@ icon_state = "launcherbtt" active = 0 - return + return \ No newline at end of file diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index e31a19b265b..9f594e41783 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -1,5 +1,3 @@ -//these are probably broken - /obj/machinery/floodlight name = "Emergency Floodlight" icon = 'icons/obj/machines/floodlight.dmi' @@ -13,7 +11,7 @@ var/brightness_on = 8 //can't remember what the maxed out value is /obj/machinery/floodlight/New() - src.cell = new(src) + cell = new(src) cell.maxcharge = 1000 cell.charge = 1000 // 41minutes @ 200W ..() @@ -71,7 +69,6 @@ if(!turn_on(1)) user << "You try to turn on \the [src] but it does not work." - /obj/machinery/floodlight/attack_hand(mob/user as mob) if(open && cell) if(ishuman(user)) @@ -79,12 +76,12 @@ user.put_in_hands(cell) cell.loc = user.loc else - cell.loc = loc + cell.loc = src.loc cell.add_fingerprint(user) cell.update_icon() - src.cell = null + cell = null on = 0 set_light(0) user << "You remove the power cell" @@ -99,10 +96,9 @@ update_icon() - /obj/machinery/floodlight/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/screwdriver)) - if (!open) + if(istype(W, /obj/item/weapon/screwdriver)) + if(!open) if(unlocked) unlocked = 0 user << "You screw the battery panel in place." @@ -110,7 +106,7 @@ unlocked = 1 user << "You unscrew the battery panel." - if (istype(W, /obj/item/weapon/crowbar)) + if(istype(W, /obj/item/weapon/crowbar)) if(unlocked) if(open) open = 0 @@ -121,7 +117,7 @@ open = 1 user << "You remove the battery panel." - if (istype(W, /obj/item/weapon/cell)) + if(istype(W, /obj/item/weapon/cell)) if(open) if(cell) user << "There is a power cell already installed." diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index 7298b62abf9..a134e68e3fe 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -132,7 +132,7 @@ var/list/floor_light_cache = list() if(1) qdel(src) if(2) - if (prob(50)) + if(prob(50)) qdel(src) else if(prob(20)) stat |= BROKEN @@ -140,7 +140,7 @@ var/list/floor_light_cache = list() if(isnull(damaged)) damaged = 0 if(3) - if (prob(5)) + if(prob(5)) qdel(src) else if(isnull(damaged)) damaged = 0 diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index c682a2b228a..1cbccc195ca 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -1,5 +1,4 @@ /obj/machinery/floorlayer - name = "automatic floor layer" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" @@ -35,8 +34,7 @@ return /obj/machinery/floorlayer/attackby(var/obj/item/W as obj, var/mob/user as mob) - - if (istype(W, /obj/item/weapon/wrench)) + if(istype(W, /obj/item/weapon/wrench)) var/m = input("Choose work mode", "Mode") as null|anything in mode mode[m] = !mode[m] var/O = mode[m] @@ -109,4 +107,4 @@ /obj/machinery/floorlayer/proc/CollectTiles(var/turf/w_turf) for(var/obj/item/stack/tile/tile in w_turf) - TakeTile(tile) + TakeTile(tile) \ No newline at end of file diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index 1dddcedea0b..3005996f0b6 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -1,3 +1,177 @@ +/var/global/list/construction_frame_wall +/var/global/list/construction_frame_floor + +/proc/populate_frame_types() + //Create global frame type list if it hasn't been made already. + construction_frame_wall = list() + construction_frame_floor = list() + for(var/R in typesof(/datum/frame/frame_types) - /datum/frame/frame_types) + var/datum/frame/frame_types/type = new R + if(type.frame_style == "wall") + construction_frame_wall += type + else + construction_frame_floor += type + + var/datum/frame/frame_types/cancel/cancel = new /datum/frame/frame_types/cancel + construction_frame_wall += cancel + construction_frame_floor += cancel + +/datum/frame/frame_types + var/name + var/frame_size = 5 + var/frame_class + var/circuit + var/frame_style = "floor" + var/x_offset + var/y_offset + +/datum/frame/frame_types/computer + name = "Computer" + frame_class = "computer" + +/datum/frame/frame_types/machine + name = "Machine" + frame_class = "machine" + +/datum/frame/frame_types/conveyor + name = "Conveyor" + frame_class = "machine" + circuit = /obj/item/weapon/circuitboard/conveyor + +/datum/frame/frame_types/photocopier + name = "Photocopier" + frame_class = "machine" + +/datum/frame/frame_types/washing_machine + name = "Washing Machine" + frame_class = "machine" + +/datum/frame/frame_types/medical_console + name = "Medical Console" + frame_class = "computer" + +/datum/frame/frame_types/medical_pod + name = "Medical Pod" + frame_class = "machine" + +/datum/frame/frame_types/dna_analyzer + name = "DNA Analyzer" + frame_class = "machine" + +/datum/frame/frame_types/mass_driver + name = "Mass Driver" + frame_class = "machine" + circuit = /obj/item/weapon/circuitboard/mass_driver + +/datum/frame/frame_types/holopad + name = "Holopad" + frame_class = "computer" + frame_size = 4 + +/datum/frame/frame_types/microwave + name = "Microwave" + frame_class = "machine" + frame_size = 4 + +/datum/frame/frame_types/fax + name = "Fax" + frame_class = "machine" + frame_size = 3 + +/datum/frame/frame_types/recharger + name = "Recharger" + frame_class = "machine" + circuit = /obj/item/weapon/circuitboard/recharger + frame_size = 3 + +/datum/frame/frame_types/grinder + name = "Grinder" + frame_class = "machine" + circuit = /obj/item/weapon/circuitboard/grinder + frame_size = 3 + +/datum/frame/frame_types/display + name = "Display" + frame_class = "display" + frame_style = "wall" + x_offset = 32 + y_offset = 32 + +/datum/frame/frame_types/supply_request_console + name = "Supply Request Console" + frame_class = "display" + frame_style = "wall" + x_offset = 32 + y_offset = 32 + +/datum/frame/frame_types/atm + name = "ATM" + frame_class = "display" + frame_size = 3 + frame_style = "wall" + x_offset = 32 + y_offset = 32 + +/datum/frame/frame_types/newscaster + name = "Newscaster" + frame_class = "display" + frame_size = 3 + frame_style = "wall" + x_offset = 28 + y_offset = 30 + +/datum/frame/frame_types/wall_charger + name = "Wall Charger" + frame_class = "machine" + circuit = /obj/item/weapon/circuitboard/recharger/wrecharger + frame_size = 3 + frame_style = "wall" + x_offset = 32 + y_offset = 32 + +/datum/frame/frame_types/fire_alarm + name = "Fire Alarm" + frame_class = "alarm" + frame_size = 2 + frame_style = "wall" + x_offset = 24 + y_offset = 24 + +/datum/frame/frame_types/air_alarm + name = "Air Alarm" + frame_class = "alarm" + frame_size = 2 + frame_style = "wall" + x_offset = 24 + y_offset = 24 + +/datum/frame/frame_types/guest_pass_console + name = "Guest Pass Console" + frame_class = "display" + frame_size = 2 + frame_style = "wall" + x_offset = 30 + y_offset = 30 + +/datum/frame/frame_types/intercom + name = "Intercom" + frame_class = "alarm" + frame_size = 2 + frame_style = "wall" + x_offset = 28 + y_offset = 28 + +/datum/frame/frame_types/keycard_authenticator + name = "Keycard Authenticator" + frame_class = "alarm" + frame_size = 1 + frame_style = "wall" + x_offset = 24 + y_offset = 24 + +/datum/frame/frame_types/cancel //used to get out of input dialogue + name = "Cancel" + /obj/structure/frame anchored = 0 name = "frame" @@ -6,20 +180,16 @@ var/state = 0 var/obj/item/weapon/circuitboard/circuit = null var/need_circuit = 1 - var/frame_type = "machine" + var/datum/frame/frame_types/frame_type = new /datum/frame/frame_types/machine var/list/components = null var/list/req_components = null var/list/req_component_names = null - var/list/alarms = list("firealarm", "airalarm", "intercom", "keycard") - var/list/machines = list( - "machine", "photocopier", "fax", "microwave", "conveyor", "recharger", "wrecharger", - "washing", "grinder", "teleporter_hub", "teleporter_station", "medpod", "dna_analyzer", - "massdriver") - var/list/computers = list("computer", "holopad", "console") - var/list/displays = list("display", "guestpass", "newscaster", "atm", "request") - var/list/no_circuit = list("wrecharger", "recharger", "grinder", "conveyor", "massdriver") +/obj/structure/frame/computer //used for maps + frame_type = new /datum/frame/frame_types/computer + anchored = 1 + density = 1 /obj/structure/frame/proc/update_desc() var/D @@ -31,6 +201,12 @@ D = "Requires [english_list(component_list)]." desc = D +/obj/structure/frame/update_icon() + ..() + var/type = lowertext(frame_type.name) + type = replacetext(type, " ", "_") + icon_state = "[type]_[state]" + /obj/structure/frame/proc/check_components(mob/user as mob) components = list() req_components = circuit.req_components.Copy() @@ -41,175 +217,110 @@ var/obj/ct = A req_component_names[A] = initial(ct.name) -/obj/structure/frame/New(var/loc, var/dir, var/building = 0, var/obj/item/frame/frame_type, mob/user as mob) +/obj/structure/frame/New(var/loc, var/dir, var/building = 0, var/datum/frame/frame_types/type, mob/user as mob) ..() if(building) - src.frame_type = frame_type - icon_state = "[frame_type]_0" + frame_type = type + state = 0 + if(dir) - src.set_dir(dir) + set_dir(dir) - if(frame_type in alarms) - if(loc) - src.loc = loc + if(loc) + src.loc = loc - state = 0 - if(frame_type == "airalarm" || frame_type == "firealarm" || frame_type == "keycard") - if(dir) - src.set_dir(dir) - pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) - pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0 + if(frame_type.x_offset) + pixel_x = (dir & 3)? 0 : (dir == 4 ? -frame_type.x_offset : frame_type.x_offset) - if(frame_type == "intercom") - if(dir) - src.set_dir(dir) - pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28) - pixel_y = (dir & 3)? (dir == 1 ? -28 : 28) : 0 + if(frame_type.y_offset) + pixel_y = (dir & 3)? (dir == 1 ? -frame_type.y_offset : frame_type.y_offset) : 0 - update_icon() - return - - if(frame_type in displays) - if(loc) - src.loc = loc - - if(frame_type == "display" || frame_type == "atm" || frame_type == "request") - pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32) - pixel_y = (dir & 3)? (dir == 1 ? -32 : 32) : 0 - - if(frame_type == "newscaster") - pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28) - pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0 - - if(frame_type == "guestpass") - pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30) - pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0 - - update_icon() - return - - if(frame_type in no_circuit) + if(frame_type.circuit) need_circuit = 0 - if(frame_type == "wrecharger") - circuit = new /obj/item/weapon/circuitboard/recharger/wrecharger(src) - if(loc) - src.loc = loc + circuit = new frame_type.circuit(src) - state = 0 - - pixel_x = (dir & 3)? 0 : (dir == 4 ? -26 : 32) - pixel_y = (dir & 3)? (dir == 1 ? -32 : 32) : 0 - - update_icon() - return - if(frame_type == "recharger") - circuit = new /obj/item/weapon/circuitboard/recharger(src) - if(frame_type == "grinder") - circuit = new /obj/item/weapon/circuitboard/grinder(src) - if(frame_type == "conveyor") - circuit = new /obj/item/weapon/circuitboard/conveyor(src) - if(frame_type == "massdriver") - circuit = new /obj/item/weapon/circuitboard/mass_driver(src) - - if(frame_type == "computer") + if(frame_type.name == "Computer") density = 1 - if(frame_type in machines) + + if(frame_type.frame_class == "machine") density = 1 - return + + update_icon() /obj/structure/frame/attackby(obj/item/P as obj, mob/user as mob) if(istype(P, /obj/item/weapon/wrench)) - if(state == 0) + if(state == 0 && !anchored) user << "You start to wrench the frame into place." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20)) - src.anchored = 1 + anchored = 1 if(!need_circuit && circuit) - src.state = 2 + state = 2 check_components() update_desc() - src.icon_state = "[frame_type]_2" user << "You wrench the frame into place and set the outer cover." else - src.state = 1 user << "You wrench the frame into place." - return - if(state == 1) + else if(state == 0 && anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20)) user << "You unfasten the frame." - src.anchored = 0 - src.state = 0 - return + anchored = 0 - if(istype(P, /obj/item/weapon/weldingtool)) + else if(istype(P, /obj/item/weapon/weldingtool)) if(state == 0) var/obj/item/weapon/weldingtool/WT = P - if(!WT.remove_fuel(0, user)) + if(WT.remove_fuel(0, user)) + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + if(do_after(user, 20)) + if(src && WT.isOn()) + user << "You deconstruct the frame." + new /obj/item/stack/material/steel(src.loc, frame_type.frame_size) + qdel(src) + return + else if(!WT.remove_fuel(0, user)) user << "The welding tool must be on to complete this task." return - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - if(do_after(user, 20)) - if(!src || !WT.isOn()) return - user << "You deconstruct the frame." - if(frame_type == "holopad" || frame_type == "microwave") - new /obj/item/stack/material/steel( src.loc, 4 ) - else if(frame_type == "fax" || frame_type == "newscaster" || frame_type == "recharger" || frame_type == "wrecharger" || frame_type == "grinder") - new /obj/item/stack/material/steel( src.loc, 3 ) - else if(frame_type == "firealarm" || frame_type == "airalarm" || frame_type == "intercom" || frame_type == "guestpass") - new /obj/item/stack/material/steel( src.loc, 2 ) - else if(frame_type == "keycard") - new /obj/item/stack/material/steel( src.loc, 1 ) - else - new /obj/item/stack/material/steel( src.loc, 5 ) - qdel(src) - return - if(istype(P, /obj/item/weapon/circuitboard) && need_circuit && !circuit) - if(state == 1) + else if(istype(P, /obj/item/weapon/circuitboard) && need_circuit && !circuit) + if(state == 0 && anchored) var/obj/item/weapon/circuitboard/B = P - if(B.board_type == frame_type) + var/datum/frame/frame_types/board_type = B.board_type + if(board_type.name == frame_type.name) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user << "You place the circuit board inside the frame." - src.icon_state = "[frame_type]_1" - src.circuit = P + circuit = P user.drop_item() P.loc = src - if(frame_type in machines) //because machines are assholes + state = 1 + if(frame_type.frame_class == "machine") check_components() update_desc() - return else user << "This frame does not accept circuit boards of this type!" - return + return - if(istype(P, /obj/item/weapon/screwdriver)) + else if(istype(P, /obj/item/weapon/screwdriver)) if(state == 1) if(need_circuit && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You screw the circuit board into place." - src.state = 2 - src.icon_state = "[frame_type]_2" - return + state = 2 - if(state == 2) + else if(state == 2) if(need_circuit && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You unfasten the circuit board." - src.state = 1 - src.icon_state = "[frame_type]_1" - return + state = 1 - if(!need_circuit && circuit) + else if(!need_circuit && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You unfasten the outer cover." - src.state = 1 - src.icon_state = "[frame_type]_0" - return + state = 0 - if(state == 3) - if(frame_type in machines) + else if(state == 3) + if(frame_type.frame_class == "machine") var/component_check = 1 for(var/R in req_components) if(req_components[R] > 0) @@ -217,7 +328,7 @@ break if(component_check) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, src.dir) + var/obj/machinery/new_machine = new circuit.build_path(src.loc, dir) // Handle machines that have allocated default parts in thier constructor. if(new_machine.component_parts) for(var/CP in new_machine.component_parts) @@ -226,9 +337,9 @@ else new_machine.component_parts = list() - src.circuit.construct(new_machine) + circuit.construct(new_machine) - for(var/obj/O in src.components) + for(var/obj/O in components) if(circuit.contain_parts) O.loc = new_machine else @@ -240,173 +351,158 @@ new_machine.RefreshParts() - new_machine.pixel_x = src.pixel_x - new_machine.pixel_y = src.pixel_y + new_machine.pixel_x = pixel_x + new_machine.pixel_y = pixel_y qdel(src) - return + return - if(frame_type in alarms) + else if(frame_type.frame_class == "alarm") playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You fasten the cover." - var/obj/machinery/B = new src.circuit.build_path ( src.loc ) - B.pixel_x = src.pixel_x - B.pixel_y = src.pixel_y + var/obj/machinery/B = new circuit.build_path(src.loc) + B.pixel_x = pixel_x + B.pixel_y = pixel_y B.set_dir(dir) - src.circuit.construct(B) + circuit.construct(B) + circuit.loc = null + B.circuit = circuit qdel(src) return - if(state == 4) - if(frame_type in computers) + else if(state == 4) + if(frame_type.frame_class == "computer") playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You connect the monitor." - var/obj/machinery/B = new src.circuit.build_path ( src.loc ) - B.pixel_x = src.pixel_x - B.pixel_y = src.pixel_y + var/obj/machinery/B = new circuit.build_path(src.loc) + B.pixel_x = pixel_x + B.pixel_y = pixel_y B.set_dir(dir) - src.circuit.construct(B) + circuit.construct(B) + circuit.loc = null + B.circuit = circuit qdel(src) return - if(frame_type in displays) + else if(frame_type.frame_class == "display") playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You connect the monitor." - var/obj/machinery/B = new src.circuit.build_path ( src.loc ) - B.pixel_x = src.pixel_x - B.pixel_y = src.pixel_y + var/obj/machinery/B = new circuit.build_path(src.loc) + B.pixel_x = pixel_x + B.pixel_y = pixel_y B.set_dir(dir) - src.circuit.construct(B) + circuit.construct(B) + circuit.loc = null + B.circuit = circuit qdel(src) return - if(istype(P, /obj/item/weapon/crowbar)) + else if(istype(P, /obj/item/weapon/crowbar)) if(state == 1) if(need_circuit && circuit) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) user << "You remove the circuit board." - src.state = 1 - src.icon_state = "[frame_type]_0" - circuit.loc = src.loc - src.circuit = null - if(frame_type in machines) //becuase machines are assholes + state = 0 + circuit.forceMove(src.loc) + circuit = null + if(frame_type.frame_class == "machine") req_components = null - return - if(state == 3) - if(frame_type in machines) + else if(state == 3) + if(frame_type.frame_class == "machine") playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) if(components.len == 0) user << "There are no components to remove." else user << "You remove the components." for(var/obj/item/weapon/W in components) - W.forceMove(loc) + W.forceMove(src.loc) check_components() update_desc() user << desc - return - if(state == 4) - if(frame_type in computers) + else if(state == 4) + if(frame_type.frame_class == "computer") playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) user << "You remove the glass panel." - src.state = 3 - src.icon_state = "[frame_type]_3" - new /obj/item/stack/material/glass( src.loc, 2 ) - return + state = 3 + new /obj/item/stack/material/glass(src.loc, 2) - if(frame_type in displays) + else if(frame_type.frame_class == "display") playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) user << "You remove the glass panel." - src.state = 3 - src.icon_state = "[frame_type]_3" - new /obj/item/stack/material/glass( src.loc, 2 ) - return + state = 3 + new /obj/item/stack/material/glass(src.loc, 2) - if(istype(P, /obj/item/stack/cable_coil)) + else if(istype(P, /obj/item/stack/cable_coil)) if(state == 2) var/obj/item/stack/cable_coil/C = P - if (C.get_amount() < 5) + if(C.get_amount() < 5) user << "You need five coils of wire to add them to the frame." return user << "You start to add cables to the frame." playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20) && state == 2) - if (C.use(5)) + if(C.use(5)) user << "You add cables to the frame." state = 3 - icon_state = "[frame_type]_3" - if(frame_type in machines) + if(frame_type.frame_class == "machine") user << desc - return - if(istype(P, /obj/item/weapon/wirecutters)) + else if(istype(P, /obj/item/weapon/wirecutters)) if(state == 3) - if(frame_type in computers) + if(frame_type.frame_class == "computer") playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) user << "You remove the cables." - src.state = 2 - src.icon_state = "[frame_type]_2" - new /obj/item/stack/cable_coil( src.loc, 5 ) - return + state = 2 + new /obj/item/stack/cable_coil(src.loc, 5) - if(frame_type in displays) + else if(frame_type.frame_class == "display") playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) user << "You remove the cables." - src.state = 2 - src.icon_state = "[frame_type]_2" - new /obj/item/stack/cable_coil( src.loc, 5 ) - return + state = 2 + new /obj/item/stack/cable_coil(src.loc, 5) - if(frame_type in alarms) + else if(frame_type.frame_class == "alarm") playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) user << "You remove the cables." - src.state = 2 - src.icon_state = "[frame_type]_2" - new /obj/item/stack/cable_coil( src.loc, 5 ) - return + state = 2 + new /obj/item/stack/cable_coil(src.loc, 5) - if(frame_type in machines) + else if(frame_type.frame_class == "machine") playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) user << "You remove the cables." - src.state = 2 - src.icon_state = "[frame_type]_2" - new /obj/item/stack/cable_coil( src.loc, 5 ) - return + state = 2 + new /obj/item/stack/cable_coil(src.loc, 5) - if(istype(P, /obj/item/stack/material) && P.get_material_name() == "glass") + else if(istype(P, /obj/item/stack/material) && P.get_material_name() == "glass") if(state == 3) - if(frame_type in computers) + if(frame_type.frame_class == "computer") var/obj/item/stack/G = P - if (G.get_amount() < 2) + if(G.get_amount() < 2) user << "You need two sheets of glass to put in the glass panel." return playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user << "You start to put in the glass panel." if(do_after(user, 20) && state == 3) - if (G.use(2)) + if(G.use(2)) user << "You put in the glass panel." - src.state = 4 - src.icon_state = "[frame_type]_4" - return + state = 4 - if(frame_type in displays) + else if(frame_type.frame_class == "display") var/obj/item/stack/G = P - if (G.get_amount() < 2) + if(G.get_amount() < 2) user << "You need two sheets of glass to put in the glass panel." return playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user << "You start to put in the glass panel." if(do_after(user, 20) && state == 3) - if (G.use(2)) + if(G.use(2)) user << "You put in the glass panel." - src.state = 4 - src.icon_state = "[frame_type]_4" - return + state = 4 - if(istype(P, /obj/item)) + else if(istype(P, /obj/item)) if(state == 3) - if(frame_type in machines) + if(frame_type.frame_class == "machine") for(var/I in req_components) if(istype(P, I) && (req_components[I] > 0)) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) @@ -423,10 +519,10 @@ update_desc() break - if(istype(P, /obj/item/stack/material/glass/reinforced)) + else if(istype(P, /obj/item/stack/material/glass/reinforced)) var/obj/item/stack/material/glass/reinforced/CP = P if(CP.get_amount() > 1) - var/camt = min(CP.amount, req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided + var/camt = min(CP.amount, req_components[I]) // amount of glass to take, idealy amount required, but limited by amount provided var/obj/item/stack/material/glass/reinforced/CC = new /obj/item/stack/material/glass/reinforced(src) CC.amount = camt CC.update_icon() @@ -445,4 +541,6 @@ user << desc if(P && P.loc != src && !istype(P, /obj/item/stack/cable_coil) && !istype(P, /obj/item/stack/material)) user << "You cannot add that component to the machine!" - return \ No newline at end of file + return + + update_icon() \ No newline at end of file diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 58c8423a23e..158b718e833 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -19,11 +19,9 @@ Possible to do for anyone motivated enough: Itegrate EMP effect to disable the unit. */ - /* * Holopad */ - #define HOLOPAD_PASSIVE_POWER_USAGE 1 #define HOLOGRAM_POWER_USAGE 2 #define RANGE_BASED 4 @@ -37,39 +35,19 @@ var/const/HOLOPAD_MODE = RANGE_BASED icon_state = "holopad0" show_messages = 1 circuit = /obj/item/weapon/circuitboard/holopad - layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. - var/power_per_hologram = 500 //per usage per hologram idle_power_usage = 5 use_power = 1 - var/list/mob/living/silicon/ai/masters = new() //List of AIs that use the holopad var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. /obj/machinery/hologram/holopad/attackby(obj/item/I as obj, user as mob) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start removing the glass." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.circuit = M - A.anchored = 1 - A.density = 1 - A.frame_type = "holopad" - for (var/obj/C in src) - C.forceMove(loc) - user << "You remove the glass." - A.state = 4 - A.icon_state = "holopad_4" - M.deconstruct(src) - for (var/mob/living/silicon/ai/master in masters) - clear_holo(master) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return else - src.attack_hand(user) + attack_hand(user) return /obj/machinery/hologram/holopad/attack_hand(var/mob/living/carbon/human/user) //Carn: Hologram requests. @@ -87,7 +65,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED user << "A request for AI presence was already sent recently." /obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai/user) - if (!istype(user)) + if(!istype(user)) return /*There are pretty much only three ways to interact here. I don't need to check for client since they're clicking on an object. @@ -102,11 +80,11 @@ var/const/HOLOPAD_MODE = RANGE_BASED /obj/machinery/hologram/holopad/proc/activate_holo(mob/living/silicon/ai/user) if(!(stat & NOPOWER) && user.eyeobj.loc == src.loc)//If the projector has power and client eye is on it - if (user.holo) + if(user.holo) user << "ERROR: Image feed in progress." return create_holo(user)//Create one. - src.visible_message("A holographic image of [user] flicks to life right before your eyes!") + visible_message("A holographic image of [user] flicks to life right before your eyes!") else user << "ERROR: Unable to project hologram." return @@ -165,7 +143,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ user.holo = null qdel(masters[user])//Get rid of user's hologram masters -= user //Discard AI from the list of those who use holopad - if (!masters.len)//If no users left + if(!masters.len)//If no users left set_light(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted) icon_state = "holopad0" return 1 @@ -214,10 +192,10 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(1.0) qdel(src) if(2.0) - if (prob(50)) + if(prob(50)) qdel(src) if(3.0) - if (prob(5)) + if(prob(5)) qdel(src) return diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 63198710227..7e465db1895 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -14,20 +14,20 @@ var/on_icon = "sign_on" /obj/machinery/holosign/proc/toggle() - if (stat & (BROKEN|NOPOWER)) + if(stat & (BROKEN|NOPOWER)) return lit = !lit use_power = lit ? 2 : 1 update_icon() /obj/machinery/holosign/update_icon() - if (!lit) + if(!lit) icon_state = "sign_off" else icon_state = on_icon /obj/machinery/holosign/power_change() - if (stat & NOPOWER) + if(stat & NOPOWER) lit = 0 use_power = 0 update_icon() @@ -55,8 +55,8 @@ icon_state = "light[active]" for(var/obj/machinery/holosign/M in machines) - if (M.id == src.id) - spawn( 0 ) + if(M.id == id) + spawn(0) M.toggle() return diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 5fd791843d9..97c430f9d02 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -11,7 +11,7 @@ active_power_usage = 4 /obj/machinery/igniter/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/igniter/attack_hand(mob/user as mob) if(..()) @@ -19,14 +19,14 @@ add_fingerprint(user) use_power(50) - src.on = !( src.on ) - src.icon_state = text("igniter[]", src.on) + on = !(on) + icon_state = text("igniter[]", on) return /obj/machinery/igniter/process() //ugh why is this even in process()? - if (src.on && !(stat & NOPOWER) ) + if(on && !(stat & NOPOWER)) var/turf/location = src.loc - if (isturf(location)) + if(isturf(location)) location.hotspot_expose(1000,500,1) return 1 @@ -36,8 +36,8 @@ /obj/machinery/igniter/power_change() ..() - if(!( stat & NOPOWER) ) - icon_state = "igniter[src.on]" + if(!(stat & NOPOWER)) + icon_state = "igniter[on]" else icon_state = "igniter0" @@ -57,56 +57,54 @@ idle_power_usage = 2 active_power_usage = 4 - /obj/machinery/sparker/New() ..() /obj/machinery/sparker/power_change() ..() - if ( !(stat & NOPOWER) && disable == 0 ) + if(!(stat & NOPOWER) && disable == 0) icon_state = "[base_state]" -// src.sd_SetLuminosity(2) +// sd_SetLuminosity(2) else icon_state = "[base_state]-p" -// src.sd_SetLuminosity(0) +// sd_SetLuminosity(0) /obj/machinery/sparker/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/screwdriver)) + if(istype(W, /obj/item/weapon/screwdriver)) add_fingerprint(user) - src.disable = !src.disable - if (src.disable) + disable = !disable + if(disable) user.visible_message("[user] has disabled the [src]!", "You disable the connection to the [src].") icon_state = "[base_state]-d" - if (!src.disable) + if(!disable) user.visible_message("[user] has reconnected the [src]!", "You fix the connection to the [src].") - if(src.powered()) + if(powered()) icon_state = "[base_state]" else icon_state = "[base_state]-p" /obj/machinery/sparker/attack_ai() - if (src.anchored) - return src.ignite() + if(anchored) + return ignite() else return /obj/machinery/sparker/proc/ignite() - if (!(powered())) + if(!(powered())) return - if ((src.disable) || (src.last_spark && world.time < src.last_spark + 50)) + if((disable) || (last_spark && world.time < last_spark + 50)) return - flick("[base_state]-spark", src) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() - src.last_spark = world.time + last_spark = world.time use_power(1000) var/turf/location = src.loc - if (isturf(location)) + if(isturf(location)) location.hotspot_expose(1000,500,1) return 1 @@ -132,14 +130,14 @@ icon_state = "launcheract" for(var/obj/machinery/sparker/M in machines) - if (M.id == src.id) - spawn( 0 ) + if(M.id == id) + spawn(0) M.ignite() for(var/obj/machinery/igniter/M in machines) - if(M.id == src.id) + if(M.id == id) use_power(50) - M.on = !( M.on ) + M.on = !(M.on) M.icon_state = text("igniter[]", M.on) sleep(50) @@ -147,4 +145,4 @@ icon_state = "launcherbtt" active = 0 - return + return \ No newline at end of file diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 4ae639c039e..c0f2a284f4f 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -10,7 +10,7 @@ /obj/machinery/iv_drip/var/obj/item/weapon/reagent_containers/beaker = null /obj/machinery/iv_drip/update_icon() - if(src.attached) + if(attached) icon_state = "hooked" else icon_state = "" @@ -41,28 +41,28 @@ return if(attached) - visible_message("[src.attached] is detached from \the [src]") - src.attached = null - src.update_icon() + visible_message("[attached] is detached from \the [src]") + attached = null + update_icon() return if(in_range(src, usr) && ishuman(over_object) && get_dist(over_object, src) <= 1) visible_message("[usr] attaches \the [src] to \the [over_object].") - src.attached = over_object - src.update_icon() + attached = over_object + update_icon() /obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/reagent_containers)) - if(!isnull(src.beaker)) + if(istype(W, /obj/item/weapon/reagent_containers)) + if(!isnull(beaker)) user << "There is already a reagent container loaded!" return user.drop_item() W.loc = src - src.beaker = W + beaker = W user << "You attach \the [W] to \the [src]." - src.update_icon() + update_icon() return if(istype(W, /obj/item/weapon/screwdriver)) @@ -70,11 +70,11 @@ user << "You start to dismantle the IV drip." if(do_after(user, 15)) user << "You dismantle the IV drip." - var/obj/item/stack/rods/A = new /obj/item/stack/rods( src.loc ) + var/obj/item/stack/rods/A = new /obj/item/stack/rods(src.loc) A.amount = 6 - if(src.beaker) - src.beaker.loc = get_turf(src) - src.beaker = null + if(beaker) + beaker.loc = get_turf(src) + beaker = null qdel(src) return else @@ -84,24 +84,24 @@ /obj/machinery/iv_drip/process() set background = 1 - if(src.attached) + if(attached) - if(!(get_dist(src, src.attached) <= 1 && isturf(src.attached.loc))) - visible_message("The needle is ripped out of [src.attached], doesn't that hurt?") - src.attached:apply_damage(3, BRUTE, pick("r_arm", "l_arm")) - src.attached = null - src.update_icon() + if(!(get_dist(src, attached) <= 1 && isturf(attached.loc))) + visible_message("The needle is ripped out of [attached], doesn't that hurt?") + attached:apply_damage(3, BRUTE, pick("r_arm", "l_arm")) + attached = null + update_icon() return - if(src.attached && src.beaker) + if(attached && beaker) // Give blood if(mode) - if(src.beaker.volume > 0) + if(beaker.volume > 0) var/transfer_amount = REM - if(istype(src.beaker, /obj/item/weapon/reagent_containers/blood)) + if(istype(beaker, /obj/item/weapon/reagent_containers/blood)) // speed up transfer on blood packs transfer_amount = 4 - src.beaker.reagents.trans_to_mob(src.attached, transfer_amount, CHEM_BLOOD) + beaker.reagents.trans_to_mob(attached, transfer_amount, CHEM_BLOOD) update_icon() // Take blood @@ -130,7 +130,7 @@ var/datum/reagent/B = T.take_blood(beaker,amount) - if (B) + if(B) beaker.reagents.reagent_list |= B beaker.reagents.update_total() beaker.on_reagent_change() @@ -138,9 +138,9 @@ update_icon() /obj/machinery/iv_drip/attack_hand(mob/user as mob) - if(src.beaker) - src.beaker.loc = get_turf(src) - src.beaker = null + if(beaker) + beaker.loc = get_turf(src) + beaker = null update_icon() else return ..() @@ -163,7 +163,7 @@ /obj/machinery/iv_drip/examine(mob/user) ..(user) - if (!(user in view(2)) && user!=src.loc) return + if(!(user in view(2)) && user != src.loc) return user << "The IV drip is [mode ? "injecting" : "taking blood"]." @@ -177,7 +177,7 @@ usr << "[attached ? attached : "No one"] is attached." -/obj/machinery/iv_drip/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) +/obj/machinery/iv_drip/CanPass(atom/movable/mover, turf/target, height = 0, air_group = 0) if(height && istype(mover) && mover.checkpass(PASSTABLE)) //allow bullets, beams, thrown objects, mice, drones, and the like through. return 1 return ..() diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 3cc537be495..57e0e1b55a6 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -38,7 +38,6 @@ datum/track/New(var/title_name, var/audio) /obj/machinery/media/jukebox/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/capacitor(src) component_parts += new /obj/item/weapon/stock_parts/console_screen(src) diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 1be387f35fe..a3b0f9fdd4e 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -30,7 +30,6 @@ reagents = new/datum/reagents(100) reagents.my_atom = src - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/console_screen(src) component_parts += new /obj/item/weapon/stock_parts/motor(src) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 7d8e75764ce..180471f0705 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -18,19 +18,17 @@ /obj/machinery/light_switch/New() ..() spawn(5) - src.area = get_area(src) + area = get_area(src) if(otherarea) - src.area = locate(text2path("/area/[otherarea]")) + area = locate(text2path("/area/[otherarea]")) if(!name) name = "light switch ([area.name])" - src.on = src.area.lightswitch + on = area.lightswitch updateicon() - - /obj/machinery/light_switch/proc/updateicon() if(!overlay) overlay = image(icon, "light1-overlay", LIGHTING_LAYER+0.1) @@ -77,4 +75,4 @@ ..(severity) return power_change() - ..(severity) + ..(severity) \ No newline at end of file diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 30a9b8548bd..9b7760a12ea 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -113,7 +113,6 @@ Class Procs: var/global/gl_uid = 1 var/interact_offline = 0 // Can the machine be interacted with while de-powered. var/circuit = null - var/frame_type = "machine" /obj/machinery/New(l, d=0) ..(l) @@ -124,6 +123,8 @@ Class Procs: else machines += src machinery_sort_required = 1 + if(circuit) + circuit = new circuit(src) /obj/machinery/Destroy() machines -= src @@ -165,11 +166,11 @@ Class Procs: qdel(src) return if(2.0) - if (prob(50)) + if(prob(50)) qdel(src) return if(3.0) - if (prob(25)) + if(prob(25)) qdel(src) return else @@ -182,20 +183,20 @@ Class Procs: /obj/machinery/proc/auto_use_power() if(!powered(power_channel)) return 0 - if(src.use_power == 1) - use_power(idle_power_usage,power_channel, 1) - else if(src.use_power >= 2) - use_power(active_power_usage,power_channel, 1) + if(use_power == 1) + use_power(idle_power_usage, power_channel, 1) + else if(use_power >= 2) + use_power(active_power_usage, power_channel, 1) return 1 /obj/machinery/proc/operable(var/additional_flags = 0) return !inoperable(additional_flags) /obj/machinery/proc/inoperable(var/additional_flags = 0) - return (stat & (NOPOWER|BROKEN|additional_flags)) + return (stat & (NOPOWER | BROKEN | additional_flags)) /obj/machinery/CanUseTopic(var/mob/user) - if(!interact_offline && (stat & (NOPOWER|BROKEN))) + if(!interact_offline && (stat & (NOPOWER | BROKEN))) return STATUS_CLOSE return ..() @@ -214,20 +215,19 @@ Class Procs: // For some reason attack_robot doesn't work // This is to stop robots from using cameras to remotely control machines. if(user.client && user.client.eye == user) - return src.attack_hand(user) + return attack_hand(user) else - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/attack_hand(mob/user as mob) if(inoperable(MAINT)) return 1 if(user.lying || user.stat) return 1 - if ( ! (istype(usr, /mob/living/carbon/human) || \ - istype(usr, /mob/living/silicon))) + if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/living/silicon))) usr << "You don't have the dexterity to do this!" return 1 - if (ishuman(user)) + if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.getBrainLoss() >= 55) visible_message("[H] stares cluelessly at [src].") @@ -236,7 +236,7 @@ Class Procs: user << "You momentarily forget how to use [src]." return 1 - src.add_fingerprint(user) + add_fingerprint(user) return ..() @@ -252,7 +252,7 @@ Class Procs: O.show_message("\icon[src] [msg]", 2) /obj/machinery/proc/ping(text=null) - if (!text) + if(!text) text = "\The [src] pings." state(text, "blue") @@ -266,7 +266,7 @@ Class Procs: var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() - if (electrocute_mob(user, get_area(src), src, 0.7)) + if(electrocute_mob(user, get_area(src), src, 0.7)) var/area/temp_area = get_area(src) if(temp_area) var/obj/machinery/power/apc/temp_apc = temp_area.get_apc() @@ -304,7 +304,7 @@ Class Procs: RefreshParts() else user << "Following parts detected in the machine:" - for(var/var/obj/item/C in component_parts) + for(var/var/obj/item/C in component_parts) //var/var/obj/item/C? user << " [C.name]" return 1 @@ -324,31 +324,77 @@ Class Procs: update_icon() return 1 +/obj/machinery/proc/computer_deconstruction_screwdriver(var/mob/user, var/obj/item/weapon/screwdriver/S) + if(!istype(S)) + return 0 + if(!circuit) + return 0 + user << "You start disconnecting the monitor." + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + if(do_after(user, 20)) + if(stat & BROKEN) + user << "The broken glass falls out." + new /obj/item/weapon/material/shard(src.loc) + else + user << "You disconnect the monitor." + . = dismantle() + +/obj/machinery/proc/alarm_deconstruction_screwdriver(var/mob/user, var/obj/item/weapon/screwdriver/S) + if(!istype(S)) + return 0 + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + panel_open = !panel_open + user << "The wires have been [panel_open ? "exposed" : "unexposed"]" + update_icon() + return 1 + +/obj/machinery/proc/alarm_deconstruction_wirecutters(var/mob/user, var/obj/item/weapon/wirecutters/W) + if(!istype(W)) + return 0 + if(!panel_open) + return 0 + user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) + new/obj/item/stack/cable_coil(get_turf(src), 5) + . = dismantle() + /obj/machinery/proc/dismantle() - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + var/obj/structure/frame/A = new /obj/structure/frame(src.loc) var/obj/item/weapon/circuitboard/M = circuit A.circuit = M A.anchored = 1 A.density = 1 A.frame_type = M.board_type - if(A.frame_type in A.no_circuit) + if(A.frame_type.circuit) A.need_circuit = 0 - for (var/obj/D in src.component_parts) - D.forceMove(loc) - if(A.components) - A.components.Cut() + + if(A.frame_type.frame_class == "machine") + for(var/obj/D in component_parts) + D.forceMove(src.loc) + if(A.components) + A.components.Cut() + else + A.components = list() + component_parts = list() + A.check_components() + + if(A.frame_type.frame_class == "alarm") + A.state = 2 + else if(A.frame_type.frame_class == "computer" || A.frame_type.frame_class == "display") + if(stat & BROKEN) + A.state = 3 + else + A.state = 4 else - A.components = list() - component_parts = list() - A.icon_state = "[A.frame_type]_3" - A.state = 3 - A.dir = dir + A.state = 3 + + A.set_dir(dir) A.pixel_x = pixel_x A.pixel_y = pixel_y - A.check_components() A.update_desc() + A.update_icon() M.loc = null M.deconstruct(src) qdel(src) - return 1 + return 1 \ No newline at end of file diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index ca044a5a481..af61e934246 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -5,7 +5,6 @@ // This was created for firing ranges, but I suppose this could have other applications - Doohl /obj/machinery/magnetic_module - icon = 'icons/obj/objects.dmi' icon_state = "floor_magnet-f" name = "Electromagnetic Generator" @@ -29,166 +28,157 @@ var/center_y = 0 var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer - New() - ..() - var/turf/T = loc - hide(!T.is_plating()) - center = T +/obj/machinery/magnetic_module/New() + ..() + var/turf/T = loc + hide(!T.is_plating()) + center = T - spawn(10) // must wait for map loading to finish - if(radio_controller) - radio_controller.add_object(src, freq, RADIO_MAGNETS) + spawn(10) // must wait for map loading to finish + if(radio_controller) + radio_controller.add_object(src, freq, RADIO_MAGNETS) - spawn() - magnetic_process() + spawn() + magnetic_process() - // update the invisibility and icon - hide(var/intact) - invisibility = intact ? 101 : 0 - updateicon() +// update the invisibility and icon +/obj/machinery/magnetic_module/hide(var/intact) + invisibility = intact ? 101 : 0 + updateicon() - // update the icon_state - proc/updateicon() - var/state="floor_magnet" - var/onstate="" - if(!on) - onstate="0" +// update the icon_state +/obj/machinery/magnetic_module/proc/updateicon() + var/state="floor_magnet" + var/onstate="" + if(!on) + onstate="0" - if(invisibility) - icon_state = "[state][onstate]-f" // if invisible, set icon to faded version - // in case of being revealed by T-scanner - else - icon_state = "[state][onstate]" + if(invisibility) + icon_state = "[state][onstate]-f" // if invisible, set icon to faded version + // in case of being revealed by T-scanner + else + icon_state = "[state][onstate]" - receive_signal(datum/signal/signal) +/obj/machinery/magnetic_module/receive_signal(datum/signal/signal) + var/command = signal.data["command"] + var/modifier = signal.data["modifier"] + var/signal_code = signal.data["code"] + if(command && (signal_code == code)) - var/command = signal.data["command"] - var/modifier = signal.data["modifier"] - var/signal_code = signal.data["code"] - if(command && (signal_code == code)) + Cmd(command, modifier) - Cmd(command, modifier) +/obj/machinery/magnetic_module/proc/Cmd(var/command, var/modifier) + if(command) + switch(command) + if("set-electriclevel") + if(modifier) electricity_level = modifier + if("set-magneticfield") + if(modifier) magnetic_field = modifier + if("add-elec") + electricity_level++ + if(electricity_level > 12) + electricity_level = 12 + if("sub-elec") + electricity_level-- + if(electricity_level <= 0) + electricity_level = 1 + if("add-mag") + magnetic_field++ + if(magnetic_field > 4) + magnetic_field = 4 + if("sub-mag") + magnetic_field-- + if(magnetic_field <= 0) + magnetic_field = 1 + if("set-x") + if(modifier) center_x = modifier + if("set-y") + if(modifier) center_y = modifier - proc/Cmd(var/command, var/modifier) + if("N") // NORTH + center_y++ + if("S") // SOUTH + center_y-- + if("E") // EAST + center_x++ + if("W") // WEST + center_x-- + if("C") // CENTER + center_x = 0 + center_y = 0 + if("R") // RANDOM + center_x = rand(-max_dist, max_dist) + center_y = rand(-max_dist, max_dist) - if(command) - switch(command) - if("set-electriclevel") - if(modifier) electricity_level = modifier - if("set-magneticfield") - if(modifier) magnetic_field = modifier + if("set-code") + if(modifier) code = modifier + if("toggle-power") + on = !on - if("add-elec") - electricity_level++ - if(electricity_level > 12) - electricity_level = 12 - if("sub-elec") - electricity_level-- - if(electricity_level <= 0) - electricity_level = 1 - if("add-mag") - magnetic_field++ - if(magnetic_field > 4) - magnetic_field = 4 - if("sub-mag") - magnetic_field-- - if(magnetic_field <= 0) - magnetic_field = 1 + if(on) + spawn() + magnetic_process() - if("set-x") - if(modifier) center_x = modifier - if("set-y") - if(modifier) center_y = modifier +/obj/machinery/magnetic_module/process() + if(stat & NOPOWER) + on = 0 - if("N") // NORTH - center_y++ - if("S") // SOUTH - center_y-- - if("E") // EAST - center_x++ - if("W") // WEST - center_x-- - if("C") // CENTER - center_x = 0 - center_y = 0 - if("R") // RANDOM - center_x = rand(-max_dist, max_dist) - center_y = rand(-max_dist, max_dist) + // Sanity checks: + if(electricity_level <= 0) + electricity_level = 1 + if(magnetic_field <= 0) + magnetic_field = 1 - if("set-code") - if(modifier) code = modifier - if("toggle-power") - on = !on + // Limitations: + if(abs(center_x) > max_dist) + center_x = max_dist + if(abs(center_y) > max_dist) + center_y = max_dist + if(magnetic_field > 4) + magnetic_field = 4 + if(electricity_level > 12) + electricity_level = 12 - if(on) - spawn() - magnetic_process() + // Update power usage: + if(on) + use_power = 2 + active_power_usage = electricity_level*15 + else + use_power = 0 + // Overload conditions: + /* // Eeeehhh kinda stupid + if(on) + if(electricity_level > 11) + if(prob(electricity_level)) + explosion(loc, 0, 1, 2, 3) // ooo dat shit EXPLODES son + spawn(2) + qdel(src) + */ + updateicon() - process() - if(stat & NOPOWER) - on = 0 +/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the pulling + if(pulling) return + while(on) - // Sanity checks: - if(electricity_level <= 0) - electricity_level = 1 - if(magnetic_field <= 0) - magnetic_field = 1 + pulling = 1 + center = locate(x+center_x, y+center_y, z) + if(center) + for(var/obj/M in orange(magnetic_field, center)) + if(!M.anchored && (M.flags & CONDUCT)) + step_towards(M, center) + for(var/mob/living/silicon/S in orange(magnetic_field, center)) + if(istype(S, /mob/living/silicon/ai)) continue + step_towards(S, center) - // Limitations: - if(abs(center_x) > max_dist) - center_x = max_dist - if(abs(center_y) > max_dist) - center_y = max_dist - if(magnetic_field > 4) - magnetic_field = 4 - if(electricity_level > 12) - electricity_level = 12 + use_power(electricity_level * 5) + sleep(13 - electricity_level) - // Update power usage: - if(on) - use_power = 2 - active_power_usage = electricity_level*15 - else - use_power = 0 - - - // Overload conditions: - /* // Eeeehhh kinda stupid - if(on) - if(electricity_level > 11) - if(prob(electricity_level)) - explosion(loc, 0, 1, 2, 3) // ooo dat shit EXPLODES son - spawn(2) - qdel(src) - */ - - updateicon() - - - proc/magnetic_process() // proc that actually does the pulling - if(pulling) return - while(on) - - pulling = 1 - center = locate(x+center_x, y+center_y, z) - if(center) - for(var/obj/M in orange(magnetic_field, center)) - if(!M.anchored && (M.flags & CONDUCT)) - step_towards(M, center) - - for(var/mob/living/silicon/S in orange(magnetic_field, center)) - if(istype(S, /mob/living/silicon/ai)) continue - step_towards(S, center) - - use_power(electricity_level * 5) - sleep(13 - electricity_level) - - pulling = 0 + pulling = 0 /obj/machinery/magnetic_module/Destroy() if(radio_controller) @@ -220,186 +210,186 @@ var/datum/radio_frequency/radio_connection - New() - ..() +/obj/machinery/magnetic_controller/New() + ..() - if(autolink) - for(var/obj/machinery/magnetic_module/M in world) - if(M.freq == frequency && M.code == code) - magnets.Add(M) + if(autolink) + for(var/obj/machinery/magnetic_module/M in world) + if(M.freq == frequency && M.code == code) + magnets.Add(M) - spawn(45) // must wait for map loading to finish - if(radio_controller) - radio_connection = radio_controller.add_object(src, frequency, RADIO_MAGNETS) + spawn(45) // must wait for map loading to finish + if(radio_controller) + radio_connection = radio_controller.add_object(src, frequency, RADIO_MAGNETS) - if(path) // check for default path - filter_path() // renders rpath + if(path) // check for default path + filter_path() // renders rpath - process() - if(magnets.len == 0 && autolink) - for(var/obj/machinery/magnetic_module/M in world) - if(M.freq == frequency && M.code == code) - magnets.Add(M) +/obj/machinery/magnetic_controller/process() + if(magnets.len == 0 && autolink) + for(var/obj/machinery/magnetic_module/M in world) + if(M.freq == frequency && M.code == code) + magnets.Add(M) - attack_ai(mob/user as mob) - return src.attack_hand(user) +/obj/machinery/magnetic_controller/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/magnetic_controller/attack_hand(mob/user as mob) + if(stat & (BROKEN|NOPOWER)) + return + user.set_machine(src) + var/dat = "Magnetic Control Console

    " + if(!autolink) + dat += {" + Frequency: [frequency]
    + Code: [code]
    + Probe Generators
    + "} + + if(magnets.len >= 1) + + dat += "Magnets confirmed:
    " + var/i = 0 + for(var/obj/machinery/magnetic_module/M in magnets) + i++ + dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
    " + + dat += "
    Speed: - [speed] +
    " + dat += "Path: {[path]}
    " + dat += "Moving: [moving ? "Enabled":"Disabled"]" + + + user << browse(dat, "window=magnet;size=400x500") + onclose(user, "magnet") + +/obj/machinery/magnetic_controller/Topic(href, href_list) + if(stat & (BROKEN|NOPOWER)) + return + usr.set_machine(src) + add_fingerprint(usr) + + if(href_list["radio-op"]) + + // Prepare signal beforehand, because this is a radio operation + var/datum/signal/signal = new + signal.transmission_method = 1 // radio transmission + signal.source = src + signal.frequency = frequency + signal.data["code"] = code + + // Apply any necessary commands + switch(href_list["radio-op"]) + if("togglepower") + signal.data["command"] = "toggle-power" + + if("minuselec") + signal.data["command"] = "sub-elec" + if("pluselec") + signal.data["command"] = "add-elec" + + if("minusmag") + signal.data["command"] = "sub-mag" + if("plusmag") + signal.data["command"] = "add-mag" + + + // Broadcast the signal + + radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) + + spawn(1) + updateUsrDialog() // pretty sure this increases responsiveness + + if(href_list["operation"]) + switch(href_list["operation"]) + if("plusspeed") + speed ++ + if(speed > 10) + speed = 10 + if("minusspeed") + speed -- + if(speed <= 0) + speed = 1 + if("setpath") + var/newpath = sanitize(input(usr, "Please define a new path!",,path) as text|null) + if(newpath && newpath != "") + moving = 0 // stop moving + path = newpath + pathpos = 1 // reset position + filter_path() // renders rpath + + if("togglemoving") + moving = !moving + if(moving) + spawn() MagnetMove() + + + updateUsrDialog() + +/obj/machinery/magnetic_controller/proc/MagnetMove() + if(looping) return + + while(moving && rpath.len >= 1) - attack_hand(mob/user as mob) if(stat & (BROKEN|NOPOWER)) - return - user.set_machine(src) - var/dat = "Magnetic Control Console

    " - if(!autolink) - dat += {" - Frequency: [frequency]
    - Code: [code]
    - Probe Generators
    - "} + break - if(magnets.len >= 1) + looping = 1 - dat += "Magnets confirmed:
    " - var/i = 0 - for(var/obj/machinery/magnetic_module/M in magnets) - i++ - dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
    " + // Prepare the radio signal + var/datum/signal/signal = new + signal.transmission_method = 1 // radio transmission + signal.source = src + signal.frequency = frequency + signal.data["code"] = code - dat += "
    Speed: - [speed] +
    " - dat += "Path: {[path]}
    " - dat += "Moving: [moving ? "Enabled":"Disabled"]" + if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list! + pathpos = 1 + + var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive + + if(!(nextmove in list("N","S","E","W","C","R"))) + // N, S, E, W are directional + // C is center + // R is random (in magnetic field's bounds) + qdel(signal) + break // break the loop if the character located is invalid + + signal.data["command"] = nextmove - user << browse(dat, "window=magnet;size=400x500") - onclose(user, "magnet") - - Topic(href, href_list) - if(stat & (BROKEN|NOPOWER)) - return - usr.set_machine(src) - src.add_fingerprint(usr) - - if(href_list["radio-op"]) - - // Prepare signal beforehand, because this is a radio operation - var/datum/signal/signal = new - signal.transmission_method = 1 // radio transmission - signal.source = src - signal.frequency = frequency - signal.data["code"] = code - - // Apply any necessary commands - switch(href_list["radio-op"]) - if("togglepower") - signal.data["command"] = "toggle-power" - - if("minuselec") - signal.data["command"] = "sub-elec" - if("pluselec") - signal.data["command"] = "add-elec" - - if("minusmag") - signal.data["command"] = "sub-mag" - if("plusmag") - signal.data["command"] = "add-mag" - - - // Broadcast the signal + pathpos++ // increase iterator + // Broadcast the signal + spawn() radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) - spawn(1) - updateUsrDialog() // pretty sure this increases responsiveness + if(speed == 10) + sleep(1) + else + sleep(12-speed) - if(href_list["operation"]) - switch(href_list["operation"]) - if("plusspeed") - speed ++ - if(speed > 10) - speed = 10 - if("minusspeed") - speed -- - if(speed <= 0) - speed = 1 - if("setpath") - var/newpath = sanitize(input(usr, "Please define a new path!",,path) as text|null) - if(newpath && newpath != "") - moving = 0 // stop moving - path = newpath - pathpos = 1 // reset position - filter_path() // renders rpath - - if("togglemoving") - moving = !moving - if(moving) - spawn() MagnetMove() + looping = 0 - updateUsrDialog() +/obj/machinery/magnetic_controller/proc/filter_path() + // Generates the rpath variable using the path string, think of this as "string2list" + // Doesn't use params2list() because of the akward way it stacks entities + rpath = list() // clear rpath + var/maximum_character = min(50, length(path)) // chooses the maximum length of the iterator. 50 max length - proc/MagnetMove() - if(looping) return + for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path - while(moving && rpath.len >= 1) + var/nextchar = copytext(path, i, i+1) // find next character - if(stat & (BROKEN|NOPOWER)) - break + if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore + rpath += copytext(path, i, i+1) // else, add to list - looping = 1 - - // Prepare the radio signal - var/datum/signal/signal = new - signal.transmission_method = 1 // radio transmission - signal.source = src - signal.frequency = frequency - signal.data["code"] = code - - if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list! - pathpos = 1 - - var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive - - if(!(nextmove in list("N","S","E","W","C","R"))) - // N, S, E, W are directional - // C is center - // R is random (in magnetic field's bounds) - qdel(signal) - break // break the loop if the character located is invalid - - signal.data["command"] = nextmove - - - pathpos++ // increase iterator - - // Broadcast the signal - spawn() - radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) - - if(speed == 10) - sleep(1) - else - sleep(12-speed) - - looping = 0 - - - proc/filter_path() - // Generates the rpath variable using the path string, think of this as "string2list" - // Doesn't use params2list() because of the akward way it stacks entities - rpath = list() // clear rpath - var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length - - for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path - - var/nextchar = copytext(path, i, i+1) // find next character - - if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore - rpath += copytext(path, i, i+1) // else, add to list - - // there doesn't HAVE to be separators but it makes paths syntatically visible + // there doesn't HAVE to be separators but it makes paths syntatically visible /obj/machinery/magnetic_controller/Destroy() if(radio_controller) diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index f563d9ef391..4d1affb3a0c 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -18,7 +18,6 @@ /obj/machinery/mass_driver/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/motor(src) component_parts += new /obj/item/weapon/stock_parts/motor(src) @@ -59,7 +58,7 @@ M << "The mass driver lets out a screech, it mustn't be able to handle any more items." break use_power(500) - spawn( 0 ) + spawn(0) O.throw_at(target, drive_range * power, power) flick("mass_driver1", src) return diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 0c14c66990e..fe5cac9c44c 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -1,11 +1,9 @@ // Navigation beacon for AI robots // Functions as a transponder: looks for incoming signal matching - var/global/list/navbeacons // no I don't like putting this in, but it will do for now /obj/machinery/navbeacon - icon = 'icons/obj/objects.dmi' icon_state = "navbeacon0-f" name = "navigation beacon" @@ -13,162 +11,160 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do level = 1 // underfloor layer = 2.5 anchored = 1 - var/open = 0 // true if cover is open var/locked = 1 // true if controls are locked var/freq = 1445 // radio frequency var/location = "" // location response text var/list/codes // assoc. list of transponder codes var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value" - req_access = list(access_engine) - New() - ..() +/obj/machinery/navbeacon/New() + ..() - set_codes() + set_codes() - var/turf/T = loc - hide(!T.is_plating()) + var/turf/T = loc + hide(!T.is_plating()) - // add beacon to MULE bot beacon list - if(freq == 1400) - if(!navbeacons) - navbeacons = new() - navbeacons += src + // add beacon to MULE bot beacon list + if(freq == 1400) + if(!navbeacons) + navbeacons = new() + navbeacons += src - spawn(5) // must wait for map loading to finish - if(radio_controller) - radio_controller.add_object(src, freq, RADIO_NAVBEACONS) + spawn(5) // must wait for map loading to finish + if(radio_controller) + radio_controller.add_object(src, freq, RADIO_NAVBEACONS) - // set the transponder codes assoc list from codes_txt - proc/set_codes() - if(!codes_txt) - return - - codes = new() - - var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons - - for(var/e in entries) - var/index = findtext(e, "=") // format is "key=value" - if(index) - var/key = copytext(e, 1, index) - var/val = copytext(e, index+1) - codes[key] = val - else - codes[e] = "1" - - - // called when turf state changes - // hide the object if turf is intact - hide(var/intact) - invisibility = intact ? 101 : 0 - updateicon() - - // update the icon_state - proc/updateicon() - var/state="navbeacon[open]" - - if(invisibility) - icon_state = "[state]-f" // if invisible, set icon to faded version - // in case revealed by T-scanner - else - icon_state = "[state]" - - - // look for a signal of the form "findbeacon=X" - // where X is any - // or the location - // or one of the set transponder keys - // if found, return a signal - receive_signal(datum/signal/signal) - - var/request = signal.data["findbeacon"] - if(request && ((request in codes) || request == "any" || request == location)) - spawn(1) - post_signal() - - // return a signal giving location and transponder codes - - proc/post_signal() - - var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) - - if(!frequency) return - - var/datum/signal/signal = new() - signal.source = src - signal.transmission_method = 1 - signal.data["beacon"] = location - - for(var/key in codes) - signal.data[key] = codes[key] - - frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - - - attackby(var/obj/item/I, var/mob/user) - var/turf/T = loc - if(!T.is_plating()) - return // prevent intraction when T-scanner revealed - - if(istype(I, /obj/item/weapon/screwdriver)) - open = !open - - user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.") - - updateicon() - - else if (istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) - if(open) - if (src.allowed(user)) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - else - user << "Access denied." - updateDialog() - else - user << "You must open the cover first!" +// set the transponder codes assoc list from codes_txt +/obj/machinery/navbeacon/proc/set_codes() + if(!codes_txt) return - attack_ai(var/mob/user) - interact(user, 1) + codes = new() - attack_hand(var/mob/user) + var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons - if(!user.IsAdvancedToolUser()) - return 0 - - interact(user, 0) - - interact(var/mob/user, var/ai = 0) - var/turf/T = loc - if(!T.is_plating()) - return // prevent intraction when T-scanner revealed - - if(!open && !ai) // can't alter controls if not open, unless you're an AI - user << "The beacon's control cover is closed." - return + for(var/e in entries) + var/index = findtext(e, "=") // format is "key=value" + if(index) + var/key = copytext(e, 1, index) + var/val = copytext(e, index+1) + codes[key] = val + else + codes[e] = "1" - var/t +// called when turf state changes +// hide the object if turf is intact +/obj/machinery/navbeacon/hide(var/intact) + invisibility = intact ? 101 : 0 + updateicon() - if(locked && !ai) - t = {"Navigation Beacon

    +// update the icon_state +/obj/machinery/navbeacon/proc/updateicon() + var/state="navbeacon[open]" + + if(invisibility) + icon_state = "[state]-f" // if invisible, set icon to faded version + // in case revealed by T-scanner + else + icon_state = "[state]" + + +// look for a signal of the form "findbeacon=X" +// where X is any +// or the location +// or one of the set transponder keys +// if found, return a signal +/obj/machinery/navbeacon/receive_signal(datum/signal/signal) + + var/request = signal.data["findbeacon"] + if(request && ((request in codes) || request == "any" || request == location)) + spawn(1) + post_signal() + +// return a signal giving location and transponder codes + +/obj/machinery/navbeacon/proc/post_signal() + + var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) + + if(!frequency) return + + var/datum/signal/signal = new() + signal.source = src + signal.transmission_method = 1 + signal.data["beacon"] = location + + for(var/key in codes) + signal.data[key] = codes[key] + + frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) + + +/obj/machinery/navbeacon/attackby(var/obj/item/I, var/mob/user) + var/turf/T = loc + if(!T.is_plating()) + return // prevent intraction when T-scanner revealed + + if(istype(I, /obj/item/weapon/screwdriver)) + open = !open + + user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.") + + updateicon() + + else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) + if(open) + if(allowed(user)) + locked = !locked + user << "Controls are now [locked ? "locked." : "unlocked."]" + else + user << "Access denied." + updateDialog() + else + user << "You must open the cover first!" + return + +/obj/machinery/navbeacon/attack_ai(var/mob/user) + interact(user, 1) + +/obj/machinery/navbeacon/attack_hand(var/mob/user) + + if(!user.IsAdvancedToolUser()) + return 0 + + interact(user, 0) + +/obj/machinery/navbeacon/interact(var/mob/user, var/ai = 0) + var/turf/T = loc + if(!T.is_plating()) + return // prevent intraction when T-scanner revealed + + if(!open && !ai) // can't alter controls if not open, unless you're an AI + user << "The beacon's control cover is closed." + return + + + var/t + + if(locked && !ai) + t = {"Navigation Beacon

    (swipe card to unlock controls)
    Frequency: [format_frequency(freq)]

    Location: [location ? location : "(none)"]
    Transponder Codes:
      "} - for(var/key in codes) - t += "
    • [key] ... [codes[key]]" - t+= "
        " + for(var/key in codes) + t += "
      • [key] ... [codes[key]]" + t+= "
          " - else + else - t = {"Navigation Beacon

          + t = {"Navigation Beacon

          (swipe card to lock controls)
          Frequency: - @@ -180,75 +176,75 @@ Frequency: Location: [location ? location : "(none)"]
          Transponder Codes:
            "} - for(var/key in codes) - t += "
          • [key] ... [codes[key]]" - t += " (edit)" - t += " (delete)
            " - t += "(add new)
            " - t+= "
              " + for(var/key in codes) + t += "
            • [key] ... [codes[key]]" + t += " (edit)" + t += " (delete)
              " + t += "(add new)
              " + t+= "
                " - user << browse(t, "window=navbeacon") - onclose(user, "navbeacon") + user << browse(t, "window=navbeacon") + onclose(user, "navbeacon") + return + +/obj/machinery/navbeacon/Topic(href, href_list) + ..() + if(usr.stat) return + if((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon))) + if(open && !locked) + usr.set_machine(src) - Topic(href, href_list) - ..() - if (usr.stat) - return - if ((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon))) - if(open && !locked) - usr.set_machine(src) + if(href_list["freq"]) + freq = sanitize_frequency(freq + text2num(href_list["freq"])) + updateDialog() - if (href_list["freq"]) - freq = sanitize_frequency(freq + text2num(href_list["freq"])) + else if(href_list["locedit"]) + var/newloc = sanitize(input("Enter New Location", "Navigation Beacon", location) as text|null) + if(newloc) + location = newloc updateDialog() - else if(href_list["locedit"]) - var/newloc = sanitize(input("Enter New Location", "Navigation Beacon", location) as text|null) - if(newloc) - location = newloc - updateDialog() + else if(href_list["edit"]) + var/codekey = href_list["code"] - else if(href_list["edit"]) - var/codekey = href_list["code"] + var/newkey = input("Enter Transponder Code Key", "Navigation Beacon", codekey) as text|null + if(!newkey) + return - var/newkey = input("Enter Transponder Code Key", "Navigation Beacon", codekey) as text|null - if(!newkey) - return + var/codeval = codes[codekey] + var/newval = input("Enter Transponder Code Value", "Navigation Beacon", codeval) as text|null + if(!newval) + newval = codekey + return - var/codeval = codes[codekey] - var/newval = input("Enter Transponder Code Value", "Navigation Beacon", codeval) as text|null - if(!newval) - newval = codekey - return + codes.Remove(codekey) + codes[newkey] = newval - codes.Remove(codekey) - codes[newkey] = newval + updateDialog() - updateDialog() + else if(href_list["delete"]) + var/codekey = href_list["code"] + codes.Remove(codekey) + updateDialog() - else if(href_list["delete"]) - var/codekey = href_list["code"] - codes.Remove(codekey) - updateDialog() + else if(href_list["add"]) - else if(href_list["add"]) + var/newkey = input("Enter New Transponder Code Key", "Navigation Beacon") as text|null + if(!newkey) + return - var/newkey = input("Enter New Transponder Code Key", "Navigation Beacon") as text|null - if(!newkey) - return + var/newval = input("Enter New Transponder Code Value", "Navigation Beacon") as text|null + if(!newval) + newval = "1" + return - var/newval = input("Enter New Transponder Code Value", "Navigation Beacon") as text|null - if(!newval) - newval = "1" - return + if(!codes) + codes = new() - if(!codes) - codes = new() + codes[newkey] = newval - codes[newkey] = newval - - updateDialog() + updateDialog() /obj/machinery/navbeacon/Destroy() navbeacons.Remove(src) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 7bfe32d7191..1de7cc367b2 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -76,7 +76,7 @@ var/datum/feed_message/newMsg = new /datum/feed_message newMsg.author = author newMsg.body = msg - newMsg.time_stamp = "[worldtime2text()]" + newMsg.time_stamp = "[stationtime2text()]" newMsg.is_admin_message = adminMessage if(message_type) newMsg.message_type = message_type @@ -101,9 +101,9 @@ var/list/receiving_pdas = new for (var/obj/item/device/pda/P in PDAs) - if (!P.owner) + if(!P.owner) continue - if (P.toff) + if(P.toff) continue receiving_pdas += P @@ -120,7 +120,6 @@ var/datum/feed_network/news_network = new /datum/feed_network //The global n var/list/obj/machinery/newscaster/allCasters = list() //Global list that will contain reference to all newscasters in existence. - /obj/machinery/newscaster name = "newscaster" desc = "A standard newsfeed handler for use on commercial space stations. All the news you absolutely have no use for, in one place!" @@ -167,7 +166,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co light_range = 0 anchored = 1 var/obj/machinery/exonet_node/node = null - circuit = /obj/item/weapon/circuitboard/newscaster + circuit = /obj/item/weapon/circuitboard/newscaster /obj/machinery/newscaster/security_unit //Security unit name = "Security Newscaster" @@ -175,10 +174,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/New() //Constructor, ho~ allCasters += src - src.paper_remaining = 15 // Will probably change this to something better + paper_remaining = 15 // Will probably change this to something better for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) // Let's give it an appropriate unit number - src.unit_no++ - src.update_icon() //for any custom ones on the map... + unit_no++ + update_icon() //for any custom ones on the map... spawn(10) //Should be enough time for the node to spawn at tcomms. node = get_exonet_node() ..() //I just realised the newscasters weren't in the global machines list. The superconstructor call will tend to that @@ -191,21 +190,21 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(!ispowered || isbroken) icon_state = "newscaster_off" if(isbroken) //If the thing is smashed, add crack overlay on top of the unpowered sprite. - src.overlays.Cut() - src.overlays += image(src.icon, "crack3") + overlays.Cut() + overlays += image(icon, "crack3") return - src.overlays.Cut() //reset overlays + overlays.Cut() //reset overlays if(news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message icon_state = "newscaster_wanted" return if(alert) //new message alert overlay - src.overlays += "newscaster_alert" + overlays += "newscaster_alert" if(hitstaken > 0) //Cosmetic damage overlay - src.overlays += image(src.icon, "crack[hitstaken]") + overlays += image(icon, "crack[hitstaken]") icon_state = "newscaster_normal" return @@ -214,14 +213,13 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(isbroken) //Broken shit can't be powered. return ..() - if( !(stat & NOPOWER) ) - src.ispowered = 1 - src.update_icon() + if(!(stat & NOPOWER)) + ispowered = 1 + update_icon() else spawn(rand(0, 15)) - src.ispowered = 0 - src.update_icon() - + ispowered = 0 + update_icon() /obj/machinery/newscaster/ex_act(severity) switch(severity) @@ -229,25 +227,24 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co qdel(src) return if(2.0) - src.isbroken=1 + isbroken=1 if(prob(50)) qdel(src) else - src.update_icon() //can't place it above the return and outside the if-else. or we might get runtimes of null.update_icon() if(prob(50)) goes in. + update_icon() //can't place it above the return and outside the if-else. or we might get runtimes of null.update_icon() if(prob(50)) goes in. return else if(prob(50)) - src.isbroken=1 - src.update_icon() + isbroken=1 + update_icon() return return /obj/machinery/newscaster/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/newscaster/attack_hand(mob/user as mob) //########### THE MAIN BEEF IS HERE! And in the proc below this...############ - - if(!src.ispowered || src.isbroken) + if(!ispowered || isbroken) return if(!node) @@ -261,16 +258,16 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(!user.IsAdvancedToolUser()) return 0 - if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon) ) + if(istype(user, /mob/living/carbon/human) || istype(user,/mob/living/silicon)) var/mob/living/human_or_robot_user = user var/dat - dat = text("Newscaster

                Newscaster Unit #[src.unit_no]

                ") + dat = text("Newscaster

                Newscaster Unit #[unit_no]

                ") - src.scan_user(human_or_robot_user) //Newscaster scans you + scan_user(human_or_robot_user) //Newscaster scans you switch(screen) if(0) - dat += "Welcome to Newscasting Unit #[src.unit_no].
                Interface & News networks Operational." + dat += "Welcome to Newscasting Unit #[unit_no].
                Interface & News networks Operational." dat += "
                Property of Nanotransen Inc" if(news_network.wanted_issue) dat+= "
                Read Wanted Issue" @@ -280,7 +277,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+= "
                Print newspaper" dat+= "
                Re-scan User" dat+= "

                Exit" - if(src.securityCaster) + if(securityCaster) var/wanted_already = 0 if(news_network.wanted_issue) wanted_already = 1 @@ -289,10 +286,10 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="
                [(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue" dat+="
                Censor Feed Stories" dat+="
                Mark Feed Channel with [company_name] D-Notice" - dat+="

                The newscaster recognises you as: [src.scanned_user]" + dat+="

                The newscaster recognises you as: [scanned_user]" if(1) dat+= "Station Feed Channels
                " - if( isemptylist(news_network.network_channels) ) + if(isemptylist(news_network.network_channels)) dat+="No active channels found..." else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) @@ -304,30 +301,30 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="
                Back" if(2) dat+="Creating new Feed Channel..." - dat+="
                Channel Name: [src.channel_name]
                " - dat+="Channel Author: [src.scanned_user]
                " - dat+="Will Accept Public Feeds: [(src.c_locked) ? ("NO") : ("YES")]

                " + dat+="
                Channel Name: [channel_name]
                " + dat+="Channel Author: [scanned_user]
                " + dat+="Will Accept Public Feeds: [(c_locked) ? ("NO") : ("YES")]

                " dat+="
                Submit

                Cancel
                " if(3) dat+="Creating new Feed Message..." - dat+="
                Receiving Channel: [src.channel_name]
                " //MARK - dat+="Message Author: [src.scanned_user]
                " - dat+="Message Body: [src.msg]
                " - dat+="Attach Photo: [(src.photo_data ? "Photo Attached" : "No Photo")]
                " + dat+="
                Receiving Channel: [channel_name]
                " //MARK + dat+="Message Author: [scanned_user]
                " + dat+="Message Body: [msg]
                " + dat+="Attach Photo: [(photo_data ? "Photo Attached" : "No Photo")]
                " dat+="
                Submit

                Cancel
                " if(4) - dat+="Feed story successfully submitted to [src.channel_name].

                " + dat+="Feed story successfully submitted to [channel_name].

                " dat+="
                Return
                " if(5) - dat+="Feed Channel [src.channel_name] created successfully.

                " + dat+="Feed Channel [channel_name] created successfully.

                " dat+="
                Return
                " if(6) dat+="ERROR: Could not submit Feed story to Network.

                " - if(src.channel_name=="") + if(channel_name=="") dat+="•Invalid receiving channel name.
                " - if(src.scanned_user=="Unknown") + if(scanned_user=="Unknown") dat+="•Channel author unverified.
                " - if(src.msg == "" || src.msg == "\[REDACTED\]") + if(msg == "" || msg == "\[REDACTED\]") dat+="•Invalid message body.
                " dat+="
                Return
                " @@ -339,18 +336,18 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co existing_authors += FC.backup_author else existing_authors += FC.author - if(src.scanned_user in existing_authors) + if(scanned_user in existing_authors) dat+="•There already exists a Feed channel under your name.
                " - if(src.channel_name=="" || src.channel_name == "\[REDACTED\]") + if(channel_name=="" || channel_name == "\[REDACTED\]") dat+="•Invalid channel name.
                " var/check = 0 for(var/datum/feed_channel/FC in news_network.network_channels) - if(FC.channel_name == src.channel_name) + if(FC.channel_name == channel_name) check = 1 break if(check) dat+="•Channel name already in use.
                " - if(src.scanned_user=="Unknown") + if(scanned_user=="Unknown") dat+="•Channel author unverified.
                " dat+="
                Return
                " if(8) @@ -363,20 +360,20 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else active_num-- dat+="Network currently serves a total of [total_num] Feed channels, [active_num] of which are active, and a total of [message_num] Feed Stories." //TODO: CONTINUE - dat+="

                Liquid Paper remaining: [(src.paper_remaining) *100 ] cm^3" + dat+="

                Liquid Paper remaining: [(paper_remaining) *100 ] cm^3" dat+="

                Print Paper" dat+="
                Cancel" if(9) - dat+="[src.viewing_channel.channel_name]: \[created by: [src.viewing_channel.author]\]
                " - if(src.viewing_channel.censored) + dat+="[viewing_channel.channel_name]: \[created by: [viewing_channel.author]\]
                " + if(viewing_channel.censored) dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a [company_name] D-Notice.
                " dat+="No further feed story additions are allowed while the D-Notice is in effect.

                " else - if( isemptylist(src.viewing_channel.messages) ) + if(isemptylist(viewing_channel.messages)) dat+="No feed messages found in channel...
                " else var/i = 0 - for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) + for(var/datum/feed_message/MESSAGE in viewing_channel.messages) i++ dat+="-[MESSAGE.body]
                " if(MESSAGE.img) @@ -412,28 +409,28 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="
                Back" if(12) - dat+="[src.viewing_channel.channel_name]: \[ created by: [src.viewing_channel.author] \]
                " - dat+="[(src.viewing_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
                " + dat+="[viewing_channel.channel_name]: \[ created by: [viewing_channel.author] \]
                " + dat+="[(viewing_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
                " - if( isemptylist(src.viewing_channel.messages) ) + if(isemptylist(viewing_channel.messages)) dat+="No feed messages found in channel...
                " else - for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) + for(var/datum/feed_message/MESSAGE in viewing_channel.messages) dat+="-[MESSAGE.body]
                \[[MESSAGE.message_type] by [MESSAGE.author]\]
                " dat+="[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
                " dat+="
                Back" if(13) - dat+="[src.viewing_channel.channel_name]: \[ created by: [src.viewing_channel.author] \]
                " - dat+="Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel.
                " - if(src.viewing_channel.censored) + dat+="[viewing_channel.channel_name]: \[ created by: [viewing_channel.author] \]
                " + dat+="Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel.
                " + if(viewing_channel.censored) dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a [company_name] D-Notice.
                " dat+="No further feed story additions are allowed while the D-Notice is in effect.

                " else - if( isemptylist(src.viewing_channel.messages) ) + if(isemptylist(viewing_channel.messages)) dat+="No feed messages found in channel...
                " else - for(var/datum/feed_message/MESSAGE in src.viewing_channel.messages) + for(var/datum/feed_message/MESSAGE in viewing_channel.messages) dat+="-[MESSAGE.body]
                \[[MESSAGE.message_type] by [MESSAGE.author]\]
                " dat+="
                Back" @@ -448,27 +445,27 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co if(wanted_already) dat+="
                A wanted issue is already in Feed Circulation. You can edit or cancel it below.
                " dat+="
                " - dat+="Criminal Name: [src.channel_name]
                " - dat+="Description: [src.msg]
                " - dat+="Attach Photo: [(src.photo_data ? "Photo Attached" : "No Photo")]
                " + dat+="Criminal Name: [channel_name]
                " + dat+="Description: [msg]
                " + dat+="Attach Photo: [(photo_data ? "Photo Attached" : "No Photo")]
                " if(wanted_already) dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author]
                " else - dat+="Wanted Issue will be created under prosecutor: [src.scanned_user]
                " + dat+="Wanted Issue will be created under prosecutor: [scanned_user]
                " dat+="
                [(wanted_already) ? ("Edit Issue") : ("Submit")]" if(wanted_already) dat+="
                Take down Issue" dat+="
                Cancel" if(15) - dat+="Wanted issue for [src.channel_name] is now in Network Circulation.

                " + dat+="Wanted issue for [channel_name] is now in Network Circulation.

                " dat+="
                Return
                " if(16) dat+="ERROR: Wanted Issue rejected by Network.

                " - if(src.channel_name=="" || src.channel_name == "\[REDACTED\]") + if(channel_name=="" || channel_name == "\[REDACTED\]") dat+="•Invalid name for person wanted.
                " - if(src.scanned_user=="Unknown") + if(scanned_user=="Unknown") dat+="•Issue author unverified.
                " - if(src.msg == "" || src.msg == "\[REDACTED\]") + if(msg == "" || msg == "\[REDACTED\]") dat+="•Invalid description.
                " dat+="
                Return
                " if(17) @@ -486,7 +483,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co dat+="None" dat+="

                Back
                " if(19) - dat+="Wanted issue for [src.channel_name] successfully edited.

                " + dat+="Wanted issue for [channel_name] successfully edited.

                " dat+="
                Return
                " if(20) dat+="Printing successful. Please receive your newspaper from the bottom of the machine.

                " @@ -504,17 +501,17 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/machinery/newscaster/Topic(href, href_list) if(..()) return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) if(href_list["set_channel_name"]) - src.channel_name = sanitizeSafe(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""), MAX_LNAME_LEN) - src.updateUsrDialog() - //src.update_icon() + channel_name = sanitizeSafe(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", ""), MAX_LNAME_LEN) + updateUsrDialog() + //update_icon() else if(href_list["set_channel_lock"]) - src.c_locked = !src.c_locked - src.updateUsrDialog() - //src.update_icon() + c_locked = !c_locked + updateUsrDialog() + //update_icon() else if(href_list["submit_new_channel"]) //var/list/existing_channels = list() //OBSOLETE @@ -527,73 +524,73 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co existing_authors +=FC.author var/check = 0 for(var/datum/feed_channel/FC in news_network.network_channels) - if(FC.channel_name == src.channel_name) + if(FC.channel_name == channel_name) check = 1 break - if(src.channel_name == "" || src.channel_name == "\[REDACTED\]" || src.scanned_user == "Unknown" || check || (src.scanned_user in existing_authors) ) - src.screen=7 + if(channel_name == "" || channel_name == "\[REDACTED\]" || scanned_user == "Unknown" || check || (scanned_user in existing_authors)) + screen=7 else var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel") if(choice=="Confirm") - news_network.CreateFeedChannel(src.channel_name, src.scanned_user, c_locked) - src.screen=5 - src.updateUsrDialog() - //src.update_icon() + news_network.CreateFeedChannel(channel_name, scanned_user, c_locked) + screen=5 + updateUsrDialog() + //update_icon() else if(href_list["set_channel_receiving"]) //var/list/datum/feed_channel/available_channels = list() var/list/available_channels = list() for(var/datum/feed_channel/F in news_network.network_channels) - if( (!F.locked || F.author == scanned_user) && !F.censored) + if((!F.locked || F.author == scanned_user) && !F.censored) available_channels += F.channel_name - src.channel_name = input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels - src.updateUsrDialog() + channel_name = input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels + updateUsrDialog() else if(href_list["set_new_message"]) - src.msg = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "")) - src.updateUsrDialog() + msg = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "")) + updateUsrDialog() else if(href_list["set_attachment"]) AttachPhoto(usr) - src.updateUsrDialog() + updateUsrDialog() else if(href_list["submit_new_message"]) - if(src.msg =="" || src.msg=="\[REDACTED\]" || src.scanned_user == "Unknown" || src.channel_name == "" ) - src.screen=6 + if(msg =="" || msg=="\[REDACTED\]" || scanned_user == "Unknown" || channel_name == "") + screen=6 else var/image = photo_data ? photo_data.photo : null feedback_inc("newscaster_stories",1) - news_network.SubmitArticle(src.msg, src.scanned_user, src.channel_name, image, 0) - src.screen=4 + news_network.SubmitArticle(msg, scanned_user, channel_name, image, 0) + screen=4 - src.updateUsrDialog() + updateUsrDialog() else if(href_list["create_channel"]) - src.screen=2 - src.updateUsrDialog() + screen=2 + updateUsrDialog() else if(href_list["create_feed_story"]) - src.screen=3 - src.updateUsrDialog() + screen=3 + updateUsrDialog() else if(href_list["menu_paper"]) - src.screen=8 - src.updateUsrDialog() + screen=8 + updateUsrDialog() else if(href_list["print_paper"]) - if(!src.paper_remaining) - src.screen=21 + if(!paper_remaining) + screen=21 else - src.print_paper() - src.screen = 20 - src.updateUsrDialog() + print_paper() + screen = 20 + updateUsrDialog() else if(href_list["menu_censor_story"]) - src.screen=10 - src.updateUsrDialog() + screen=10 + updateUsrDialog() else if(href_list["menu_censor_channel"]) - src.screen=11 - src.updateUsrDialog() + screen=11 + updateUsrDialog() else if(href_list["menu_wanted"]) var/already_wanted = 0 @@ -601,48 +598,48 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co already_wanted = 1 if(already_wanted) - src.channel_name = news_network.wanted_issue.author - src.msg = news_network.wanted_issue.body - src.screen = 14 - src.updateUsrDialog() + channel_name = news_network.wanted_issue.author + msg = news_network.wanted_issue.body + screen = 14 + updateUsrDialog() else if(href_list["set_wanted_name"]) - src.channel_name = sanitizeSafe(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""), MAX_LNAME_LEN) - src.updateUsrDialog() + channel_name = sanitizeSafe(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""), MAX_LNAME_LEN) + updateUsrDialog() else if(href_list["set_wanted_desc"]) - src.msg = sanitize(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", "")) - src.updateUsrDialog() + msg = sanitize(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", "")) + updateUsrDialog() else if(href_list["submit_wanted"]) var/input_param = text2num(href_list["submit_wanted"]) - if(src.msg == "" || src.channel_name == "" || src.scanned_user == "Unknown") - src.screen = 16 + if(msg == "" || channel_name == "" || scanned_user == "Unknown") + screen = 16 else var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel") if(choice=="Confirm") if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below var/datum/feed_message/WANTED = new /datum/feed_message - WANTED.author = src.channel_name - WANTED.body = src.msg - WANTED.backup_author = src.scanned_user //I know, a bit wacky + WANTED.author = channel_name + WANTED.body = msg + WANTED.backup_author = scanned_user //I know, a bit wacky if(photo_data) WANTED.img = photo_data.photo.img news_network.wanted_issue = WANTED news_network.alert_readers() - src.screen = 15 + screen = 15 else if(news_network.wanted_issue.is_admin_message) alert("The wanted issue has been distributed by a [company_name] higherup. You cannot edit it.","Ok") return - news_network.wanted_issue.author = src.channel_name - news_network.wanted_issue.body = src.msg - news_network.wanted_issue.backup_author = src.scanned_user + news_network.wanted_issue.author = channel_name + news_network.wanted_issue.body = msg + news_network.wanted_issue.backup_author = scanned_user if(photo_data) news_network.wanted_issue.img = photo_data.photo.img - src.screen = 19 + screen = 19 - src.updateUsrDialog() + updateUsrDialog() else if(href_list["cancel_wanted"]) if(news_network.wanted_issue.is_admin_message) @@ -653,12 +650,12 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co news_network.wanted_issue = null for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) NEWSCASTER.update_icon() - src.screen=17 - src.updateUsrDialog() + screen=17 + updateUsrDialog() else if(href_list["view_wanted"]) - src.screen=18 - src.updateUsrDialog() + screen=18 + updateUsrDialog() else if(href_list["censor_channel_author"]) var/datum/feed_channel/FC = locate(href_list["censor_channel_author"]) if(FC.is_admin_channel) @@ -670,7 +667,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else FC.author = FC.backup_author FC.update() - src.updateUsrDialog() + updateUsrDialog() else if(href_list["censor_channel_story_author"]) var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"]) @@ -683,7 +680,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else MSG.author = MSG.backup_author MSG.parent_channel.update() - src.updateUsrDialog() + updateUsrDialog() else if(href_list["censor_channel_story_body"]) var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"]) @@ -703,13 +700,13 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co MSG.img = MSG.backup_img MSG.parent_channel.update() - src.updateUsrDialog() + updateUsrDialog() else if(href_list["pick_d_notice"]) var/datum/feed_channel/FC = locate(href_list["pick_d_notice"]) - src.viewing_channel = FC - src.screen=13 - src.updateUsrDialog() + viewing_channel = FC + screen=13 + updateUsrDialog() else if(href_list["toggle_d_notice"]) var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"]) @@ -718,70 +715,46 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co return FC.censored = !FC.censored FC.update() - src.updateUsrDialog() + updateUsrDialog() else if(href_list["view"]) - src.screen=1 - src.updateUsrDialog() + screen=1 + updateUsrDialog() else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~ - src.screen = text2num(href_list["setScreen"]) - if (src.screen == 0) - src.scanned_user = "Unknown"; + screen = text2num(href_list["setScreen"]) + if(screen == 0) + scanned_user = "Unknown"; msg = ""; - src.c_locked=0; + c_locked=0; channel_name=""; - src.viewing_channel = null - src.updateUsrDialog() + viewing_channel = null + updateUsrDialog() else if(href_list["show_channel"]) var/datum/feed_channel/FC = locate(href_list["show_channel"]) - src.viewing_channel = FC - src.screen = 9 - src.updateUsrDialog() + viewing_channel = FC + screen = 9 + updateUsrDialog() else if(href_list["pick_censor_channel"]) var/datum/feed_channel/FC = locate(href_list["pick_censor_channel"]) - src.viewing_channel = FC - src.screen = 12 - src.updateUsrDialog() + viewing_channel = FC + screen = 12 + updateUsrDialog() else if(href_list["refresh"]) - src.updateUsrDialog() - - + updateUsrDialog() /obj/machinery/newscaster/attackby(I as obj, user as mob) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "newscaster" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - if (src.stat & isbroken == 1) - user << "The broken glass falls out." - new /obj/item/weapon/material/shard( src.loc ) - A.state = 3 - A.icon_state = "newscaster_3" - else - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "newscaster_4" - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return else - src.attack_hand(user) + attack_hand(user) return /obj/machinery/newscaster/attack_ai(mob/user as mob) - return src.attack_hand(user) //or maybe it'll have some special functions? No idea. + return attack_hand(user) //or maybe it'll have some special functions? No idea. /datum/news_photo var/is_synth = 0 @@ -807,12 +780,11 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co else if(istype(user,/mob/living/silicon)) var/mob/living/silicon/tempAI = user var/obj/item/weapon/photo/selection = tempAI.GetPicture() - if (!selection) + if(!selection) return photo_data = new(selection, 1) - //######################################################################################################################## //###################################### NEWSPAPER! ###################################################################### //######################################################################################################################## @@ -836,34 +808,34 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob) if(ishuman(user)) var/mob/living/carbon/human/human_user = user var/dat - src.pages = 0 + pages = 0 switch(screen) if(0) //Cover dat+="
                The Griffon
                " dat+="
                [company_name]-standard newspaper, for use on [company_name]© Space Facilities

                " - if(isemptylist(src.news_content)) - if(src.important_message) - dat+="Contents:
                  **Important Security Announcement** \[page [src.pages+2]\]
                " + if(isemptylist(news_content)) + if(important_message) + dat+="Contents:
                  **Important Security Announcement** \[page [pages+2]\]
                " else dat+="Other than the title, the rest of the newspaper is unprinted..." else dat+="Contents:
                  " - for(var/datum/feed_channel/NP in src.news_content) - src.pages++ - if(src.important_message) - dat+="**Important Security Announcement** \[page [src.pages+2]\]
                  " + for(var/datum/feed_channel/NP in news_content) + pages++ + if(important_message) + dat+="**Important Security Announcement** \[page [pages+2]\]
                  " var/temp_page=0 - for(var/datum/feed_channel/NP in src.news_content) + for(var/datum/feed_channel/NP in news_content) temp_page++ dat+="[NP.channel_name] \[page [temp_page+1]\]
                  " dat+="
                " if(scribble_page==curr_page) - dat+="
                There is a small scribble near the end of this page... It reads: \"[src.scribble]\"" + dat+="
                There is a small scribble near the end of this page... It reads: \"[scribble]\"" dat+= "
                " if(1) // X channel pages inbetween. - for(var/datum/feed_channel/NP in src.news_content) - src.pages++ //Let's get it right again. - var/datum/feed_channel/C = src.news_content[src.curr_page] + for(var/datum/feed_channel/NP in news_content) + pages++ //Let's get it right again. + var/datum/feed_channel/C = news_content[curr_page] dat+="[C.channel_name] \[created by: [C.author]\]

                " if(C.censored) dat+="This channel was deemed dangerous to the general welfare of the station and therefore marked with a D-Notice. Its contents were not transferred to the newspaper at the time of printing." @@ -882,12 +854,12 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob) dat+="\[[MESSAGE.message_type] by [MESSAGE.author]\]

                " dat+="
              " if(scribble_page==curr_page) - dat+="
              There is a small scribble near the end of this page... It reads: \"[src.scribble]\"" + dat+="
              There is a small scribble near the end of this page... It reads: \"[scribble]\"" dat+= "

              " if(2) //Last page - for(var/datum/feed_channel/NP in src.news_content) - src.pages++ - if(src.important_message!=null) + for(var/datum/feed_channel/NP in news_content) + pages++ + if(important_message!=null) dat+="
              Wanted Issue:


              " dat+="Criminal name: [important_message.author]
              " dat+="Description: [important_message.body]
              " @@ -900,91 +872,86 @@ obj/item/weapon/newspaper/attack_self(mob/user as mob) else dat+="Apart from some uninteresting Classified ads, there's nothing on this page..." if(scribble_page==curr_page) - dat+="
              There is a small scribble near the end of this page... It reads: \"[src.scribble]\"" + dat+="
              There is a small scribble near the end of this page... It reads: \"[scribble]\"" dat+= "
              " else dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" - dat+="

              [src.curr_page+1]
              " + dat+="

              [curr_page+1]
              " human_user << browse(dat, "window=newspaper_main;size=300x400") onclose(human_user, "newspaper_main") else user << "The paper is full of intelligible symbols!" - obj/item/weapon/newspaper/Topic(href, href_list) var/mob/living/U = usr ..() - if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) )) + if((src in U.contents) || (istype(loc, /turf) && in_range(src, U))) U.set_machine(src) if(href_list["next_page"]) - if(curr_page==src.pages+1) + if(curr_page == pages+1) return //Don't need that at all, but anyway. - if(src.curr_page == src.pages) //We're at the middle, get to the end - src.screen = 2 + if(curr_page == pages) //We're at the middle, get to the end + screen = 2 else if(curr_page == 0) //We're at the start, get to the middle - src.screen=1 - src.curr_page++ - playsound(src.loc, "pageturn", 50, 1) + screen = 1 + curr_page++ + playsound(loc, "pageturn", 50, 1) else if(href_list["prev_page"]) if(curr_page == 0) return if(curr_page == 1) - src.screen = 0 + screen = 0 else - if(curr_page == src.pages+1) //we're at the end, let's go back to the middle. - src.screen = 1 - src.curr_page-- + if(curr_page == pages+1) //we're at the end, let's go back to the middle. + screen = 1 + curr_page-- playsound(src.loc, "pageturn", 50, 1) - if (istype(src.loc, /mob)) - src.attack_self(src.loc) - + if(istype(src.loc, /mob)) + attack_self(src.loc) obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/pen)) - if(src.scribble_page == src.curr_page) + if(scribble_page == curr_page) user << "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?" else var/s = sanitize(input(user, "Write something", "Newspaper", "")) s = sanitize(s) - if (!s) + if(!s) return - if (!in_range(src, usr) && src.loc != usr) + if(!in_range(src, usr) && src.loc != usr) return - src.scribble_page = src.curr_page - src.scribble = s - src.attack_self(user) + scribble_page = curr_page + scribble = s + attack_self(user) return - ////////////////////////////////////helper procs - /obj/machinery/newscaster/proc/scan_user(mob/living/user as mob) if(istype(user,/mob/living/carbon/human)) //User is a human var/mob/living/carbon/human/human_user = user if(human_user.wear_id) //Newscaster scans you - if(istype(human_user.wear_id, /obj/item/device/pda) ) //autorecognition, woo! + if(istype(human_user.wear_id, /obj/item/device/pda)) //autorecognition, woo! var/obj/item/device/pda/P = human_user.wear_id if(P.id) - src.scanned_user = GetNameAndAssignmentFromId(P.id) + scanned_user = GetNameAndAssignmentFromId(P.id) else - src.scanned_user = "Unknown" - else if(istype(human_user.wear_id, /obj/item/weapon/card/id) ) + scanned_user = "Unknown" + else if(istype(human_user.wear_id, /obj/item/weapon/card/id)) var/obj/item/weapon/card/id/ID = human_user.wear_id - src.scanned_user = GetNameAndAssignmentFromId(ID) + scanned_user = GetNameAndAssignmentFromId(ID) else - src.scanned_user ="Unknown" + scanned_user ="Unknown" else - src.scanned_user ="Unknown" + scanned_user ="Unknown" else var/mob/living/silicon/ai_user = user - src.scanned_user = "[ai_user.name] ([ai_user.job])" - + scanned_user = "[ai_user.name] ([ai_user.job])" /obj/machinery/newscaster/proc/print_paper() feedback_inc("newscaster_newspapers_printed",1) @@ -994,7 +961,7 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) if(news_network.wanted_issue) NEWSPAPER.important_message = news_network.wanted_issue NEWSPAPER.loc = get_turf(src) - src.paper_remaining-- + paper_remaining-- return /obj/machinery/newscaster/proc/newsAlert(var/news_call) @@ -1003,15 +970,15 @@ obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) var/turf/T = get_turf(src) if(news_call) for(var/mob/O in hearers(world.view-1, T)) - O.show_message("[src.name] beeps, \"[news_call]\"",2) - src.alert = 1 - src.update_icon() + O.show_message("[name] beeps, \"[news_call]\"",2) + alert = 1 + update_icon() spawn(300) - src.alert = 0 - src.update_icon() + alert = 0 + update_icon() playsound(src.loc, 'sound/machines/twobeep.ogg', 75, 1) else for(var/mob/O in hearers(world.view-1, T)) - O.show_message("[src.name] beeps, \"Attention! Wanted issue distributed!\"",2) + O.show_message("[name] beeps, \"Attention! Wanted issue distributed!\"",2) playsound(src.loc, 'sound/machines/warning-buzzer.ogg', 75, 1) return diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index d02d3522a4a..74b39840d0b 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -25,83 +25,79 @@ var/bomb_set // 3 is sealant open, 4 is unwrenched, 5 is removed from bolts. use_power = 0 - - /obj/machinery/nuclearbomb/New() ..() r_code = "[rand(10000, 99999.0)]"//Creates a random code upon object spawn. - - src.wires["Red"] = 0 - src.wires["Blue"] = 0 - src.wires["Green"] = 0 - src.wires["Marigold"] = 0 - src.wires["Fuschia"] = 0 - src.wires["Black"] = 0 - src.wires["Pearl"] = 0 + wires["Red"] = 0 + wires["Blue"] = 0 + wires["Green"] = 0 + wires["Marigold"] = 0 + wires["Fuschia"] = 0 + wires["Black"] = 0 + wires["Pearl"] = 0 var/list/w = list("Red","Blue","Green","Marigold","Black","Fuschia","Pearl") - src.light_wire = pick(w) - w -= src.light_wire - src.timing_wire = pick(w) - w -= src.timing_wire - src.safety_wire = pick(w) - w -= src.safety_wire + light_wire = pick(w) + w -= light_wire + timing_wire = pick(w) + w -= timing_wire + safety_wire = pick(w) + w -= safety_wire /obj/machinery/nuclearbomb/process() - if (src.timing) + if(timing) bomb_set = 1 //So long as there is one nuke timing, it means one nuke is armed. - src.timeleft-- - if (src.timeleft <= 0) + timeleft-- + if(timeleft <= 0) explode() for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.attack_hand(M) + if((M.client && M.machine == src)) + attack_hand(M) return /obj/machinery/nuclearbomb/attackby(obj/item/weapon/O as obj, mob/user as mob) - - if (istype(O, /obj/item/weapon/screwdriver)) - src.add_fingerprint(user) - if (src.auth) - if (src.opened == 0) - src.opened = 1 + if(istype(O, /obj/item/weapon/screwdriver)) + add_fingerprint(user) + if(auth) + if(opened == 0) + opened = 1 overlays += image(icon, "npanel_open") user << "You unscrew the control panel of [src]." else - src.opened = 0 + opened = 0 overlays -= image(icon, "npanel_open") user << "You screw the control panel of [src] back on." else - if (src.opened == 0) + if(opened == 0) user << "The [src] emits a buzzing noise, the panel staying locked in." - if (src.opened == 1) - src.opened = 0 + if(opened == 1) + opened = 0 overlays -= image(icon, "npanel_open") user << "You screw the control panel of [src] back on." flick("nuclearbombc", src) return - if (istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/device/multitool)) - if (src.opened == 1) + if(istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/device/multitool)) + if(opened == 1) nukehack_win(user) return - if (src.extended) - if (istype(O, /obj/item/weapon/disk/nuclear)) + if(extended) + if(istype(O, /obj/item/weapon/disk/nuclear)) usr.drop_item() O.loc = src - src.auth = O - src.add_fingerprint(user) + auth = O + add_fingerprint(user) return - if (src.anchored) + if(anchored) switch(removal_stage) if(0) if(istype(O,/obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = O if(!WT.isOn()) return - if (WT.get_fuel() < 5) // uses up 5 fuel. + if(WT.get_fuel() < 5) // uses up 5 fuel. user << "You need more fuel to complete this task." return @@ -128,7 +124,7 @@ var/bomb_set var/obj/item/weapon/weldingtool/WT = O if(!WT.isOn()) return - if (WT.get_fuel() < 5) // uses up 5 fuel. + if(WT.get_fuel() < 5) // uses up 5 fuel. user << "You need more fuel to complete this task." return @@ -165,51 +161,51 @@ var/bomb_set ..() /obj/machinery/nuclearbomb/attack_hand(mob/user as mob) - if (src.extended) - if (!ishuman(user)) + if(extended) + if(!ishuman(user)) usr << "You don't have the dexterity to do this!" return 1 user.set_machine(src) - var/dat = text("Nuclear Fission Explosive
              \nAuth. Disk: []
              ", src, (src.auth ? "++++++++++" : "----------")) - if (src.auth) - if (src.yes_code) - dat += text("\nStatus: []-[]
              \nTimer: []
              \n
              \nTimer: [] Toggle
              \nTime: - - [] + +
              \n
              \nSafety: [] Toggle
              \nAnchor: [] Toggle
              \n", (src.timing ? "Func/Set" : "Functional"), (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src, src, src, src.timeleft, src, src, (src.safety ? "On" : "Off"), src, (src.anchored ? "Engaged" : "Off"), src) + var/dat = text("Nuclear Fission Explosive
              \nAuth. Disk: []
              ", src, (auth ? "++++++++++" : "----------")) + if(auth) + if(yes_code) + dat += text("\nStatus: []-[]
              \nTimer: []
              \n
              \nTimer: [] Toggle
              \nTime: - - [] + +
              \n
              \nSafety: [] Toggle
              \nAnchor: [] Toggle
              \n", (timing ? "Func/Set" : "Functional"), (safety ? "Safe" : "Engaged"), timeleft, (timing ? "On" : "Off"), src, src, src, timeleft, src, src, (safety ? "On" : "Off"), src, (anchored ? "Engaged" : "Off"), src) else - dat += text("\nStatus: Auth. S2-[]
              \nTimer: []
              \n
              \nTimer: [] Toggle
              \nTime: - - [] + +
              \n
              \n[] Safety: Toggle
              \nAnchor: [] Toggle
              \n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off")) + dat += text("\nStatus: Auth. S2-[]
              \nTimer: []
              \n
              \nTimer: [] Toggle
              \nTime: - - [] + +
              \n
              \n[] Safety: Toggle
              \nAnchor: [] Toggle
              \n", (safety ? "Safe" : "Engaged"), timeleft, (timing ? "On" : "Off"), timeleft, (safety ? "On" : "Off"), (anchored ? "Engaged" : "Off")) else - if (src.timing) - dat += text("\nStatus: Set-[]
              \nTimer: []
              \n
              \nTimer: [] Toggle
              \nTime: - - [] + +
              \n
              \nSafety: [] Toggle
              \nAnchor: [] Toggle
              \n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off")) + if(timing) + dat += text("\nStatus: Set-[]
              \nTimer: []
              \n
              \nTimer: [] Toggle
              \nTime: - - [] + +
              \n
              \nSafety: [] Toggle
              \nAnchor: [] Toggle
              \n", (safety ? "Safe" : "Engaged"), timeleft, (timing ? "On" : "Off"), timeleft, (safety ? "On" : "Off"), (anchored ? "Engaged" : "Off")) else - dat += text("\nStatus: Auth. S1-[]
              \nTimer: []
              \n
              \nTimer: [] Toggle
              \nTime: - - [] + +
              \n
              \nSafety: [] Toggle
              \nAnchor: [] Toggle
              \n", (src.safety ? "Safe" : "Engaged"), src.timeleft, (src.timing ? "On" : "Off"), src.timeleft, (src.safety ? "On" : "Off"), (src.anchored ? "Engaged" : "Off")) + dat += text("\nStatus: Auth. S1-[]
              \nTimer: []
              \n
              \nTimer: [] Toggle
              \nTime: - - [] + +
              \n
              \nSafety: [] Toggle
              \nAnchor: [] Toggle
              \n", (safety ? "Safe" : "Engaged"), timeleft, (timing ? "On" : "Off"), timeleft, (safety ? "On" : "Off"), (anchored ? "Engaged" : "Off")) var/message = "AUTH" - if (src.auth) - message = text("[]", src.code) - if (src.yes_code) + if(auth) + message = text("[]", code) + if(yes_code) message = "*****" dat += text("
              \n>[]
              \n1-2-3
              \n4-5-6
              \n7-8-9
              \nR-0-E
              \n
              ", message, src, src, src, src, src, src, src, src, src, src, src, src) user << browse(dat, "window=nuclearbomb;size=300x400") onclose(user, "nuclearbomb") - else if (src.deployable) + else if(deployable) if(removal_stage < 5) - src.anchored = 1 + anchored = 1 visible_message("With a steely snap, bolts slide out of [src] and anchor it to the flooring!") else visible_message("\The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") - if(!src.lighthack) + if(!lighthack) flick("nuclearbombc", src) - src.icon_state = "nuclearbomb1" - src.extended = 1 + icon_state = "nuclearbomb1" + extended = 1 return obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) var/dat as text dat += "Nuclear Fission Explosive
              \nNuclear Device Wires:
              " - for(var/wire in src.wires) - dat += text("[wire] Wire: [src.wires[wire] ? "Mend" : "Cut"] Pulse
              ") - dat += text("
              The device is [src.timing ? "shaking!" : "still"]
              ") - dat += text("The device is [src.safety ? "quiet" : "whirring"].
              ") - dat += text("The lights are [src.lighthack ? "static" : "functional"].
              ") + for(var/wire in wires) + dat += text("[wire] Wire: [wires[wire] ? "Mend" : "Cut"] Pulse
              ") + dat += text("
              The device is [timing ? "shaking!" : "still"]
              ") + dat += text("The device is [safety ? "quiet" : "whirring"].
              ") + dat += text("The lights are [lighthack ? "static" : "functional"].
              ") user << browse("Bomb Defusion[dat]","window=nukebomb_hack") onclose(user, "nukebomb_hack") @@ -218,141 +214,140 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) set name = "Make Deployable" set src in oview(1) - if (!usr.canmove || usr.stat || usr.restrained()) + if(!usr.canmove || usr.stat || usr.restrained()) return - if (!ishuman(usr)) + if(!ishuman(usr)) usr << "You don't have the dexterity to do this!" return 1 - if (src.deployable) + if(deployable) usr << "You close several panels to make [src] undeployable." - src.deployable = 0 + deployable = 0 else usr << "You adjust some panels to make [src] deployable." - src.deployable = 1 + deployable = 1 return - /obj/machinery/nuclearbomb/Topic(href, href_list) ..() - if (!usr.canmove || usr.stat || usr.restrained()) + if(!usr.canmove || usr.stat || usr.restrained()) return - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) + if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) usr.set_machine(src) if(href_list["act"]) var/temp_wire = href_list["wire"] if(href_list["act"] == "pulse") - if (!istype(usr.get_active_hand(), /obj/item/device/multitool)) + if(!istype(usr.get_active_hand(), /obj/item/device/multitool)) usr << "You need a multitool!" else - if(src.wires[temp_wire]) + if(wires[temp_wire]) usr << "You can't pulse a cut wire." else - if(src.light_wire == temp_wire) - src.lighthack = !src.lighthack - spawn(100) src.lighthack = !src.lighthack - if(src.timing_wire == temp_wire) - if(src.timing) + if(light_wire == temp_wire) + lighthack = !lighthack + spawn(100) lighthack = !lighthack + if(timing_wire == temp_wire) + if(timing) explode() - if(src.safety_wire == temp_wire) - src.safety = !src.safety - spawn(100) src.safety = !src.safety - if(src.safety == 1) + if(safety_wire == temp_wire) + safety = !safety + spawn(100) safety = !safety + if(safety == 1) visible_message("The [src] quiets down.") - if(!src.lighthack) - if (src.icon_state == "nuclearbomb2") - src.icon_state = "nuclearbomb1" + if(!lighthack) + if(icon_state == "nuclearbomb2") + icon_state = "nuclearbomb1" else visible_message("The [src] emits a quiet whirling noise!") if(href_list["act"] == "wire") - if (!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters)) + if(!istype(usr.get_active_hand(), /obj/item/weapon/wirecutters)) usr << "You need wirecutters!" else wires[temp_wire] = !wires[temp_wire] - if(src.safety_wire == temp_wire) - if(src.timing) + if(safety_wire == temp_wire) + if(timing) explode() - if(src.timing_wire == temp_wire) - if(!src.lighthack) - if (src.icon_state == "nuclearbomb2") - src.icon_state = "nuclearbomb1" - src.timing = 0 + if(timing_wire == temp_wire) + if(!lighthack) + if(icon_state == "nuclearbomb2") + icon_state = "nuclearbomb1" + timing = 0 bomb_set = 0 - if(src.light_wire == temp_wire) - src.lighthack = !src.lighthack + if(light_wire == temp_wire) + lighthack = !lighthack - if (href_list["auth"]) - if (src.auth) - src.auth.loc = src.loc - src.yes_code = 0 - src.auth = null + if(href_list["auth"]) + if(auth) + auth.loc = src.loc + yes_code = 0 + auth = null else var/obj/item/I = usr.get_active_hand() - if (istype(I, /obj/item/weapon/disk/nuclear)) + if(istype(I, /obj/item/weapon/disk/nuclear)) usr.drop_item() I.loc = src - src.auth = I - if (src.auth) - if (href_list["type"]) - if (href_list["type"] == "E") - if (src.code == src.r_code) - src.yes_code = 1 - src.code = null + auth = I + if(auth) + if(href_list["type"]) + if(href_list["type"] == "E") + if(code == r_code) + yes_code = 1 + code = null else - src.code = "ERROR" + code = "ERROR" else - if (href_list["type"] == "R") - src.yes_code = 0 - src.code = null + if(href_list["type"] == "R") + yes_code = 0 + code = null else - src.code += text("[]", href_list["type"]) - if (length(src.code) > 5) - src.code = "ERROR" - if (src.yes_code) - if (href_list["time"]) + code += text("[]", href_list["type"]) + if(length(code) > 5) + code = "ERROR" + if(yes_code) + if(href_list["time"]) var/time = text2num(href_list["time"]) - src.timeleft += time - src.timeleft = min(max(round(src.timeleft), 60), 600) - if (href_list["timer"]) - if (src.timing == -1.0) + timeleft += time + timeleft = min(max(round(timeleft), 60), 600) + if(href_list["timer"]) + if(timing == -1.0) return - if (src.safety) + if(safety) usr << "The safety is still on." return - src.timing = !( src.timing ) - if (src.timing) - if(!src.lighthack) - src.icon_state = "nuclearbomb2" - if(!src.safety) + timing = !(timing) + if(timing) + if(!lighthack) + icon_state = "nuclearbomb2" + if(!safety) bomb_set = 1//There can still be issues with this reseting when there are multiple bombs. Not a big deal tho for Nuke/N else bomb_set = 0 else bomb_set = 0 - if(!src.lighthack) - src.icon_state = "nuclearbomb1" - if (href_list["safety"]) - src.safety = !( src.safety ) + if(!lighthack) + icon_state = "nuclearbomb1" + if(href_list["safety"]) + safety = !(safety) if(safety) - src.timing = 0 + timing = 0 bomb_set = 0 - if (href_list["anchor"]) + if(href_list["anchor"]) if(removal_stage == 5) - src.anchored = 0 + anchored = 0 visible_message("\The [src] makes a highly unpleasant crunching noise. It looks like the anchoring bolts have been cut.") return - src.anchored = !( src.anchored ) - if(src.anchored) + anchored = !(anchored) + if(anchored) visible_message("With a steely snap, bolts slide out of [src] and anchor it to the flooring.") else visible_message("The anchoring bolts slide back into the depths of [src].") - src.add_fingerprint(usr) + add_fingerprint(usr) for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - src.attack_hand(M) + if((M.client && M.machine == src)) + attack_hand(M) else usr << browse(null, "window=nuclearbomb") return @@ -365,23 +360,23 @@ obj/machinery/nuclearbomb/proc/nukehack_win(mob/user as mob) #define NUKERANGE 80 /obj/machinery/nuclearbomb/proc/explode() - if (src.safety) - src.timing = 0 + if(safety) + timing = 0 return - src.timing = -1.0 - src.yes_code = 0 - src.safety = 1 - if(!src.lighthack) - src.icon_state = "nuclearbomb3" + timing = -1.0 + yes_code = 0 + safety = 1 + if(!lighthack) + icon_state = "nuclearbomb3" playsound(src,'sound/machines/Alarm.ogg',100,0,5) - if (ticker && ticker.mode) + if(ticker && ticker.mode) ticker.mode.explosion_in_progress = 1 sleep(100) var/off_station = 0 var/turf/bomb_location = get_turf(src) if(bomb_location && (bomb_location.z in config.station_levels)) - if( (bomb_location.x < (128-NUKERANGE)) || (bomb_location.x > (128+NUKERANGE)) || (bomb_location.y < (128-NUKERANGE)) || (bomb_location.y > (128+NUKERANGE)) ) + if((bomb_location.x < (128-NUKERANGE)) || (bomb_location.x > (128+NUKERANGE)) || (bomb_location.y < (128-NUKERANGE)) || (bomb_location.y > (128+NUKERANGE))) off_station = 1 else off_station = 2 diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index 2b3679dda51..48bd028c09f 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -1,27 +1,23 @@ //#define AMAP - /obj/machinery/computer/security/verb/station_map() set name = ".map" set category = "Object" set src in view(1) usr.set_machine(src) if(!mapping) return - log_game("[usr]([usr.key]) used station map L[z] in [src.loc.loc]") - - src.drawmap(usr) + drawmap(usr) /obj/machinery/computer/security/proc/drawmap(var/mob/user as mob) var/icx = round(world.maxx/16) + 1 var/icy = round(world.maxy/16) + 1 - var/xoff = round( (icx*16-world.maxx)-2) - var/yoff = round( (icy*16-world.maxy)-2) + var/xoff = round((icx*16-world.maxx)-2) + var/yoff = round((icy*16-world.maxy)-2) var/icount = icx * icy - var/list/imap = list() #ifdef AMAP @@ -32,7 +28,6 @@ //world << "[icount] images in list" - for(var/wx = 1 ; wx <= world.maxx; wx++) for(var/wy = 1; wy <= world.maxy; wy++) @@ -42,8 +37,6 @@ var/colour var/colour2 - - if(!T) colour = rgb(0,0,0) @@ -79,9 +72,6 @@ else colour = rgb(0,40,0) - - - if(sense) for(var/atom/AM in T.contents) @@ -127,10 +117,8 @@ var/turf_total = environment.total_moles() //var/turf_total = T.co2 + T.oxygen + T.poison + T.sl_gas + T.n2 - var/t1 = turf_total / MOLES_CELLSTANDARD * 150 - if(t1<=100) colour2 = rgb(t1*2.55,0,0) else @@ -150,19 +138,16 @@ var/icon/I = imap[1+(ix + icx*iy)*2] var/icon/I2 = imap[2+(ix + icx*iy)*2] - //world << "icon: \icon[I]" I.DrawBox(colour, rx, ry, rx+1, ry+1) I2.DrawBox(colour2, rx, ry, rx+1, ry+1) - user.clearmap() user.mapobjs = list() - for(var/i=0; iCannot secure turrets in space!" return - user.visible_message( \ + user.visible_message(\ "[user] begins [anchored ? "un" : ""]securing the turret.", \ "You begin [anchored ? "un" : ""]securing the turret." \ ) @@ -386,7 +385,7 @@ var/list/turret_icons return health -= force - if (force > 5 && prob(45)) + if(force > 5 && prob(45)) spark_system.start() if(health <= 0) die() //the death process :( @@ -434,14 +433,14 @@ var/list/turret_icons /obj/machinery/porta_turret/ex_act(severity) switch (severity) - if (1) + if(1) qdel(src) - if (2) - if (prob(25)) + if(2) + if(prob(25)) qdel(src) else take_damage(initial(health) * 8) //should instakill most turrets - if (3) + if(3) take_damage(initial(health) * 8 / 3) /obj/machinery/porta_turret/proc/die() //called when the turret dies, ie, health <= 0 @@ -599,9 +598,9 @@ var/list/turret_icons update_icon() timeout = 10 -/obj/machinery/porta_turret/proc/set_raised_raising(var/raised, var/raising) - src.raised = raised - src.raising = raising +/obj/machinery/porta_turret/proc/set_raised_raising(var/incoming_raised, var/incoming_raising) + raised = incoming_raised + raising = incoming_raising density = raised || raising /obj/machinery/porta_turret/proc/target(var/mob/living/target) @@ -677,9 +676,9 @@ var/list/turret_icons /obj/machinery/porta_turret/proc/setState(var/datum/turret_checks/TC) if(controllock) return - src.enabled = TC.enabled - src.lethal = TC.lethal - src.iconholder = TC.lethal + enabled = TC.enabled + lethal = TC.lethal + iconholder = TC.lethal check_synth = TC.check_synth check_access = TC.check_access @@ -689,7 +688,7 @@ var/list/turret_icons check_anomalies = TC.check_anomalies ailock = TC.ailock - src.power_change() + power_change() /* Portable turret constructions @@ -707,7 +706,6 @@ var/list/turret_icons var/installation = null //the gun type installed var/gun_charge = 0 //the gun charge of the gun type installed - /obj/machinery/porta_turret_construct/attackby(obj/item/I, mob/user) //this is a bit unwieldy but self-explanatory switch(build_step) @@ -722,7 +720,7 @@ var/list/turret_icons else if(istype(I, /obj/item/weapon/crowbar) && !anchored) playsound(loc, 'sound/items/Crowbar.ogg', 75, 1) user << "You dismantle the turret construction." - new /obj/item/stack/material/steel( loc, 5) + new /obj/item/stack/material/steel(loc, 5) qdel(src) return @@ -744,7 +742,6 @@ var/list/turret_icons build_step = 0 return - if(2) if(istype(I, /obj/item/weapon/wrench)) playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) @@ -765,10 +762,9 @@ var/list/turret_icons if(!src || !WT.remove_fuel(5, user)) return build_step = 1 user << "You remove the turret's interior metal armor." - new /obj/item/stack/material/steel( loc, 2) + new /obj/item/stack/material/steel(loc, 2) return - if(3) if(istype(I, /obj/item/weapon/gun/energy)) //the gun installation part @@ -873,7 +869,6 @@ var/list/turret_icons ..() - /obj/machinery/porta_turret_construct/attack_hand(mob/user) switch(build_step) if(4) @@ -899,7 +894,6 @@ var/list/turret_icons /atom/movable/porta_turret_cover icon = 'icons/obj/turrets.dmi' - #undef TURRET_PRIORITY_TARGET #undef TURRET_SECONDARY_TARGET -#undef TURRET_NOT_TARGET +#undef TURRET_NOT_TARGET \ No newline at end of file diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 55c2e10eaa1..5d3270231f4 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -1,5 +1,4 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - obj/machinery/recharger name = "recharger" icon = 'icons/obj/stationobjs.dmi' @@ -16,8 +15,7 @@ obj/machinery/recharger var/portable = 1 circuit = /obj/item/weapon/circuitboard/recharger -obj/machinery/recharger/New() - circuit = new circuit(src) +/obj/machinery/recharger/New() component_parts = list() component_parts += new /obj/item/weapon/stock_parts/capacitor(src) component_parts += new /obj/item/stack/cable_coil(src, 5) @@ -25,13 +23,13 @@ obj/machinery/recharger/New() ..() return -obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) +/obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) if(istype(user,/mob/living/silicon)) return var/allowed = 0 for (var/allowed_type in allowed_devices) - if (istype(G, allowed_type)) allowed = 1 + if(istype(G, allowed_type)) allowed = 1 if(allowed) if(charging) @@ -41,10 +39,10 @@ obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) if(!powered()) user << "The [name] blinks red as you try to insert the item!" return - if (istype(G, /obj/item/weapon/gun/energy/gun/nuclear) || istype(G, /obj/item/weapon/gun/energy/crossbow)) + if(istype(G, /obj/item/weapon/gun/energy/gun/nuclear) || istype(G, /obj/item/weapon/gun/energy/crossbow)) user << "Your gun's recharge port was removed to make room for a miniaturized reactor." return - if (istype(G, /obj/item/weapon/gun/energy/staff)) + if(istype(G, /obj/item/weapon/gun/energy/staff)) return if(istype(G, /obj/item/device/laptop)) var/obj/item/device/laptop/L = G @@ -67,7 +65,7 @@ obj/machinery/recharger/attackby(obj/item/weapon/G as obj, mob/user as mob) else if(default_deconstruction_crowbar(user, G)) return -obj/machinery/recharger/attack_hand(mob/user as mob) +/obj/machinery/recharger/attack_hand(mob/user as mob) if(istype(user,/mob/living/silicon)) return @@ -79,7 +77,7 @@ obj/machinery/recharger/attack_hand(mob/user as mob) charging = null update_icon() -obj/machinery/recharger/process() +/obj/machinery/recharger/process() if(stat & (NOPOWER|BROKEN) || !anchored) update_use_power(0) icon_state = icon_state_idle @@ -137,7 +135,7 @@ obj/machinery/recharger/process() update_use_power(1) return -obj/machinery/recharger/emp_act(severity) +/obj/machinery/recharger/emp_act(severity) if(stat & (NOPOWER|BROKEN) || !anchored) ..(severity) return @@ -153,14 +151,14 @@ obj/machinery/recharger/emp_act(severity) B.bcell.charge = 0 ..(severity) -obj/machinery/recharger/update_icon() //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier. +/obj/machinery/recharger/update_icon() //we have an update_icon() in addition to the stuff in process to make it feel a tiny bit snappier. if(charging) icon_state = icon_state_charging else icon_state = icon_state_idle -obj/machinery/recharger/wallcharger +/obj/machinery/recharger/wallcharger name = "wall recharger" icon = 'icons/obj/stationobjs.dmi' icon_state = "wrecharger0" @@ -170,5 +168,4 @@ obj/machinery/recharger/wallcharger icon_state_charging = "wrecharger1" icon_state_idle = "wrecharger0" portable = 0 - circuit = /obj/item/weapon/circuitboard/recharger/wrecharger - frame_type = "wrecharger" + circuit = /obj/item/weapon/circuitboard/recharger/wrecharger \ No newline at end of file diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index b5f7e029a54..96ab5eab20e 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -24,7 +24,6 @@ /obj/machinery/recharge_station/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -32,7 +31,6 @@ component_parts += new /obj/item/weapon/stock_parts/capacitor(src) component_parts += new /obj/item/weapon/cell/high(src) component_parts += new /obj/item/stack/cable_coil(src, 5) - RefreshParts() update_icon() @@ -80,9 +78,9 @@ if(!has_cell_power()) return 0 - if(src.use_power == 1) + if(use_power == 1) cell.use(idle_power_usage * CELLRATE) - else if(src.use_power >= 2) + else if(use_power >= 2) cell.use(active_power_usage * CELLRATE) return 1 @@ -266,7 +264,7 @@ if(!occupant) return - occupant.forceMove(loc) + occupant.forceMove(src.loc) occupant.reset_view() occupant = null update_icon() diff --git a/code/game/machinery/records_scanner.dm b/code/game/machinery/records_scanner.dm index 54faef41f8e..f9ed05c7e9f 100644 --- a/code/game/machinery/records_scanner.dm +++ b/code/game/machinery/records_scanner.dm @@ -78,7 +78,7 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) print.stamped = 1 for(var/datum/data/record/test in data_core.general) - if (test.fields["name"] == mname) + if(test.fields["name"] == mname) return var/datum/data/record/G = new() @@ -136,6 +136,4 @@ obj/machinery/scanner/attack_hand(mob/living/carbon/human/user) data_core.general += G data_core.medical += M data_core.security += S - data_core.locked += L - - + data_core.locked += L \ No newline at end of file diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index fc39af88f7a..2854d0ac254 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -74,11 +74,11 @@ var/list/obj/machinery/requests_console/allConsoles = list() name = "[department] Requests Console" allConsoles += src - if (departmentType & RC_ASSIST) + if(departmentType & RC_ASSIST) req_console_assistance |= department - if (departmentType & RC_SUPPLY) + if(departmentType & RC_SUPPLY) req_console_supplies |= department - if (departmentType & RC_INFO) + if(departmentType & RC_INFO) req_console_information |= department set_light(1) @@ -87,15 +87,15 @@ var/list/obj/machinery/requests_console/allConsoles = list() allConsoles -= src var/lastDeptRC = 1 for (var/obj/machinery/requests_console/Console in allConsoles) - if (Console.department == department) + if(Console.department == department) lastDeptRC = 0 break if(lastDeptRC) - if (departmentType & RC_ASSIST) + if(departmentType & RC_ASSIST) req_console_assistance -= department - if (departmentType & RC_SUPPLY) + if(departmentType & RC_SUPPLY) req_console_supplies -= department - if (departmentType & RC_INFO) + if(departmentType & RC_INFO) req_console_information -= department ..() @@ -126,7 +126,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() data["announceAuth"] = announceAuth ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) + if(!ui) ui = new(user, src, ui_key, "request_console.tmpl", "[department] Request Console", 520, 410) ui.set_initial_data(data) ui.open() @@ -162,7 +162,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() announcement.Announce(message, msg_sanitized = 1) reset_message(1) - if( href_list["department"] && message ) + if(href_list["department"] && message) var/log_msg = message var/pass = 0 screen = RCS_SENTFAIL @@ -183,7 +183,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() return if(tempScreen == RCS_VIEWMSGS) for (var/obj/machinery/requests_console/Console in allConsoles) - if (Console.department == department) + if(Console.department == department) Console.newmessagepriority = 0 Console.icon_state = "req_comp0" Console.set_light(1) @@ -200,9 +200,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() //err... hacking code, which has no reason for existing... but anyway... it was once supposed to unlock priority 3 messanging on that console (EXTREME priority...), but the code for that was removed. /obj/machinery/requests_console/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob) - if(default_deconstruction_screwdriver(user, O)) - return - if(default_deconstruction_crowbar(user, O)) + if(computer_deconstruction_screwdriver(user, O)) return if(istype(O, /obj/item/device/multitool)) if(panel_open) @@ -216,15 +214,15 @@ var/list/obj/machinery/requests_console/allConsoles = list() name = "[department] Requests Console" allConsoles += src - if (departmentType & RC_ASSIST) + if(departmentType & RC_ASSIST) req_console_assistance |= department - if (departmentType & RC_SUPPLY) + if(departmentType & RC_SUPPLY) req_console_supplies |= department - if (departmentType & RC_INFO) + if(departmentType & RC_INFO) req_console_information |= department return - if (istype(O, /obj/item/weapon/card/id)) + if(istype(O, /obj/item/weapon/card/id)) if(inoperable(MAINT)) return if(screen == RCS_MESSAUTH) var/obj/item/weapon/card/id/T = O @@ -232,14 +230,14 @@ var/list/obj/machinery/requests_console/allConsoles = list() updateUsrDialog() if(screen == RCS_ANNOUNCE) var/obj/item/weapon/card/id/ID = O - if (access_RC_announce in ID.GetAccess()) + if(access_RC_announce in ID.GetAccess()) announceAuth = 1 announcement.announcer = ID.assignment ? "[ID.assignment] [ID.registered_name]" : ID.registered_name else reset_message() user << "You are not authorized to send announcements." updateUsrDialog() - if (istype(O, /obj/item/weapon/stamp)) + if(istype(O, /obj/item/weapon/stamp)) if(inoperable(MAINT)) return if(screen == RCS_MESSAUTH) var/obj/item/weapon/stamp/T = O diff --git a/code/game/machinery/robot_fabricator.dm b/code/game/machinery/robot_fabricator.dm index 4c44bcd4eeb..59f364d9483 100644 --- a/code/game/machinery/robot_fabricator.dm +++ b/code/game/machinery/robot_fabricator.dm @@ -12,40 +12,40 @@ active_power_usage = 10000 /obj/machinery/robotic_fabricator/attackby(var/obj/item/O as obj, var/mob/user as mob) - if (istype(O, /obj/item/stack/material) && O.get_material_name() == DEFAULT_WALL_MATERIAL) + if(istype(O, /obj/item/stack/material) && O.get_material_name() == DEFAULT_WALL_MATERIAL) var/obj/item/stack/M = O - if (src.metal_amount < 150000.0) + if(metal_amount < 150000.0) var/count = 0 - src.overlays += "fab-load-metal" + overlays += "fab-load-metal" spawn(15) if(M) if(!M.get_amount()) return while(metal_amount < 150000 && M.amount) - src.metal_amount += O.matter[DEFAULT_WALL_MATERIAL] /*O:height * O:width * O:length * 100000.0*/ + metal_amount += O.matter[DEFAULT_WALL_MATERIAL] /*O:height * O:width * O:length * 100000.0*/ M.use(1) count++ user << "You insert [count] metal sheet\s into the fabricator." - src.overlays -= "fab-load-metal" + overlays -= "fab-load-metal" updateDialog() else user << "The robot part maker is full. Please remove metal from the robot part maker in order to insert more." /obj/machinery/robotic_fabricator/attack_hand(user as mob) var/dat - if (..()) + if(..()) return - if (src.operating) + if(operating) dat = {" -Building [src.being_built.name].
              +Building [being_built.name].
              Please wait until completion...


              "} else dat = {" -Metal Amount: [min(150000, src.metal_amount)] cm3 (MAX: 150,000)

              +Metal Amount: [min(150000, metal_amount)] cm3 (MAX: 150,000)


              Left Arm (25,000 cc metal.)
              Right Arm (25,000 cc metal.)
              @@ -61,14 +61,14 @@ Please wait until completion...

              return /obj/machinery/robotic_fabricator/Topic(href, href_list) - if (..()) + if(..()) return usr.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) - if (href_list["make"]) - if (!src.operating) + if(href_list["make"]) + if(!operating) var/part_type = text2num(href_list["make"]) var/build_type = "" @@ -76,63 +76,63 @@ Please wait until completion...

              var/build_cost = 25000 switch (part_type) - if (1) + if(1) build_type = "/obj/item/robot_parts/l_arm" build_time = 200 build_cost = 25000 - if (2) + if(2) build_type = "/obj/item/robot_parts/r_arm" build_time = 200 build_cost = 25000 - if (3) + if(3) build_type = "/obj/item/robot_parts/l_leg" build_time = 200 build_cost = 25000 - if (4) + if(4) build_type = "/obj/item/robot_parts/r_leg" build_time = 200 build_cost = 25000 - if (5) + if(5) build_type = "/obj/item/robot_parts/chest" build_time = 350 build_cost = 50000 - if (6) + if(6) build_type = "/obj/item/robot_parts/head" build_time = 350 build_cost = 50000 - if (7) + if(7) build_type = "/obj/item/robot_parts/robot_suit" build_time = 600 build_cost = 75000 var/building = text2path(build_type) - if (!isnull(building)) - if (src.metal_amount >= build_cost) - src.operating = 1 - src.update_use_power(2) + if(!isnull(building)) + if(metal_amount >= build_cost) + operating = 1 + update_use_power(2) - src.metal_amount = max(0, src.metal_amount - build_cost) + metal_amount = max(0, metal_amount - build_cost) - src.being_built = new building(src) + being_built = new building(src) - src.overlays += "fab-active" - src.updateUsrDialog() + overlays += "fab-active" + updateUsrDialog() spawn (build_time) - if (!isnull(src.being_built)) - src.being_built.loc = get_turf(src) - src.being_built = null - src.update_use_power(1) - src.operating = 0 - src.overlays -= "fab-active" + if(!isnull(being_built)) + being_built.loc = get_turf(src) + being_built = null + update_use_power(1) + operating = 0 + overlays -= "fab-active" return for (var/mob/M in viewers(1, src)) - if (M.client && M.machine == src) - src.attack_hand(M) + if(M.client && M.machine == src) + attack_hand(M) \ No newline at end of file diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index e9a2081fb2d..c7d6b7c514b 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -36,7 +36,7 @@ obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob //Grass. else if(istype(O, /obj/item/stack/tile/grass)) var/obj/item/stack/tile/grass/S = O - if (S.use(1)) + if(S.use(1)) user << "You extract some seeds from the grass tile." new /obj/item/seeds/grassseed(loc) diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 36c8c628143..d60d49b47e9 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -11,11 +11,10 @@ var/set_temperature = T0C + 20 //K var/heating_power = 40000 - /obj/machinery/space_heater/New() ..() - if (cell_type) - src.cell = new cell_type(src) + if(cell_type) + cell = new cell_type(src) update_icon() /obj/machinery/space_heater/update_icon() @@ -79,7 +78,7 @@ return /obj/machinery/space_heater/attack_hand(mob/user as mob) - src.add_fingerprint(user) + add_fingerprint(user) interact(user) /obj/machinery/space_heater/interact(mob/user as mob) @@ -113,9 +112,9 @@ /obj/machinery/space_heater/Topic(href, href_list) - if (usr.stat) + if(usr.stat) return - if ((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon))) + if((in_range(src, usr) && istype(src.loc, /turf)) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) switch(href_list["op"]) @@ -153,8 +152,6 @@ usr.unset_machine() return - - /obj/machinery/space_heater/process() if(on) if(cell && cell.charge) @@ -166,7 +163,7 @@ if(removed) var/heat_transfer = removed.get_thermal_energy_change(set_temperature) if(heat_transfer > 0) //heating air - heat_transfer = min( heat_transfer , heating_power ) //limit by the power rating of the heater + heat_transfer = min(heat_transfer , heating_power) //limit by the power rating of the heater removed.add_thermal_energy(heat_transfer) cell.use(heat_transfer*CELLRATE) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 8b0d78cb968..98582f3ccc5 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -53,28 +53,12 @@ return ..() /obj/machinery/status_display/attackby(I as obj, user as mob) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "display" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "display_4" - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return else - src.attack_hand(user) + attack_hand(user) return - // register for radio system /obj/machinery/status_display/initialize() ..() @@ -108,7 +92,7 @@ if(STATUS_DISPLAY_TRANSFER_SHUTTLE_TIME) //emergency shuttle timer if(emergency_shuttle.waiting_to_leave()) message1 = "-ETD-" - if (emergency_shuttle.shuttle.is_launching()) + if(emergency_shuttle.shuttle.is_launching()) message2 = "Launch" else message2 = get_shuttle_timer_departure() @@ -150,7 +134,7 @@ return 1 if(STATUS_DISPLAY_TIME) message1 = "TIME" - message2 = worldtime2text() + message2 = stationtime2text() update_display(message1, message2) return 1 return 0 @@ -201,7 +185,7 @@ /obj/machinery/status_display/proc/get_supply_shuttle_timer() var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle - if (!shuttle) + if(!shuttle) return "Error" if(shuttle.has_arrive_time()) diff --git a/code/game/machinery/status_display_ai.dm b/code/game/machinery/status_display_ai.dm index 51fcfb4f51c..6984017c3dd 100644 --- a/code/game/machinery/status_display_ai.dm +++ b/code/game/machinery/status_display_ai.dm @@ -70,31 +70,16 @@ var/list/ai_status_emotions = list( var/emotion = "Neutral" /obj/machinery/ai_status_display/attackby(I as obj, user as mob) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "display" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "display_4" - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return else - src.attack_hand(user) + attack_hand(user) return /obj/machinery/ai_status_display/attack_ai/(mob/user as mob) var/list/ai_emotions = get_ai_emotions(user.ckey) var/emote = input("Please, select a status!", "AI Status", null, null) in ai_emotions - src.emotion = emote + emotion = emote /obj/machinery/ai_status_display/process() return diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 227ba52e0c0..a0595bcdc23 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -2,7 +2,6 @@ // SUIT STORAGE UNIT ///////////////// ////////////////////////////////////// - /obj/machinery/suit_storage_unit name = "Suit Storage Unit" desc = "An industrial U-Stor-It Storage unit designed to accomodate all kinds of space suits. Its on-board equipment also allows the user to decontaminate the contents through a UV-ray purging cycle. There's a warning label dangling from the control pad, reading \"STRICTLY NO BIOLOGICALS IN THE CONFINES OF THE UNIT\"." @@ -34,9 +33,8 @@ HELMET_TYPE = /obj/item/clothing/head/helmet/space MASK_TYPE = /obj/item/clothing/mask/breath - /obj/machinery/suit_storage_unit/New() - src.update_icon() + update_icon() if(SUIT_TYPE) SUIT = new SUIT_TYPE(src) if(HELMET_TYPE) @@ -54,40 +52,37 @@ hassuit = 1 if(OCCUPANT) hashuman = 1 - icon_state = text("suitstorage[][][][][][][][][]",hashelmet,hassuit,hashuman,src.isopen,src.islocked,src.isUV,src.ispowered,src.isbroken,src.issuperUV) - + icon_state = text("suitstorage[][][][][][][][][]", hashelmet, hassuit, hashuman, isopen, islocked, isUV, ispowered, isbroken, issuperUV) /obj/machinery/suit_storage_unit/power_change() ..() - if( !(stat & NOPOWER) ) - src.ispowered = 1 - src.update_icon() + if(!(stat & NOPOWER)) + ispowered = 1 + update_icon() else spawn(rand(0, 15)) - src.ispowered = 0 - src.islocked = 0 - src.isopen = 1 - src.dump_everything() - src.update_icon() - + ispowered = 0 + islocked = 0 + isopen = 1 + dump_everything() + update_icon() /obj/machinery/suit_storage_unit/ex_act(severity) switch(severity) if(1.0) if(prob(50)) - src.dump_everything() //So suits dont survive all the time + dump_everything() //So suits dont survive all the time qdel(src) return if(2.0) if(prob(50)) - src.dump_everything() + dump_everything() qdel(src) return else return return - /obj/machinery/suit_storage_unit/attack_hand(mob/user as mob) var/dat if(..()) @@ -96,45 +91,45 @@ return if(!user.IsAdvancedToolUser()) return 0 - if(src.panelopen) //The maintenance panel is open. Time for some shady stuff + if(panelopen) //The maintenance panel is open. Time for some shady stuff dat+= "Suit storage unit: Maintenance panel" dat+= "Maintenance panel controls
              " dat+= "The panel is ridden with controls, button and meters, labeled in strange signs and symbols that
              you cannot understand. Probably the manufactoring world's language.
              Among other things, a few controls catch your eye.


              " - dat+= text("A small dial with a small lambda symbol on it. It's pointing towards a gauge that reads [].
              Turn towards []
              ",(src.issuperUV ? "15nm" : "185nm"),src,(src.issuperUV ? "185nm" : "15nm") ) - dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.
              Press button",(src.safetieson? "GREEN" : "RED"),src) + dat+= text("A small dial with a small lambda symbol on it. It's pointing towards a gauge that reads [].
              Turn towards []
              ",(issuperUV ? "15nm" : "185nm"),src,(issuperUV ? "185nm" : "15nm")) + dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.
              Press button",(safetieson? "GREEN" : "RED"),src) dat+= text("

              Close panel", user) //user << browse(dat, "window=ssu_m_panel;size=400x500") //onclose(user, "ssu_m_panel") - else if(src.isUV) //The thing is running its cauterisation cycle. You have to wait. + else if(isUV) //The thing is running its cauterisation cycle. You have to wait. dat += "Suit storage unit" dat+= "Unit is cauterising contents with selected UV ray intensity. Please wait.
              " - //dat+= "Cycle end in: [src.cycletimeleft()] seconds. " + //dat+= "Cycle end in: [cycletimeleft()] seconds. " //user << browse(dat, "window=ssu_cycling_panel;size=400x500") //onclose(user, "ssu_cycling_panel") else - if(!src.isbroken) + if(!isbroken) dat+= "Suit storage unit" dat+= "U-Stor-It Suit Storage Unit, model DS1900
              " dat+= "Welcome to the Unit control panel.

              " - dat+= text("Helmet storage compartment: []
              ",(src.HELMET ? HELMET.name : "No helmet detected.") ) - if(HELMET && src.isopen) + dat+= text("Helmet storage compartment: []
              ",(HELMET ? HELMET.name : "
              No helmet detected.")) + if(HELMET && isopen) dat+=text("Dispense helmet
              ",src) - dat+= text("Suit storage compartment: []
              ",(src.SUIT ? SUIT.name : "
              No exosuit detected.") ) - if(SUIT && src.isopen) + dat+= text("Suit storage compartment: []
              ",(SUIT ? SUIT.name : "
              No exosuit detected.")) + if(SUIT && isopen) dat+=text("Dispense suit
              ",src) - dat+= text("Breathmask storage compartment: []
              ",(src.MASK ? MASK.name : "
              No breathmask detected.") ) - if(MASK && src.isopen) + dat+= text("Breathmask storage compartment: []
              ",(MASK ? MASK.name : "
              No breathmask detected.")) + if(MASK && isopen) dat+=text("Dispense mask
              ",src) - if(src.OCCUPANT) + if(OCCUPANT) dat+= "
              WARNING: Biological entity detected inside the Unit's storage. Please remove.
              " dat+= "Eject extra load" - dat+= text("
              Unit is: [] - [] Unit ",(src.isopen ? "Open" : "Closed"),src,(src.isopen ? "Close" : "Open")) - if(src.isopen) + dat+= text("
              Unit is: [] - [] Unit ",(isopen ? "Open" : "Closed"),src,(isopen ? "Close" : "Open")) + if(isopen) dat+="
              " else - dat+= text(" - *[] Unit*
              ",src,(src.islocked ? "Unlock" : "Lock") ) - dat+= text("Unit status: []",(src.islocked? "**LOCKED**
              " : "**UNLOCKED**
              ") ) + dat+= text(" - *[] Unit*
              ",src,(islocked ? "Unlock" : "Lock")) + dat+= text("Unit status: []",(islocked? "**LOCKED**
              " : "**UNLOCKED**
              ")) dat+= text("Start Disinfection cycle
              ",src) dat += text("

              Close control panel", user) //user << browse(dat, "window=Suit Storage Unit;size=400x500") @@ -154,54 +149,54 @@ /obj/machinery/suit_storage_unit/Topic(href, href_list) //I fucking HATE this proc if(..()) return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) + if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) usr.set_machine(src) - if (href_list["toggleUV"]) - src.toggleUV(usr) - src.updateUsrDialog() - src.update_icon() - if (href_list["togglesafeties"]) - src.togglesafeties(usr) - src.updateUsrDialog() - src.update_icon() - if (href_list["dispense_helmet"]) - src.dispense_helmet(usr) - src.updateUsrDialog() - src.update_icon() - if (href_list["dispense_suit"]) - src.dispense_suit(usr) - src.updateUsrDialog() - src.update_icon() - if (href_list["dispense_mask"]) - src.dispense_mask(usr) - src.updateUsrDialog() - src.update_icon() - if (href_list["toggle_open"]) - src.toggle_open(usr) - src.updateUsrDialog() - src.update_icon() - if (href_list["toggle_lock"]) - src.toggle_lock(usr) - src.updateUsrDialog() - src.update_icon() - if (href_list["start_UV"]) - src.start_UV(usr) - src.updateUsrDialog() - src.update_icon() - if (href_list["eject_guy"]) - src.eject_occupant(usr) - src.updateUsrDialog() - src.update_icon() - /*if (href_list["refresh"]) - src.updateUsrDialog()*/ - src.add_fingerprint(usr) + if(href_list["toggleUV"]) + toggleUV(usr) + updateUsrDialog() + update_icon() + if(href_list["togglesafeties"]) + togglesafeties(usr) + updateUsrDialog() + update_icon() + if(href_list["dispense_helmet"]) + dispense_helmet(usr) + updateUsrDialog() + update_icon() + if(href_list["dispense_suit"]) + dispense_suit(usr) + updateUsrDialog() + update_icon() + if(href_list["dispense_mask"]) + dispense_mask(usr) + updateUsrDialog() + update_icon() + if(href_list["toggle_open"]) + toggle_open(usr) + updateUsrDialog() + update_icon() + if(href_list["toggle_lock"]) + toggle_lock(usr) + updateUsrDialog() + update_icon() + if(href_list["start_UV"]) + start_UV(usr) + updateUsrDialog() + update_icon() + if(href_list["eject_guy"]) + eject_occupant(usr) + updateUsrDialog() + update_icon() + /*if(href_list["refresh"]) + updateUsrDialog()*/ + add_fingerprint(usr) return /obj/machinery/suit_storage_unit/proc/toggleUV(mob/user as mob) // var/protected = 0 // var/mob/living/carbon/human/H = user - if(!src.panelopen) + if(!panelopen) return /*if(istype(H)) //Let's check if the guy's wearing electrically insulated gloves @@ -215,25 +210,25 @@ user << "You try to touch the controls but you get zapped. There must be a short circuit somewhere." return*/ else //welp, the guy is protected, we can continue - if(src.issuperUV) + if(issuperUV) user << "You slide the dial back towards \"185nm\"." - src.issuperUV = 0 + issuperUV = 0 else user << "You crank the dial all the way up to \"15nm\"." - src.issuperUV = 1 + issuperUV = 1 return /obj/machinery/suit_storage_unit/proc/togglesafeties(mob/user as mob) // var/protected = 0 // var/mob/living/carbon/human/H = user - if(!src.panelopen) //Needed check due to bugs + if(!panelopen) //Needed check due to bugs return /*if(istype(H)) //Let's check if the guy's wearing electrically insulated gloves if(H.gloves) var/obj/item/clothing/gloves/G = H.gloves - if(istype(G,/obj/item/clothing/gloves/yellow) ) + if(istype(G,/obj/item/clothing/gloves/yellow)) protected = 1 if(!protected) @@ -242,146 +237,146 @@ return*/ else user << "You push the button. The coloured LED next to it changes." - src.safetieson = !src.safetieson + safetieson = !safetieson /obj/machinery/suit_storage_unit/proc/dispense_helmet(mob/user as mob) - if(!src.HELMET) + if(!HELMET) return //Do I even need this sanity check? Nyoro~n else - src.HELMET.loc = src.loc - src.HELMET = null + HELMET.loc = src.loc + HELMET = null return /obj/machinery/suit_storage_unit/proc/dispense_suit(mob/user as mob) - if(!src.SUIT) + if(!SUIT) return else - src.SUIT.loc = src.loc - src.SUIT = null + SUIT.loc = src.loc + SUIT = null return /obj/machinery/suit_storage_unit/proc/dispense_mask(mob/user as mob) - if(!src.MASK) + if(!MASK) return else - src.MASK.loc = src.loc - src.MASK = null + MASK.loc = src.loc + MASK = null return /obj/machinery/suit_storage_unit/proc/dump_everything() - src.islocked = 0 //locks go free - if(src.SUIT) - src.SUIT.loc = src.loc - src.SUIT = null - if(src.HELMET) - src.HELMET.loc = src.loc - src.HELMET = null - if(src.MASK) - src.MASK.loc = src.loc - src.MASK = null - if(src.OCCUPANT) - src.eject_occupant(OCCUPANT) + islocked = 0 //locks go free + if(SUIT) + SUIT.loc = src.loc + SUIT = null + if(HELMET) + HELMET.loc = src.loc + HELMET = null + if(MASK) + MASK.loc = src.loc + MASK = null + if(OCCUPANT) + eject_occupant(OCCUPANT) return /obj/machinery/suit_storage_unit/proc/toggle_open(mob/user as mob) - if(src.islocked || src.isUV) + if(islocked || isUV) user << "Unable to open unit." return - if(src.OCCUPANT) - src.eject_occupant(user) + if(OCCUPANT) + eject_occupant(user) return // eject_occupant opens the door, so we need to return - src.isopen = !src.isopen + isopen = !isopen return /obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user as mob) - if(src.OCCUPANT && src.safetieson) + if(OCCUPANT && safetieson) user << "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments." return - if(src.isopen) + if(isopen) return - src.islocked = !src.islocked + islocked = !islocked return /obj/machinery/suit_storage_unit/proc/start_UV(mob/user as mob) - if(src.isUV || src.isopen) //I'm bored of all these sanity checks + if(isUV || isopen) //I'm bored of all these sanity checks return - if(src.OCCUPANT && src.safetieson) + if(OCCUPANT && safetieson) user << "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle." return - if(!src.HELMET && !src.MASK && !src.SUIT && !src.OCCUPANT ) //shit's empty yo + if(!HELMET && !MASK && !SUIT && !OCCUPANT) //shit's empty yo user << "Unit storage bays empty. Nothing to disinfect -- Aborting." return user << "You start the Unit's cauterisation cycle." - src.cycletime_left = 20 - src.isUV = 1 - if(src.OCCUPANT && !src.islocked) - src.islocked = 1 //Let's lock it for good measure - src.update_icon() - src.updateUsrDialog() + cycletime_left = 20 + isUV = 1 + if(OCCUPANT && !islocked) + islocked = 1 //Let's lock it for good measure + update_icon() + updateUsrDialog() var/i //our counter for(i=0,i<4,i++) sleep(50) - if(src.OCCUPANT) + if(OCCUPANT) OCCUPANT.apply_effect(50, IRRADIATE) var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in OCCUPANT.internal_organs - if (!rad_organ) - if (OCCUPANT.can_feel_pain()) + if(!rad_organ) + if(OCCUPANT.can_feel_pain()) OCCUPANT.emote("scream") - if(src.issuperUV) + if(issuperUV) var/burndamage = rand(28,35) OCCUPANT.take_organ_damage(0,burndamage) else var/burndamage = rand(6,10) OCCUPANT.take_organ_damage(0,burndamage) if(i==3) //End of the cycle - if(!src.issuperUV) - if(src.HELMET) + if(!issuperUV) + if(HELMET) HELMET.clean_blood() - if(src.SUIT) + if(SUIT) SUIT.clean_blood() - if(src.MASK) + if(MASK) MASK.clean_blood() else //It was supercycling, destroy everything - if(src.HELMET) - src.HELMET = null - if(src.SUIT) - src.SUIT = null - if(src.MASK) - src.MASK = null + if(HELMET) + HELMET = null + if(SUIT) + SUIT = null + if(MASK) + MASK = null visible_message("With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.", 3) - src.isbroken = 1 - src.isopen = 1 - src.islocked = 0 - src.eject_occupant(OCCUPANT) //Mixing up these two lines causes bug. DO NOT DO IT. - src.isUV = 0 //Cycle ends - src.update_icon() - src.updateUsrDialog() + isbroken = 1 + isopen = 1 + islocked = 0 + eject_occupant(OCCUPANT) //Mixing up these two lines causes bug. DO NOT DO IT. + isUV = 0 //Cycle ends + update_icon() + updateUsrDialog() return /* spawn(200) //Let's clean dat shit after 20 secs //Eh, this doesn't work - if(src.HELMET) + if(HELMET) HELMET.clean_blood() - if(src.SUIT) + if(SUIT) SUIT.clean_blood() - if(src.MASK) + if(MASK) MASK.clean_blood() - src.isUV = 0 //Cycle ends - src.update_icon() - src.updateUsrDialog() + isUV = 0 //Cycle ends + update_icon() + updateUsrDialog() var/i for(i=0,i<4,i++) //Gradually give the guy inside some damaged based on the intensity spawn(50) - if(src.OCCUPANT) - if(src.issuperUV) + if(OCCUPANT) + if(issuperUV) OCCUPANT.take_organ_damage(0,40) user << "Test. You gave him 40 damage" else @@ -391,33 +386,33 @@ /obj/machinery/suit_storage_unit/proc/cycletimeleft() - if(src.cycletime_left >= 1) - src.cycletime_left-- - return src.cycletime_left + if(cycletime_left >= 1) + cycletime_left-- + return cycletime_left /obj/machinery/suit_storage_unit/proc/eject_occupant(mob/user as mob) - if (src.islocked) + if(islocked) return - if (!src.OCCUPANT) + if(!OCCUPANT) return // for(var/obj/O in src) // O.loc = src.loc - if (src.OCCUPANT.client) + if(OCCUPANT.client) if(user != OCCUPANT) OCCUPANT << "The machine kicks you out!" if(user.loc != src.loc) OCCUPANT << "You leave the not-so-cozy confines of the SSU." - src.OCCUPANT.client.eye = src.OCCUPANT.client.mob - src.OCCUPANT.client.perspective = MOB_PERSPECTIVE - src.OCCUPANT.loc = src.loc - src.OCCUPANT = null - if(!src.isopen) - src.isopen = 1 - src.update_icon() + OCCUPANT.client.eye = OCCUPANT.client.mob + OCCUPANT.client.perspective = MOB_PERSPECTIVE + OCCUPANT.loc = src.loc + OCCUPANT = null + if(!isopen) + isopen = 1 + update_icon() return @@ -426,12 +421,12 @@ set category = "Object" set src in oview(1) - if (usr.stat != 0) + if(usr.stat != 0) return - src.eject_occupant(usr) + eject_occupant(usr) add_fingerprint(usr) - src.updateUsrDialog() - src.update_icon() + updateUsrDialog() + update_icon() return @@ -440,15 +435,15 @@ set category = "Object" set src in oview(1) - if (usr.stat != 0) + if(usr.stat != 0) return - if (!src.isopen) + if(!isopen) usr << "The unit's doors are shut." return - if (!src.ispowered || src.isbroken) + if(!ispowered || isbroken) usr << "The unit is not operational." return - if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) + if((OCCUPANT) || (HELMET) || (SUIT)) usr << "It's too cluttered inside for you to fit in!" return visible_message("[usr] starts squeezing into the suit storage unit!", 3) @@ -458,111 +453,111 @@ usr.client.eye = src usr.loc = src // usr.metabslow = 1 - src.OCCUPANT = usr - src.isopen = 0 //Close the thing after the guy gets inside - src.update_icon() + OCCUPANT = usr + isopen = 0 //Close the thing after the guy gets inside + update_icon() // for(var/obj/O in src) // qdel(O) - src.add_fingerprint(usr) - src.updateUsrDialog() + add_fingerprint(usr) + updateUsrDialog() return else - src.OCCUPANT = null //Testing this as a backup sanity test + OCCUPANT = null //Testing this as a backup sanity test return /obj/machinery/suit_storage_unit/attackby(obj/item/I as obj, mob/user as mob) - if(!src.ispowered) + if(!ispowered) return if(istype(I, /obj/item/weapon/screwdriver)) - src.panelopen = !src.panelopen + panelopen = !panelopen playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1) - user << text("You [] the unit's maintenance panel.",(src.panelopen ? "open up" : "close") ) - src.updateUsrDialog() + user << text("You [] the unit's maintenance panel.",(panelopen ? "open up" : "close")) + updateUsrDialog() return - if ( istype(I, /obj/item/weapon/grab) ) + if(istype(I, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = I - if( !(ismob(G.affecting)) ) + if(!(ismob(G.affecting))) return - if (!src.isopen) + if(!isopen) usr << "The unit's doors are shut." return - if (!src.ispowered || src.isbroken) + if(!ispowered || isbroken) usr << "The unit is not operational." return - if ( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) //Unit needs to be absolutely empty + if((OCCUPANT) || (HELMET) || (SUIT)) //Unit needs to be absolutely empty user << "The unit's storage area is too cluttered." return visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.", 3) if(do_after(user, 20)) if(!G || !G.affecting) return //derpcheck var/mob/M = G.affecting - if (M.client) + if(M.client) M.client.perspective = EYE_PERSPECTIVE M.client.eye = src M.loc = src - src.OCCUPANT = M - src.isopen = 0 //close ittt + OCCUPANT = M + isopen = 0 //close ittt //for(var/obj/O in src) // O.loc = src.loc - src.add_fingerprint(user) + add_fingerprint(user) qdel(G) - src.updateUsrDialog() - src.update_icon() + updateUsrDialog() + update_icon() return return - if( istype(I,/obj/item/clothing/suit/space) ) - if(!src.isopen) + if(istype(I,/obj/item/clothing/suit/space)) + if(!isopen) return var/obj/item/clothing/suit/space/S = I - if(src.SUIT) + if(SUIT) user << "The unit already contains a suit." return user << "You load the [S.name] into the storage compartment." user.drop_item() S.loc = src - src.SUIT = S - src.update_icon() - src.updateUsrDialog() + SUIT = S + update_icon() + updateUsrDialog() return - if( istype(I,/obj/item/clothing/head/helmet) ) - if(!src.isopen) + if(istype(I,/obj/item/clothing/head/helmet)) + if(!isopen) return var/obj/item/clothing/head/helmet/H = I - if(src.HELMET) + if(HELMET) user << "The unit already contains a helmet." return user << "You load the [H.name] into the storage compartment." user.drop_item() H.loc = src - src.HELMET = H - src.update_icon() - src.updateUsrDialog() + HELMET = H + update_icon() + updateUsrDialog() return - if( istype(I,/obj/item/clothing/mask) ) - if(!src.isopen) + if(istype(I,/obj/item/clothing/mask)) + if(!isopen) return var/obj/item/clothing/mask/M = I - if(src.MASK) + if(MASK) user << "The unit already contains a mask." return user << "You load the [M.name] into the storage compartment." user.drop_item() M.loc = src - src.MASK = M - src.update_icon() - src.updateUsrDialog() + MASK = M + update_icon() + updateUsrDialog() return - src.update_icon() - src.updateUsrDialog() + update_icon() + updateUsrDialog() return /obj/machinery/suit_storage_unit/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) //////////////////////////////REMINDER: Make it lock once you place some fucker inside. @@ -649,12 +644,12 @@ can_repair = 1 /obj/machinery/suit_cycler/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/suit_cycler/attackby(obj/item/I as obj, mob/user as mob) if(electrified != 0) - if(src.shock(user, 100)) + if(shock(user, 100)) return //Hacking init. @@ -673,7 +668,7 @@ user << "The suit cycler is locked." return - if(src.contents.len > 0) + if(contents.len > 0) user << "There is no room inside the cycler for [G.affecting.name]." return @@ -682,23 +677,23 @@ if(do_after(user, 20)) if(!G || !G.affecting) return var/mob/M = G.affecting - if (M.client) + if(M.client) M.client.perspective = EYE_PERSPECTIVE M.client.eye = src M.loc = src - src.occupant = M + occupant = M - src.add_fingerprint(user) + add_fingerprint(user) qdel(G) - src.updateUsrDialog() + updateUsrDialog() return else if(istype(I,/obj/item/weapon/screwdriver)) panel_open = !panel_open user << "You [panel_open ? "open" : "close"] the maintenance panel." - src.updateUsrDialog() + updateUsrDialog() return else if(istype(I,/obj/item/clothing/head/helmet/space) && !istype(I, /obj/item/clothing/head/helmet/space/rig)) @@ -720,8 +715,8 @@ I.loc = src helmet = I - src.update_icon() - src.updateUsrDialog() + update_icon() + updateUsrDialog() return else if(istype(I,/obj/item/clothing/suit/space/void)) @@ -743,8 +738,8 @@ I.loc = src suit = I - src.update_icon() - src.updateUsrDialog() + update_icon() + updateUsrDialog() return ..() @@ -762,7 +757,7 @@ emagged = 1 safeties = 0 req_access = list() - src.updateUsrDialog() + updateUsrDialog() return 1 /obj/machinery/suit_cycler/attack_hand(mob/user as mob) @@ -776,19 +771,19 @@ return 0 if(electrified != 0) - if(src.shock(user, 100)) + if(shock(user, 100)) return usr.set_machine(src) var/dat = "Suit Cycler Interface" - if(src.active) + if(active) dat+= "
              The [model_text ? "[model_text] " : ""]suit cycler is currently in use. Please wait..." else if(locked) dat += "
              The [model_text ? "[model_text] " : ""]suit cycler is currently locked. Please contact your system administrator." - if(src.allowed(usr)) + if(allowed(usr)) dat += "
              \[unlock unit\]" else dat += "

              Suit cycler

              " @@ -857,7 +852,7 @@ else if(href_list["toggle_lock"]) - if(src.allowed(usr)) + if(allowed(usr)) locked = !locked usr << "You [locked ? "" : "un"]lock \the [src]." else @@ -871,7 +866,7 @@ active = 1 irradiating = 10 - src.updateUsrDialog() + updateUsrDialog() sleep(10) @@ -887,7 +882,7 @@ if(radiation_level > 1) suit.clean_blood() - src.updateUsrDialog() + updateUsrDialog() return /obj/machinery/suit_cycler/process() @@ -924,7 +919,7 @@ T.visible_message("\icon[src]The [src] pings loudly.") icon_state = initial(icon_state) active = 0 - src.updateUsrDialog() + updateUsrDialog() /obj/machinery/suit_cycler/proc/repair_suit() if(!suit || !suit.damage || !suit.can_breach) @@ -940,7 +935,7 @@ set category = "Object" set src in oview(1) - if (usr.stat != 0) + if(usr.stat != 0) return eject_occupant(usr) @@ -951,10 +946,10 @@ user << "The cycler is locked." return - if (!occupant) + if(!occupant) return - if (occupant.client) + if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE @@ -962,8 +957,8 @@ occupant = null add_fingerprint(usr) - src.updateUsrDialog() - src.update_icon() + updateUsrDialog() + update_icon() return diff --git a/code/game/machinery/supply_display.dm b/code/game/machinery/supply_display.dm index 97e747c0dba..d1be70e754c 100644 --- a/code/game/machinery/supply_display.dm +++ b/code/game/machinery/supply_display.dm @@ -7,14 +7,14 @@ message2 = "" var/datum/shuttle/ferry/supply/shuttle = supply_controller.shuttle - if (!shuttle) + if(!shuttle) message2 = "Error" else if(shuttle.has_arrive_time()) message2 = get_supply_shuttle_timer() if(lentext(message2) > CHARS_PER_LINE) message2 = "Error" - else if (shuttle.is_launching()) - if (shuttle.at_station()) + else if(shuttle.is_launching()) + if(shuttle.at_station()) message2 = "Launch" else message2 = "ETA" diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 77e58870993..fae062ffed7 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -111,9 +111,9 @@ target_drop_time = world.time + drop_delay else if(world.time >= target_drop_time) deactivate(permanent = 1) - var/drop_x = src.x-2 - var/drop_y = src.y-2 + var/drop_x = src.x - 2 + var/drop_y = src.y - 2 var/drop_z = src.z command_announcement.Announce(starsys_name+" Rapid Fabrication priority supply request #[rand(1000,9999)]-[rand(100,999)] recieved. Shipment dispatched via ballistic supply pod for immediate delivery. Have a nice day.", "Thank You For Your Patronage") - spawn(rand(100,300)) + spawn(rand(100, 300)) new /datum/random_map/droppod/supply(null, drop_x, drop_y, drop_z, supplied_drop = drop_type) // Splat. diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index 99d713cccba..2f539313121 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -5,16 +5,13 @@ // If he accepts there is a random chance he will be accepted, rejected, or rejected and killed // Bringing certain items can help improve the chance to become a traitor - /obj/machinery/syndicate_beacon name = "ominous beacon" desc = "This looks suspicious..." icon = 'icons/obj/device.dmi' icon_state = "syndbeacon" - anchored = 1 density = 1 - var/temptext = "" var/selfdestructing = 0 var/charges = 1 @@ -43,18 +40,18 @@ return if(href_list["betraitor"]) if(charges < 1) - src.updateUsrDialog() + updateUsrDialog() return var/mob/M = locate(href_list["traitormob"]) if(M.mind.special_role || jobban_isbanned(M, "Syndicate")) temptext = "We have no need for you at this time. Have a pleasant day.
              " - src.updateUsrDialog() + updateUsrDialog() return charges -= 1 switch(rand(1,2)) if(1) temptext = "Double-crosser. You planned to betray us from the start. Allow us to repay the favor in kind." - src.updateUsrDialog() + updateUsrDialog() spawn(rand(50,200)) selfdestruct() return if(istype(M, /mob/living/carbon/human)) @@ -64,11 +61,9 @@ traitors.equip(N) message_admins("[N]/([N.ckey]) has accepted a traitor objective from a syndicate beacon.") - - src.updateUsrDialog() + updateUsrDialog() return - /obj/machinery/syndicate_beacon/proc/selfdestruct() selfdestructing = 1 spawn() explosion(src.loc, 1, rand(1,3), rand(3,8), 10) @@ -90,7 +85,6 @@ var/active = 0 var/icontype = "beacon" - /obj/machinery/power/singularity_beacon/proc/Activate(mob/user = null) if(surplus() < 1500) if(user) user << "The connected wire doesn't have enough current." @@ -104,7 +98,6 @@ if(user) user << "You activate the beacon." - /obj/machinery/power/singularity_beacon/proc/Deactivate(mob/user = null) for(var/obj/singularity/singulo in world) if(singulo.target == src) @@ -114,11 +107,9 @@ if(user) user << "You deactivate the beacon." - /obj/machinery/power/singularity_beacon/attack_ai(mob/user as mob) return - /obj/machinery/power/singularity_beacon/attack_hand(var/mob/user as mob) if(anchored) return active ? Deactivate(user) : Activate(user) @@ -126,7 +117,6 @@ user << "You need to screw the beacon to the floor first!" return - /obj/machinery/power/singularity_beacon/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/screwdriver)) if(active) @@ -148,7 +138,6 @@ ..() return - /obj/machinery/power/singularity_beacon/Destroy() if(active) Deactivate() @@ -162,7 +151,6 @@ if(draw_power(1500) < 1500) Deactivate() - /obj/machinery/power/singularity_beacon/syndicate icontype = "beaconsynd" icon_state = "beaconsynd0" diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index c9a42680f74..77ac7f697e3 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -8,10 +8,10 @@ var/obj/item/locked = null var/id = null var/one_time_use = 0 //Used for one-time-use teleport cards (such as clown planet coordinates.) - //Setting this to 1 will set src.locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. + //Setting this to 1 will set locked to null after a player enters the portal and will not allow hand-teles to open portals to that location. /obj/machinery/computer/teleporter/New() - src.id = "[rand(1000, 9999)]" + id = "[rand(1000, 9999)]" ..() underlays.Cut() underlays += image('icons/obj/stationobjs.dmi', icon_state = "telecomp-wires") @@ -36,7 +36,7 @@ if(istype(I, /obj/item/weapon/card/data/)) var/obj/item/weapon/card/data/C = I if(stat & (NOPOWER|BROKEN) & (C.function != "teleporter")) - src.attack_hand() + attack_hand() var/obj/L = null @@ -49,7 +49,6 @@ if(!L) L = locate("landmark*[C.data]") // use old stype - if(istype(L, /obj/effect/landmark/) && istype(L.loc, /turf)) usr << "You insert the coordinates into the machine." usr << "A message flashes across the screen reminding the traveller that the nuclear authentication disk is to remain on the station at all times." @@ -69,17 +68,17 @@ else for(var/mob/O in hearers(src, null)) O.show_message("Locked In", 2) - src.locked = L + locked = L one_time_use = 1 - src.add_fingerprint(usr) + add_fingerprint(usr) else ..() return /obj/machinery/teleport/station/attack_ai() - src.attack_hand() + attack_hand() /obj/machinery/computer/teleporter/attack_hand(user as mob) if(..()) return @@ -92,7 +91,7 @@ for(var/obj/item/device/radio/beacon/R in world) var/turf/T = get_turf(R) - if (!T) + if(!T) continue if(!(T.z in config.player_levels)) continue @@ -104,12 +103,12 @@ L[tmpname] = R for (var/obj/item/weapon/implant/tracking/I in world) - if (!I.implanted || !ismob(I.loc)) + if(!I.implanted || !ismob(I.loc)) continue else var/mob/M = I.loc - if (M.stat == 2) - if (M.timeofdeath + 6000 < world.time) + if(M.stat == 2) + if(M.timeofdeath + 6000 < world.time) continue var/turf/T = get_turf(M) if(T) continue @@ -127,10 +126,10 @@ if(get_dist(src, usr) > 1 && !issilicon(usr)) return - src.locked = L[desc] + locked = L[desc] for(var/mob/O in hearers(src, null)) O.show_message("Locked In", 2) - src.add_fingerprint(usr) + add_fingerprint(usr) return /obj/machinery/computer/teleporter/verb/set_id(t as text) @@ -141,12 +140,12 @@ if(stat & (NOPOWER|BROKEN) || !istype(usr,/mob/living)) return - if (t) - src.id = t + if(t) + id = t return /proc/find_loc(obj/R as obj) - if (!R) return null + if(!R) return null var/turf/T = R.loc while(!istype(T, /turf)) T = T.loc @@ -160,7 +159,6 @@ anchored = 1.0 var/lockeddown = 0 - /obj/machinery/teleport/hub name = "teleporter hub" desc = "It's the hub of a teleporting machine." @@ -173,13 +171,11 @@ circuit = /obj/item/weapon/circuitboard/teleporter_hub var/obj/machinery/computer/teleporter/com - /obj/machinery/teleport/hub/New() ..() underlays.Cut() underlays += image('icons/obj/stationobjs.dmi', icon_state = "tele-wires") - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) @@ -194,19 +190,19 @@ /obj/machinery/teleport/hub/Bumped(M as mob|obj) spawn() - if (src.icon_state == "tele1") + if(icon_state == "tele1") teleport(M) use_power(5000) return /obj/machinery/teleport/hub/proc/teleport(atom/movable/M as mob|obj) - if (!com) + if(!com) return - if (!com.locked) + if(!com.locked) for(var/mob/O in hearers(src, null)) O.show_message("Failure: Cannot authenticate locked on coordinates. Please reinstate coordinate matrix.") return - if (istype(M, /atom/movable)) + if(istype(M, /atom/movable)) if(prob(5) && !accurate) //oh dear a problem, put em in deep space do_teleport(M, locate(rand((2*TRANSITIONEDGE), world.maxx - (2*TRANSITIONEDGE)), rand((2*TRANSITIONEDGE), world.maxy - (2*TRANSITIONEDGE)), 3), 2) else @@ -229,61 +225,60 @@ if(istype(M, /obj/effect)) qdel(M) return - if (istype(M, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite + if(istype(M, /obj/item/weapon/disk/nuclear)) // Don't let nuke disks get teleported --NeoFite for(var/mob/O in viewers(M, null)) O.show_message(text("The [] bounces off of the portal!", M.name), 1) return - if (istype(M, /mob/living)) + if(istype(M, /mob/living)) var/mob/living/MM = M if(MM.check_contents_for(/obj/item/weapon/disk/nuclear)) MM << "Something you are carrying seems to be unable to pass through the portal. Better drop it if you want to go through." return var/disky = 0 for (var/atom/O in M.contents) //I'm pretty sure this accounts for the maximum amount of container in container stacking. --NeoFite - if (istype(O, /obj/item/weapon/storage) || istype(O, /obj/item/weapon/gift)) + if(istype(O, /obj/item/weapon/storage) || istype(O, /obj/item/weapon/gift)) for (var/obj/OO in O.contents) - if (istype(OO, /obj/item/weapon/storage) || istype(OO, /obj/item/weapon/gift)) + if(istype(OO, /obj/item/weapon/storage) || istype(OO, /obj/item/weapon/gift)) for (var/obj/OOO in OO.contents) - if (istype(OOO, /obj/item/weapon/disk/nuclear)) + if(istype(OOO, /obj/item/weapon/disk/nuclear)) disky = 1 - if (istype(OO, /obj/item/weapon/disk/nuclear)) + if(istype(OO, /obj/item/weapon/disk/nuclear)) disky = 1 - if (istype(O, /obj/item/weapon/disk/nuclear)) + if(istype(O, /obj/item/weapon/disk/nuclear)) disky = 1 - if (istype(O, /mob/living)) + if(istype(O, /mob/living)) var/mob/living/MM = O if(MM.check_contents_for(/obj/item/weapon/disk/nuclear)) disky = 1 - if (disky) + if(disky) for(var/mob/P in viewers(M, null)) P.show_message(text("The [] bounces off of the portal!", M.name), 1) return //Bags of Holding cause bluespace teleportation to go funky. --NeoFite - if (istype(M, /mob/living)) + if(istype(M, /mob/living)) var/mob/living/MM = M if(MM.check_contents_for(/obj/item/weapon/storage/backpack/holding)) MM << "The Bluespace interface on your Bag of Holding interferes with the teleport!" precision = rand(1,100) - if (istype(M, /obj/item/weapon/storage/backpack/holding)) + if(istype(M, /obj/item/weapon/storage/backpack/holding)) precision = rand(1,100) for (var/atom/O in M.contents) //I'm pretty sure this accounts for the maximum amount of container in container stacking. --NeoFite - if (istype(O, /obj/item/weapon/storage) || istype(O, /obj/item/weapon/gift)) + if(istype(O, /obj/item/weapon/storage) || istype(O, /obj/item/weapon/gift)) for (var/obj/OO in O.contents) - if (istype(OO, /obj/item/weapon/storage) || istype(OO, /obj/item/weapon/gift)) + if(istype(OO, /obj/item/weapon/storage) || istype(OO, /obj/item/weapon/gift)) for (var/obj/OOO in OO.contents) - if (istype(OOO, /obj/item/weapon/storage/backpack/holding)) + if(istype(OOO, /obj/item/weapon/storage/backpack/holding)) precision = rand(1,100) - if (istype(OO, /obj/item/weapon/storage/backpack/holding)) + if(istype(OO, /obj/item/weapon/storage/backpack/holding)) precision = rand(1,100) - if (istype(O, /obj/item/weapon/storage/backpack/holding)) + if(istype(O, /obj/item/weapon/storage/backpack/holding)) precision = rand(1,100) - if (istype(O, /mob/living)) + if(istype(O, /mob/living)) var/mob/living/MM = O if(MM.check_contents_for(/obj/item/weapon/storage/backpack/holding)) precision = rand(1,100) - var/turf/destturf = get_turf(destination) var/tx = destturf.x + rand(precision * -1, precision) @@ -291,7 +286,7 @@ var/tmploc - if (ismob(destination.loc)) //If this is an implant. + if(ismob(destination.loc)) //If this is an implant. tmploc = locate(tx, ty, destturf.z) else tmploc = locate(tx, ty, destination.z) @@ -329,7 +324,6 @@ overlays.Cut() overlays += image('icons/obj/stationobjs.dmi', icon_state = "controller-wires") - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/console_screen(src) component_parts += new /obj/item/weapon/stock_parts/capacitor(src) @@ -338,45 +332,45 @@ RefreshParts() /obj/machinery/teleport/station/attackby(var/obj/item/weapon/W) - src.attack_hand() + attack_hand() /obj/machinery/teleport/station/attack_ai() - src.attack_hand() + attack_hand() /obj/machinery/teleport/station/attack_hand() if(engaged) - src.disengage() + disengage() else - src.engage() + engage() /obj/machinery/teleport/station/proc/engage() if(stat & (BROKEN|NOPOWER)) return - if (com) + if(com) com.icon_state = "tele1" use_power(5000) update_use_power(2) com.update_use_power(2) for(var/mob/O in hearers(src, null)) O.show_message("Teleporter engaged!", 2) - src.add_fingerprint(usr) - src.engaged = 1 + add_fingerprint(usr) + engaged = 1 return /obj/machinery/teleport/station/proc/disengage() if(stat & (BROKEN|NOPOWER)) return - if (com) + if(com) com.icon_state = "tele0" com.accurate = 0 com.update_use_power(1) update_use_power(1) for(var/mob/O in hearers(src, null)) O.show_message("Teleporter disengaged!", 2) - src.add_fingerprint(usr) - src.engaged = 0 + add_fingerprint(usr) + engaged = 0 return /obj/machinery/teleport/station/verb/testfire() @@ -387,7 +381,7 @@ if(stat & (BROKEN|NOPOWER) || !istype(usr,/mob/living)) return - if (com && !active) + if(com && !active) active = 1 for(var/mob/O in hearers(src, null)) O.show_message("Test firing!", 2) @@ -397,7 +391,7 @@ spawn(30) active=0 - src.add_fingerprint(usr) + add_fingerprint(usr) return /obj/machinery/teleport/station/power_change() @@ -412,11 +406,11 @@ /obj/effect/laser/Bump() - src.range-- + range-- return /obj/effect/laser/Move() - src.range-- + range-- return /atom/proc/laserhit(L as obj) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 967b7799ed0..17797e2a686 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -85,7 +85,7 @@ return if(istype(W, /obj/item/weapon/card/id)||istype(W, /obj/item/device/pda)) - if(src.allowed(usr)) + if(allowed(usr)) if(emagged) user << "The turret control is unresponsive." else @@ -133,7 +133,7 @@ data["settings"] = settings ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) + if(!ui) ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300) ui.set_initial_data(data) ui.open() @@ -193,8 +193,8 @@ if(stat & NOPOWER) icon_state = "control_off" set_light(0) - else if (enabled) - if (lethal) + else if(enabled) + if(lethal) icon_state = "control_kill" set_light(1.5, 1,"#990000") else diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index d28cb2444c7..79e262664ce 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -68,18 +68,18 @@ ..() wires = new(src) spawn(4) - if(src.product_slogans) - src.slogan_list += splittext(src.product_slogans, ";") + if(product_slogans) + slogan_list += splittext(product_slogans, ";") // So not all machines speak at the exact same time. // The first time this machine says something will be at slogantime + this random value, // so if slogantime is 10 minutes, it will say it at somewhere between 10 and 20 minutes after the machine is crated. - src.last_slogan = world.time + rand(0, slogan_delay) + last_slogan = world.time + rand(0, slogan_delay) - if(src.product_ads) - src.ads_list += splittext(src.product_ads, ";") + if(product_ads) + ads_list += splittext(product_ads, ";") - src.build_inventory() + build_inventory() power_change() return @@ -87,17 +87,17 @@ return /** - * Build src.produdct_records from the products lists + * Build produdct_records from the products lists * - * src.products, src.contraband, src.premium, and src.prices allow specifying + * products, contraband, premium, and prices allow specifying * products that the vending machine is to carry without manually populating - * src.product_records. + * product_records. */ /obj/machinery/vending/proc/build_inventory() var/list/all_products = list( - list(src.products, CAT_NORMAL), - list(src.contraband, CAT_HIDDEN), - list(src.premium, CAT_COIN)) + list(products, CAT_NORMAL), + list(contraband, CAT_HIDDEN), + list(premium, CAT_COIN)) for(var/current_list in all_products) var/category = current_list[2] @@ -105,11 +105,11 @@ for(var/entry in current_list[1]) var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry) - product.price = (entry in src.prices) ? src.prices[entry] : 0 + product.price = (entry in prices) ? prices[entry] : 0 product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1 product.category = category - src.product_records.Add(product) + product_records.Add(product) /obj/machinery/vending/Destroy() qdel(wires) @@ -127,21 +127,21 @@ qdel(src) return if(2.0) - if (prob(50)) + if(prob(50)) qdel(src) return if(3.0) - if (prob(25)) + if(prob(25)) spawn(0) - src.malfunction() + malfunction() return return else return /obj/machinery/vending/emag_act(var/remaining_charges, var/mob/user) - if (!emagged) - src.emagged = 1 + if(!emagged) + emagged = 1 user << "You short out the product lock on \the [src]" return 1 @@ -149,43 +149,43 @@ var/obj/item/weapon/card/id/I = W.GetID() - if (currently_vending && vendor_account && !vendor_account.suspended) + if(currently_vending && vendor_account && !vendor_account.suspended) var/paid = 0 var/handled = 0 - if (I) //for IDs and PDAs and wallets with IDs + if(I) //for IDs and PDAs and wallets with IDs paid = pay_with_card(I,W) handled = 1 - else if (istype(W, /obj/item/weapon/spacecash/ewallet)) + else if(istype(W, /obj/item/weapon/spacecash/ewallet)) var/obj/item/weapon/spacecash/ewallet/C = W paid = pay_with_ewallet(C) handled = 1 - else if (istype(W, /obj/item/weapon/spacecash)) + else if(istype(W, /obj/item/weapon/spacecash)) var/obj/item/weapon/spacecash/C = W paid = pay_with_cash(C, user) handled = 1 if(paid) - src.vend(currently_vending, usr) + vend(currently_vending, usr) return else if(handled) nanomanager.update_uis(src) return // don't smack that machine with your 2 thalers - if (I || istype(W, /obj/item/weapon/spacecash)) + if(I || istype(W, /obj/item/weapon/spacecash)) attack_hand(user) return else if(istype(W, /obj/item/weapon/screwdriver)) - src.panel_open = !src.panel_open - user << "You [src.panel_open ? "open" : "close"] the maintenance panel." - src.overlays.Cut() - if(src.panel_open) - src.overlays += image(src.icon, "[initial(icon_state)]-panel") + panel_open = !panel_open + user << "You [panel_open ? "open" : "close"] the maintenance panel." + overlays.Cut() + if(panel_open) + overlays += image(icon, "[initial(icon_state)]-panel") nanomanager.update_uis(src) // Speaker switch is on the main UI, not wires UI return else if(istype(W, /obj/item/device/multitool)||istype(W, /obj/item/weapon/wirecutters)) - if(src.panel_open) + if(panel_open) attack_hand(user) return else if(istype(W, /obj/item/weapon/coin) && premium.len > 0) @@ -197,7 +197,7 @@ nanomanager.update_uis(src) return else if(istype(W, /obj/item/weapon/wrench)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) if(anchored) user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") else @@ -253,8 +253,8 @@ /obj/machinery/vending/proc/pay_with_ewallet(var/obj/item/weapon/spacecash/ewallet/wallet) visible_message("\The [usr] swipes \the [wallet] through \the [src].") if(currently_vending.price > wallet.worth) - src.status_message = "Insufficient funds on chargecard." - src.status_error = 1 + status_message = "Insufficient funds on chargecard." + status_error = 1 return 0 else wallet.worth -= currently_vending.price @@ -273,14 +273,14 @@ else visible_message("\The [usr] swipes \the [ID_container] through \the [src].") var/datum/money_account/customer_account = get_account(I.associated_account_number) - if (!customer_account) - src.status_message = "Error: Unable to access account. Please contact technical support if problem persists." - src.status_error = 1 + if(!customer_account) + status_message = "Error: Unable to access account. Please contact technical support if problem persists." + status_error = 1 return 0 if(customer_account.suspended) - src.status_message = "Unable to access account: account suspended." - src.status_error = 1 + status_message = "Unable to access account: account suspended." + status_error = 1 return 0 // Have the customer punch in the PIN before checking if there's enough money. Prevents people from figuring out acct is @@ -290,13 +290,13 @@ customer_account = attempt_account_access(I.associated_account_number, attempt_pin, 2) if(!customer_account) - src.status_message = "Unable to access account: incorrect credentials." - src.status_error = 1 + status_message = "Unable to access account: incorrect credentials." + status_error = 1 return 0 if(currently_vending.price > customer_account.money) - src.status_message = "Insufficient funds in account." - src.status_error = 1 + status_message = "Insufficient funds in account." + status_error = 1 return 0 else // Okay to move the money at this point @@ -306,15 +306,15 @@ // create entry in the purchaser's account log var/datum/transaction/T = new() - T.target_name = "[vendor_account.owner_name] (via [src.name])" + T.target_name = "[vendor_account.owner_name] (via [name])" T.purpose = "Purchase of [currently_vending.item_name]" if(currently_vending.price > 0) T.amount = "([currently_vending.price])" else T.amount = "[currently_vending.price]" - T.source_terminal = src.name + T.source_terminal = name T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() customer_account.transaction_log.Add(T) // Give the vendor the money. We use the account owner name, which means @@ -335,9 +335,9 @@ T.target_name = target T.purpose = "Purchase of [currently_vending.item_name]" T.amount = "[currently_vending.price]" - T.source_terminal = src.name + T.source_terminal = name T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() vendor_account.transaction_log.Add(T) /obj/machinery/vending/attack_ai(mob/user as mob) @@ -347,8 +347,8 @@ if(stat & (BROKEN|NOPOWER)) return - if(src.seconds_electrified != 0) - if(src.shock(user, 100)) + if(seconds_electrified != 0) + if(shock(user, 100)) return wires.Interact(user) @@ -368,16 +368,16 @@ data["product"] = currently_vending.item_name data["price"] = currently_vending.price data["message_err"] = 0 - data["message"] = src.status_message - data["message_err"] = src.status_error + data["message"] = status_message + data["message_err"] = status_error else data["mode"] = 0 var/list/listed_products = list() - for(var/key = 1 to src.product_records.len) - var/datum/stored_item/vending_product/I = src.product_records[key] + for(var/key = 1 to product_records.len) + var/datum/stored_item/vending_product/I = product_records[key] - if(!(I.category & src.categories)) + if(!(I.category & categories)) continue listed_products.Add(list(list( @@ -389,18 +389,18 @@ data["products"] = listed_products - if(src.coin) - data["coin"] = src.coin.name + if(coin) + data["coin"] = coin.name - if(src.panel_open) + if(panel_open) data["panel"] = 1 - data["speaker"] = src.shut_up ? 0 : 1 + data["speaker"] = shut_up ? 0 : 1 else data["panel"] = 0 ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "vending_machine.tmpl", src.name, 440, 600) + if(!ui) + ui = new(user, src, ui_key, "vending_machine.tmpl", name, 440, 600) ui.set_initial_data(data) ui.open() @@ -422,8 +422,8 @@ coin = null categories &= ~CAT_COIN - if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) - if ((href_list["vend"]) && (src.vend_ready) && (!currently_vending)) + 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) @@ -433,43 +433,43 @@ var/datum/stored_item/vending_product/R = product_records[key] // This should not happen unless the request from NanoUI was bad - if(!(R.category & src.categories)) + if(!(R.category & categories)) return if(R.price <= 0) - src.vend(R, usr) + 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 - src.currently_vending = R + currently_vending = R if(!vendor_account || vendor_account.suspended) - src.status_message = "This machine is currently unable to process payments due to problems with the associated account." - src.status_error = 1 + status_message = "This machine is currently unable to process payments due to problems with the associated account." + status_error = 1 else - src.status_message = "Please swipe a card or insert cash to pay for the item." - src.status_error = 0 + status_message = "Please swipe a card or insert cash to pay for the item." + status_error = 0 - else if (href_list["cancelpurchase"]) - src.currently_vending = null + else if(href_list["cancelpurchase"]) + currently_vending = null - else if ((href_list["togglevoice"]) && (src.panel_open)) - src.shut_up = !src.shut_up + else if((href_list["togglevoice"]) && (panel_open)) + shut_up = !shut_up - src.add_fingerprint(usr) + add_fingerprint(usr) nanomanager.update_uis(src) /obj/machinery/vending/proc/vend(datum/stored_item/vending_product/R, mob/user) if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH usr << "Access denied." //Unless emagged of course - flick(src.icon_deny,src) + flick(icon_deny,src) return - src.vend_ready = 0 //One thing at a time!! - src.status_message = "Vending..." - src.status_error = 0 + vend_ready = 0 //One thing at a time!! + status_message = "Vending..." + status_error = 0 nanomanager.update_uis(src) - if (R.category & CAT_COIN) + if(R.category & CAT_COIN) if(!coin) user << "You need to insert a coin to get this item." return @@ -486,24 +486,24 @@ coin = null categories &= ~CAT_COIN - if(((src.last_reply + (src.vend_delay + 200)) <= world.time) && src.vend_reply) + if(((last_reply + (vend_delay + 200)) <= world.time) && vend_reply) spawn(0) - src.speak(src.vend_reply) - src.last_reply = world.time + speak(vend_reply) + last_reply = world.time use_power(vend_power_usage) //actuators and stuff - if (src.icon_vend) //Show the vending animation if needed - flick(src.icon_vend,src) - spawn(src.vend_delay) + if(icon_vend) //Show the vending animation if needed + flick(icon_vend,src) + spawn(vend_delay) R.get_product(get_turf(src)) if(prob(1)) sleep(3) if(R.get_product(get_turf(src))) - src.visible_message("\The [src] clunks as it vends an additional item.") + visible_message("\The [src] clunks as it vends an additional item.") - src.status_message = "" - src.status_error = 0 - src.vend_ready = 1 + status_message = "" + status_error = 0 + vend_ready = 1 currently_vending = null nanomanager.update_uis(src) @@ -527,20 +527,20 @@ if(stat & (BROKEN|NOPOWER)) return - if(!src.active) + if(!active) return - if(src.seconds_electrified > 0) - src.seconds_electrified-- + if(seconds_electrified > 0) + seconds_electrified-- //Pitch to the people! Really sell it! - if(((src.last_slogan + src.slogan_delay) <= world.time) && (src.slogan_list.len > 0) && (!src.shut_up) && prob(5)) - var/slogan = pick(src.slogan_list) - src.speak(slogan) - src.last_slogan = world.time + if(((last_slogan + slogan_delay) <= world.time) && (slogan_list.len > 0) && (!shut_up) && prob(5)) + var/slogan = pick(slogan_list) + speak(slogan) + last_slogan = world.time - if(src.shoot_inventory && prob(2)) - src.throw_item() + if(shoot_inventory && prob(2)) + throw_item() return @@ -548,7 +548,7 @@ if(stat & NOPOWER) return - if (!message) + if(!message) return for(var/mob/O in hearers(src, null)) @@ -560,21 +560,21 @@ if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" else - if( !(stat & NOPOWER) ) + if(!(stat & NOPOWER)) icon_state = initial(icon_state) else spawn(rand(0, 15)) - src.icon_state = "[initial(icon_state)]-off" + icon_state = "[initial(icon_state)]-off" //Oh no we're malfunctioning! Dump out some product and break. /obj/machinery/vending/proc/malfunction() - for(var/datum/stored_item/vending_product/R in src.product_records) + for(var/datum/stored_item/vending_product/R in product_records) while(R.get_amount()>0) R.get_product(loc) break stat |= BROKEN - src.icon_state = "[initial(icon_state)]-broken" + icon_state = "[initial(icon_state)]-broken" return //Somebody cut an important wire and now we're following a new definition of "pitch." @@ -584,16 +584,16 @@ if(!target) return 0 - for(var/datum/stored_item/vending_product/R in src.product_records) + for(var/datum/stored_item/vending_product/R in product_records) throw_item = R.get_product(loc) - if (!throw_item) + if(!throw_item) continue break - if (!throw_item) + if(!throw_item) return 0 spawn(0) throw_item.throw_at(target, 16, 3, src) - src.visible_message("\The [src] launches \a [throw_item] at \the [target]!") + visible_message("\The [src] launches \a [throw_item] at \the [target]!") return 1 /* @@ -776,6 +776,8 @@ vend_delay = 34 icon_state = "cigs" products = list(/obj/item/weapon/storage/fancy/cigarettes = 5, + /obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 5, + /obj/item/weapon/storage/fancy/cigarettes/killthroat = 5, /obj/item/weapon/storage/fancy/cigarettes/luckystars = 5, /obj/item/weapon/storage/fancy/cigarettes/jerichos = 5, /obj/item/weapon/storage/fancy/cigarettes/menthols = 5, @@ -785,7 +787,9 @@ premium = list(/obj/item/weapon/storage/fancy/cigar = 5, /obj/item/weapon/storage/fancy/cigarettes/carcinomas = 5, /obj/item/weapon/storage/fancy/cigarettes/professionals = 5) - prices = list(/obj/item/weapon/storage/fancy/cigarettes = 15, + prices = list(/obj/item/weapon/storage/fancy/cigarettes = 12, + /obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 15, + /obj/item/weapon/storage/fancy/cigarettes/killthroat = 17, /obj/item/weapon/storage/fancy/cigarettes/luckystars = 17, /obj/item/weapon/storage/fancy/cigarettes/jerichos = 22, /obj/item/weapon/storage/fancy/cigarettes/menthols = 18, @@ -885,9 +889,9 @@ */ /obj/machinery/vending/hydroseeds/build_inventory() var/list/all_products = list( - list(src.products, CAT_NORMAL), - list(src.contraband, CAT_HIDDEN), - list(src.premium, CAT_COIN)) + list(products, CAT_NORMAL), + list(contraband, CAT_HIDDEN), + list(premium, CAT_COIN)) for(var/current_list in all_products) var/category = current_list[2] @@ -897,11 +901,11 @@ var/name = S.name var/datum/stored_item/vending_product/product = new/datum/stored_item/vending_product(src, entry, name) - product.price = (entry in src.prices) ? src.prices[entry] : 0 + product.price = (entry in prices) ? prices[entry] : 0 product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1 product.category = category - src.product_records.Add(product) + product_records.Add(product) /obj/machinery/vending/magivend name = "MagiVend" @@ -961,7 +965,7 @@ /obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5, /obj/item/device/flashlight/glowstick = 3, /obj/item/device/flashlight/glowstick/red = 3, /obj/item/device/flashlight/glowstick/blue = 3, /obj/item/device/flashlight/glowstick/orange =3, /obj/item/device/flashlight/glowstick/yellow = 3) - contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2, ) + contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2,) premium = list(/obj/item/clothing/gloves/yellow = 1) /obj/machinery/vending/engivend diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 701d4ebab23..3a036eec8e1 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -4,136 +4,96 @@ icon = 'icons/obj/stock_parts.dmi' icon_state = "frame_bitem" flags = CONDUCT - var/build_machine_type = /obj/structure/frame + var/build_machine_type var/refund_amt = 5 var/refund_type = /obj/item/stack/material/steel var/reverse = 0 //if resulting object faces opposite its dir (like light fixtures) - var/frame_type = null + var/list/frame_types_floor + var/list/frame_types_wall + +/obj/item/frame/proc/update_type_list() + if(!frame_types_floor) + frame_types_floor = construction_frame_floor + if(!frame_types_wall) + frame_types_wall = construction_frame_wall /obj/item/frame/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/wrench)) - new refund_type( get_turf(src.loc), refund_amt) + if(istype(W, /obj/item/weapon/wrench)) + new refund_type(get_turf(src.loc), refund_amt) qdel(src) return ..() /obj/item/frame/attack_self(mob/user as mob) ..() + update_type_list() + var/datum/frame/frame_types/frame_type if(!build_machine_type) - return - - if(!frame_type) - var/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in list("Computer", "Machine", "Holopad", "Conveyor", - "Photocopier", "Fax", "Microwave", - "Recharger", "Washing Machine", "Grinder", - "Medical Console", "Medical Pod", "DNA Analyzer", - "Mass Driver", - "Cancel") - - if(response == "Cancel") + var/datum/frame/frame_types/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_floor + if(!response || response.name == "Cancel") return + frame_type = response - frame_type = lowertext(response) + build_machine_type = /obj/structure/frame - switch(response) - if("Holopad") - new /obj/item/stack/material/steel( usr.loc, 1 ) //holopads are smaller, they only need 4 sheets - if("Fax") - new /obj/item/stack/material/steel( usr.loc, 2 ) //faxes are smaller, they only need 3 sheets - if("Microwave") - new /obj/item/stack/material/steel( usr.loc, 1 ) //microwaves are smaller, they only need 4 sheets - if("Recharger") - new /obj/item/stack/material/steel( usr.loc, 2 ) //rechargers are smaller, they only need 3 sheets - if("Washing Machine") - frame_type = "washing" - if("Grinder") - new /obj/item/stack/material/steel( usr.loc, 2 ) //grinders are smaller, they only need 3 sheets - if("Medical Console") - frame_type = "console" - if("Medical Pod") - frame_type = "medpod" - if("DNA Analyzer") - frame_type = "dna_analyzer" - if("Mass Driver") - frame_type = "massdriver" + if(frame_type.frame_size != 5) + new /obj/item/stack/material/steel(usr.loc, (5 - frame_type.frame_size)) var/ndir ndir = usr.dir - if (!(ndir in cardinal)) + if(!(ndir in cardinal)) return var/obj/machinery/M = new build_machine_type(get_turf(src.loc), ndir, 1, frame_type) - M.fingerprints = src.fingerprints - M.fingerprintshidden = src.fingerprintshidden - M.fingerprintslast = src.fingerprintslast + M.fingerprints = fingerprints + M.fingerprintshidden = fingerprintshidden + M.fingerprintslast = fingerprintslast qdel(src) /obj/item/frame/proc/try_build(turf/on_wall, mob/user as mob) - if(!frame_type) - var/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in list("Fire Alarm", "Air Alarm", "Display", "Newscaster", - "ATM", "Guest Pass Console", "Intercom", "Keycard Authenticator", - "Wall Charger", "Supply Request Console", - "Cancel") - - if(response == "Cancel") - return - - frame_type = lowertext(response) - - switch(response) - if("Fire Alarm") - frame_type = "firealarm" - new /obj/item/stack/material/steel( usr.loc, 3 ) //fire alarms are smaller, they only need 2 sheets - if("Air Alarm") - frame_type = "airalarm" - new /obj/item/stack/material/steel( usr.loc, 3 ) //air alarms are smaller, they only need 2 sheets - if("Intercom") - new /obj/item/stack/material/steel( usr.loc, 3 ) //intercoms are smaller, they only need 2 sheets - if("Newscaster") - new /obj/item/stack/material/steel( usr.loc, 2 ) //newscasters are smaller, they only need 3 sheets - if("Guest Pass Console") - frame_type = "guestpass" - new /obj/item/stack/material/steel( usr.loc, 3 ) //guestpass consoles are smaller, they only need 2 sheets - if("Keycard Authenticator") - frame_type = "keycard" - new /obj/item/stack/material/steel( usr.loc, 4 ) //keycard authenticators are smaller, they only need 1 sheets - if("Wall Charger") - frame_type = "wrecharger" - new /obj/item/stack/material/steel( usr.loc, 2 ) //wall rechargers are smaller, they only need 3 sheets - if("Supply Request Console") - frame_type = "request" - + update_type_list() + var/datum/frame/frame_types/frame_type if(!build_machine_type) - return + var/datum/frame/frame_types/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in frame_types_wall + if(!response || response.name == "Cancel") + return + frame_type = response - if (get_dist(on_wall,usr)>1) + build_machine_type = /obj/structure/frame + + if(frame_type.frame_size != 5) + new /obj/item/stack/material/steel(usr.loc, (5 - frame_type.frame_size)) + + if(get_dist(on_wall, usr)>1) return var/ndir if(reverse) - ndir = get_dir(usr,on_wall) + ndir = get_dir(usr, on_wall) else - ndir = get_dir(on_wall,usr) + ndir = get_dir(on_wall, usr) - if (!(ndir in cardinal)) + if(!(ndir in cardinal)) return var/turf/loc = get_turf(usr) var/area/A = loc.loc - if (!istype(loc, /turf/simulated/floor)) + if(!istype(loc, /turf/simulated/floor)) usr << "\The frame cannot be placed on this spot." return - if (A.requires_power == 0 || A.name == "Space") + + if(A.requires_power == 0 || A.name == "Space") usr << "\The [src] Alarm cannot be placed in this area." return if(gotwallitem(loc, ndir)) usr << "There's already an item on this wall!" return + var/obj/machinery/M = new build_machine_type(loc, ndir, 1, frame_type) - M.fingerprints = src.fingerprints - M.fingerprintshidden = src.fingerprintshidden - M.fingerprintslast = src.fingerprintslast + M.fingerprints = fingerprints + M.fingerprintshidden = fingerprintshidden + M.fingerprintslast = fingerprintslast qdel(src) /obj/item/frame/light @@ -143,14 +103,12 @@ icon_state = "tube-construct-item" build_machine_type = /obj/machinery/light_construct reverse = 1 - frame_type = 1 /obj/item/frame/light/small name = "small light fixture frame" icon_state = "bulb-construct-item" refund_amt = 1 build_machine_type = /obj/machinery/light_construct/small - frame_type = 1 /obj/item/frame/extinguisher_cabinet name = "extinguisher cabinet frame" @@ -159,7 +117,6 @@ icon_state = "extinguisher_empty" refund_amt = 4 build_machine_type = /obj/structure/extinguisher_cabinet - frame_type = 1 /obj/item/frame/noticeboard name = "noticeboard frame" @@ -169,7 +126,6 @@ refund_amt = 4 refund_type = /obj/item/stack/material/wood build_machine_type = /obj/structure/noticeboard - frame_type = 1 /obj/item/frame/mirror name = "mirror frame" @@ -178,7 +134,6 @@ icon_state = "mirror_frame" refund_amt = 1 build_machine_type = /obj/structure/mirror - frame_type = 1 /obj/item/frame/fireaxe_cabinet name = "fire axe cabinet frame" @@ -186,5 +141,4 @@ icon = 'icons/obj/closet.dmi' icon_state = "fireaxe0101" refund_amt = 4 - build_machine_type = /obj/structure/closet/fireaxecabinet - frame_type = 1 \ No newline at end of file + build_machine_type = /obj/structure/closet/fireaxecabinet \ No newline at end of file diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 93d161f2ea6..cf962603589 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -26,7 +26,7 @@ ) /obj/machinery/washing_machine/New() - circuit = new circuit(src) + ..() component_parts = list() component_parts += new /obj/item/weapon/stock_parts/motor(src) component_parts += new /obj/item/weapon/stock_parts/gear(src) @@ -41,11 +41,11 @@ if(!istype(usr, /mob/living)) //ew ew ew usr, but it's the only way to check. return - if( state != 4 ) + if(state != 4) usr << "The washing machine cannot run in this state." return - if( locate(/mob,washing) ) + if(locate(/mob,washing)) state = 8 else state = 5 @@ -63,7 +63,7 @@ WL.amount = HH.amount qdel(HH) - if( locate(/mob,washing) ) + if(locate(/mob,washing)) state = 7 gibs_ready = 1 else @@ -76,10 +76,9 @@ set src in usr.loc sleep(20) - if(state in list(1,3,6) ) + if(state in list(1,3,6)) usr.loc = src.loc - /obj/machinery/washing_machine/update_icon() icon_state = "wm_[state][panel_open]" @@ -93,7 +92,7 @@ panel = !panel user << "You [panel ? "open" : "close"] the [src]'s maintenance panel"*/ if(istype(W,/obj/item/weapon/pen/crayon) || istype(W,/obj/item/weapon/stamp)) - if( state in list( 1, 3, 6 ) ) + if(state in list( 1, 3, 6)) if(!crayon) user.drop_item() crayon = W @@ -103,7 +102,7 @@ else ..() else if(istype(W,/obj/item/weapon/grab)) - if( (state == 1) && hacked) + if((state == 1) && hacked) var/obj/item/weapon/grab/G = W if(ishuman(G.assailant) && iscorgi(G.affecting)) G.affecting.loc = src @@ -118,7 +117,7 @@ else if(istype(W, /obj/item/clothing)) if(washing.len < 5) - if ( state in list(1, 3) ) + if(state in list(1, 3)) user.drop_item() W.loc = src washing += W diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm index 71b7de64c02..e36b577e9e2 100644 --- a/code/game/machinery/wishgranter.dm +++ b/code/game/machinery/wishgranter.dm @@ -3,11 +3,9 @@ desc = "You're not so sure about this, anymore..." icon = 'icons/obj/device.dmi' icon_state = "syndbeacon" - use_power = 0 anchored = 1 density = 1 - var/charges = 1 var/insisting = 0 @@ -25,7 +23,7 @@ else if(is_special_character(user)) user << "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away." - else if (!insisting) + else if(!insisting) user << "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?" insisting++ @@ -36,22 +34,22 @@ charges-- insisting = 0 - if (!(HULK in user.mutations)) + if(!(HULK in user.mutations)) user.mutations.Add(HULK) - if (!(LASER in user.mutations)) + if(!(LASER in user.mutations)) user.mutations.Add(LASER) - if (!(XRAY in user.mutations)) + if(!(XRAY in user.mutations)) user.mutations.Add(XRAY) user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS) user.see_in_dark = 8 user.see_invisible = SEE_INVISIBLE_LEVEL_TWO - if (!(COLD_RESISTANCE in user.mutations)) + if(!(COLD_RESISTANCE in user.mutations)) user.mutations.Add(COLD_RESISTANCE) - if (!(TK in user.mutations)) + if(!(TK in user.mutations)) user.mutations.Add(TK) if(!(HEAL in user.mutations)) diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm index 23c30d3a3d9..55255d20974 100644 --- a/code/game/mecha/mech_bay.dm +++ b/code/game/mecha/mech_bay.dm @@ -4,6 +4,7 @@ icon = 'icons/mecha/mech_bay.dmi' icon_state = "recharge_floor" density = 0 + anchored = 1 layer = TURF_LAYER + 0.1 circuit = /obj/item/weapon/circuitboard/mech_recharger @@ -14,13 +15,11 @@ /obj/machinery/mech_recharger/New() ..() component_parts = list() - component_parts += new /obj/item/weapon/stock_parts/capacitor(src) component_parts += new /obj/item/weapon/stock_parts/capacitor(src) component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) - RefreshParts() /obj/machinery/mech_recharger/Crossed(var/obj/mecha/M) @@ -50,7 +49,7 @@ ..() if(!charging) return - if(charging.loc != loc) // Could be qdel or teleport or something + if(charging.loc != src.loc) // Could be qdel or teleport or something stop_charging() return var/done = 1 @@ -95,4 +94,4 @@ if(!charging) return - charging = null + charging = null \ No newline at end of file diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index ee000d60bef..da744422cf8 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -27,7 +27,6 @@ /obj/machinery/mecha_part_fabricator/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index 588fd402f38..634a239d825 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -28,7 +28,6 @@ /obj/machinery/pros_fabricator/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index b7bb820f546..2cc8b7a64fd 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -59,6 +59,15 @@ icon_state = "snow" anchored = 1 +// Todo: Add a version that gradually reaccumulates over time by means of alpha transparency. -Spades +/obj/effect/overlay/snow/attackby(obj/item/W as obj, mob/user as mob) + if (istype(W, /obj/item/weapon/shovel)) + user.visible_message("[user] begins to shovel away \the [src].") + if(do_after(user, 40)) + user << "You have finished shoveling!" + qdel(src) + return + /obj/effect/overlay/snow/floor icon_state = "snowfloor" layer = 2.01 //Just above floor diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index f0bb82efd0e..76c7dfd6a5a 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -66,7 +66,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/examine(mob/user) if(..(user, 1)) - user << "The time [worldtime2text()] is displayed in the corner of the screen." + user << "The time [stationtime2text()] is displayed in the corner of the screen." /obj/item/device/pda/medical default_cartridge = /obj/item/weapon/cartridge/medical @@ -523,7 +523,7 @@ var/global/list/obj/item/device/pda/PDAs = list() cartdata["charges"] = cartridge.charges ? cartridge.charges : 0 data["cartridge"] = cartdata - data["stationTime"] = worldtime2text() + data["stationTime"] = stationtime2text() data["new_Message"] = new_message data["new_News"] = new_news @@ -1054,7 +1054,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/proc/create_message(var/mob/living/U = usr, var/obj/item/device/pda/P, var/tap = 1) if(tap) - U.visible_message("\The [U] taps on \his PDA's screen.") + U.visible_message("\The [U] taps on their PDA's screen.") var/t = input(U, "Please enter message", P.name, null) as text t = sanitize(t) //t = readd_quotes(t) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index b101bab0ee0..e5715c60604 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -334,7 +334,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list() data["video_comm"] = video_source ? "\ref[video_source.loc]" : null data["imContacts"] = im_contacts_ui data["imList"] = im_list_ui - data["time"] = worldtime2text() + data["time"] = stationtime2text() data["ring"] = ringer data["homeScreen"] = modules_ui data["note"] = note // current notes diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index e2430bb5d9f..2901e4c2c91 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -80,7 +80,7 @@ flash_strength *= H.species.flash_mod if(flash_strength > 0) - H.confused = max(H.confused, flash_strength) + H.confused = max(H.confused, flash_strength + 5) H.eye_blind = max(H.eye_blind, flash_strength) H.eye_blurry = max(H.eye_blurry, flash_strength + 5) H.flash_eyes() diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index cbc60670e7b..4e6154189a8 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -21,8 +21,8 @@ origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage var/obj/machinery/clonepod/connecting //same for cryopod linkage - var/obj/machinery/connectable //Used to connect machinery, currently only used by Xenobio2. - + var/obj/machinery/connectable //Used to connect machinery. + /obj/item/device/multitool/attack_self(mob/user) var/clear = alert("Do you want to clear the buffers on the [src]?",, "Yes", "No",) if(clear == "Yes") diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index fe288b470b3..961286da09d 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -60,7 +60,7 @@ channels = list("Command" = 1) /obj/item/device/encryptionkey/heads/captain - name = "captain's encryption key" + name = "station administrator's encryption key" icon_state = "cap_cypherkey" channels = list("Command" = 1, "Security" = 1, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index ce7eba21d8a..9147b4f8407 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -158,14 +158,14 @@ /obj/item/device/radio/headset/heads/captain - name = "captain's headset" + name = "station administrator's headset" desc = "The headset of the boss." icon_state = "com_headset" item_state = "headset" ks2type = /obj/item/device/encryptionkey/heads/captain /obj/item/device/radio/headset/heads/captain/alt - name = "captain's bowman headset" + name = "station administrator's bowman headset" desc = "The headset of the boss." icon_state = "com_headset_alt" item_state = "headset" @@ -244,14 +244,14 @@ /obj/item/device/radio/headset/heads/hop name = "head of personnel's headset" - desc = "The headset of the guy who will one day be captain." + desc = "The headset of the guy who will one day be Station Administrator." icon_state = "com_headset" item_state = "headset" ks2type = /obj/item/device/encryptionkey/heads/hop /obj/item/device/radio/headset/heads/hop/alt name = "head of personnel's bowman headset" - desc = "The headset of the guy who will one day be captain." + desc = "The headset of the guy who will one day be Station Administrator." icon_state = "com_headset_alt" item_state = "headset" ks2type = /obj/item/device/encryptionkey/heads/hop diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 7aaf609eca6..4ea8837d807 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -46,6 +46,7 @@ /obj/item/device/radio/intercom/New() ..() processing_objects += src + circuit = new circuit(src) /obj/item/device/radio/intercom/department/medbay/New() ..() @@ -84,7 +85,7 @@ attack_self(user) /obj/item/device/radio/intercom/attackby(obj/item/W as obj, mob/user as mob) - src.add_fingerprint(user) + add_fingerprint(user) if(istype(W, /obj/item/weapon/screwdriver)) // Opening the intercom up. wiresexposed = !wiresexposed user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" @@ -96,22 +97,20 @@ else icon_state = "intercom" return - if (wiresexposed && istype(W, /obj/item/weapon/wirecutters)) + if(wiresexposed && istype(W, /obj/item/weapon/wirecutters)) user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) new/obj/item/stack/cable_coil(get_turf(src), 5) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "intercom" + var/obj/structure/frame/A = new /obj/structure/frame(src.loc) + var/obj/item/weapon/circuitboard/M = circuit + A.frame_type = M.board_type A.pixel_x = pixel_x A.pixel_y = pixel_y A.circuit = M A.set_dir(dir) A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) A.state = 2 - A.icon_state = "intercom_2" + A.update_icon() M.deconstruct(src) qdel(src) else @@ -175,4 +174,4 @@ /obj/item/device/radio/intercom/locked/confessional name = "confessional intercom" - frequency = 1480 + frequency = 1480 \ No newline at end of file diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index c453e96c439..4447ca7af29 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -20,7 +20,7 @@ var/on = 0 //is it turned on? var/cover_open = 0 //is the cover open? var/obj/item/weapon/cell/cell - var/max_cooling = 12 // in degrees per second - probably don't need to mess with heat capacity here + var/max_cooling = 15 // in degrees per second - probably don't need to mess with heat capacity here var/charge_consumption = 3 // charge per second at max_cooling var/thermostat = T20C diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index faa17586c2d..a68e65b6ead 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -158,7 +158,7 @@ nanoui_data["categories"] = categories nanoui_data["discount_name"] = discount_item ? discount_item.name : "" nanoui_data["discount_amount"] = (1-discount_amount)*100 - nanoui_data["offer_expiry"] = worldtime2text(next_offer_time) + nanoui_data["offer_expiry"] = worldtime2stationtime(next_offer_time) else if(nanoui_menu == 1) var/items[0] for(var/datum/uplink_item/item in category.items) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 1298206b3e3..3e9c9a75242 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -246,10 +246,13 @@ /obj/item/stack/medical/splint name = "medical splints" singular_name = "medical splint" + desc = "Modular splints capable of supporting and immobilizing bones in both limbs and appendages." icon_state = "splint" amount = 5 max_amount = 5 + var/list/splintable_organs = list(BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG, BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT) //List of organs you can splint, natch. + /obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/living/user as mob) if(..()) return 1 @@ -258,8 +261,8 @@ var/mob/living/carbon/human/H = M var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting) var/limb = affecting.name - if(!(affecting.organ_tag in list("l_arm","r_arm","l_leg","r_leg"))) - user << "You can't apply a splint there!" + if(!(affecting.organ_tag in splintable_organs)) + user << "You can't use \the [src] to apply a splint there!" return if(affecting.status & ORGAN_SPLINTED) user << "[M]'s [limb] is already splinted!" @@ -267,7 +270,8 @@ if (M != user) user.visible_message("[user] starts to apply \the [src] to [M]'s [limb].", "You start to apply \the [src] to [M]'s [limb].", "You hear something being wrapped.") else - if((!user.hand && affecting.organ_tag == "r_arm") || (user.hand && affecting.organ_tag == "l_arm")) + if(( !user.hand && (affecting.organ_tag in list(BP_R_ARM, BP_R_HAND)) || \ + user.hand && (affecting.organ_tag in list(BP_L_ARM, BP_L_HAND)) )) user << "You can't apply a splint to the arm you're using!" return user.visible_message("[user] starts to apply \the [src] to their [limb].", "You start to apply \the [src] to your [limb].", "You hear something being wrapped.") @@ -283,3 +287,12 @@ affecting.status |= ORGAN_SPLINTED use(1) return + + +/obj/item/stack/medical/splint/ghetto + name = "makeshift splints" + singular_name = "makeshift splint" + desc = "For holding your limbs in place with duct tape and scrap metal." + icon_state = "tape-splint" + amount = 1 + splintable_organs = list(BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 87ada4fa4e5..73d4d3cbcd4 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -26,7 +26,6 @@ stacktype = /obj/item/stack/rods /obj/item/stack/rods/attackby(obj/item/W as obj, mob/user as mob) - ..() if (istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W @@ -46,6 +45,17 @@ if (!R && replace) user.put_in_hands(new_item) return + + if (istype(W, /obj/item/weapon/tape_roll)) + var/obj/item/stack/medical/splint/ghetto/new_splint = new(user.loc) + new_splint.loc = src.loc + new_splint.add_fingerprint(user) + + user.visible_message("\The [user] constructs \a [new_splint] out of a [singular_name].", \ + "You use make \a [new_splint] out of a [singular_name].") + src.use(1) + return + ..() diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index 2682361d2c8..f56b9580fc0 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -7,19 +7,16 @@ icon_state = "telecrystal" w_class = 1 max_amount = 240 - flags = NOBLUDGEON origin_tech = list(TECH_MATERIAL = 6, TECH_BLUESPACE = 4) + force = 1 //Needs a token force to ensure you can attack because for some reason you can't attack with 0 force things -/obj/item/stack/telecrystal/afterattack(var/obj/item/I as obj, mob/user as mob, proximity) - if(!proximity) - return - if(istype(I, /obj/item)) - if(I.hidden_uplink && I.hidden_uplink.active) //No metagaming by using this on every PDA around just to see if it gets used up. - I.hidden_uplink.uses += amount - I.hidden_uplink.update_nano_data() - nanomanager.update_uis(I.hidden_uplink) - use(amount) - user << "You slot \the [src] into \the [I] and charge its internal uplink." +/obj/item/stack/telecrystal/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) + if(amount >= 5) + target.visible_message("\The [target] has been transported with \the [src] by \the [user].") + safe_blink(target, 14) + use(5) + else + user << "There are not enough telecrystals to do that." /obj/item/stack/telecrystal/attack_self(mob/user as mob) if(user.mind.accept_tcrystals) //Checks to see if antag type allows for tcrystals diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 7710cec5f6d..7b8042c8c18 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -538,8 +538,8 @@ icon_state = "botanist" /obj/item/toy/figure/captain - name = "Captain action figure" - desc = "A \"Space Life\" brand Captain action figure." + name = "Station Administrator action figure" + desc = "A \"Space Life\" brand Station Administrator action figure." icon_state = "captain" /obj/item/toy/figure/cargotech diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index 61c6668c33a..3cbc75bfeb3 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -86,7 +86,7 @@ var/scan_data = "" if(timeofdeath) - scan_data += "Time of death: [worldtime2text(timeofdeath)]

              " + scan_data += "Time of death: [worldtime2stationtime(timeofdeath)]

              " var/n = 1 for(var/wdata_idx in wdata) @@ -133,7 +133,7 @@ if(damaging_weapon) scan_data += "Severity: [damage_desc]
              " scan_data += "Hits by weapon: [total_hits]
              " - scan_data += "Approximate time of wound infliction: [worldtime2text(age)]
              " + scan_data += "Approximate time of wound infliction: [worldtime2stationtime(age)]
              " scan_data += "Affected limbs: [D.organ_names]
              " scan_data += "Possible weapons:
              " for(var/weapon_name in weapon_chances) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 743175a21b7..214476ec12b 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -113,7 +113,7 @@ var/access = list() var/registered_name = "Unknown" // The name registered_name on the card - slot_flags = SLOT_ID + slot_flags = SLOT_ID | SLOT_EARS var/age = "\[UNSET\]" var/blood_type = "\[UNSET\]" @@ -233,12 +233,12 @@ access = list(access_syndicate, access_external_airlocks) /obj/item/weapon/card/id/captains_spare - name = "captain's spare ID" + name = "station administrator's spare ID" desc = "The spare ID of the High Lord himself." icon_state = "gold" item_state = "gold_id" - registered_name = "Captain" - assignment = "Captain" + registered_name = "Station Administrator" + assignment = "Station Administrator" /obj/item/weapon/card/id/captains_spare/New() access = get_all_station_access() ..() diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index b2c9e82e279..f201fbb3c6b 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -116,6 +116,23 @@ CIGARETTE PACKETS ARE IN FANCY.DM else // else just remove some of the reagents reagents.remove_any(REM) +/obj/item/clothing/mask/smokable/examine(mob/user) + ..() + if(lit == 1) + var/smoke_percent = round((smoketime / initial(smoketime)) * 100) + switch(smoke_percent) + if(90 to INFINITY) + user << "[src] has just begun to burn." + if(60 to 90) + user << "[src] has a good amount of burn time remaining." + if(30 to 60) + user << "[src] is about half finished." + if(10 to 30) + user << "[src] is starting to burn low." + else + user << "[src] is nearly burnt out!" + + /obj/item/clothing/mask/smokable/proc/light(var/flavor_text = "[usr] lights the [name].") if(!src.lit) src.lit = 1 @@ -321,7 +338,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM ///////////////// /obj/item/clothing/mask/smokable/pipe name = "smoking pipe" - desc = "A pipe, for smoking. Probably made of meershaum or something." + desc = "A pipe, for smoking. Made of fine, stained cherry wood." icon_state = "pipeoff" item_state = "pipeoff" icon_on = "pipeon" //Note - these are in masks.dmi @@ -484,6 +501,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(lit == 1) M.IgniteMob() + msg_admin_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] and lit them on fire (INTENT: [uppertext(user.a_intent)]) (JMP)") if(istype(M.wear_mask, /obj/item/clothing/mask/smokable/cigarette) && user.zone_sel.selecting == O_MOUTH && lit) var/obj/item/clothing/mask/smokable/cigarette/cig = M.wear_mask diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index fd30153c37a..3711cf0690f 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -19,19 +19,19 @@ throw_speed = 3 throw_range = 15 var/build_path = null - var/board_type = "computer" + var/board_type = new /datum/frame/frame_types/computer var/list/req_components = null var/contain_parts = 1 //Called when the circuitboard is used to contruct a new machine. /obj/item/weapon/circuitboard/proc/construct(var/obj/machinery/M) - if (istype(M, build_path)) + if(istype(M, build_path)) return 1 return 0 //Called when a computer is deconstructed to produce a circuitboard. //Only used by computers, as other machines store their circuitboard instance. /obj/item/weapon/circuitboard/proc/deconstruct(var/obj/machinery/M) - if (istype(M, build_path)) + if(istype(M, build_path)) return 1 return 0 diff --git a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm index 0016fc730ab..c46c519e9e6 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm @@ -32,7 +32,7 @@ /obj/item/weapon/circuitboard/security/telescreen/entertainment name = T_BOARD("entertainment camera monitor") build_path = /obj/machinery/computer/security/telescreen/entertainment - board_type = "display" + board_type = new /datum/frame/frame_types/display matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /obj/item/weapon/circuitboard/security/telescreen/entertainment/New() diff --git a/code/game/objects/items/weapons/circuitboards/computer/research.dm b/code/game/objects/items/weapons/circuitboards/computer/research.dm index 7695913eede..f49b80e6df7 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/research.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/research.dm @@ -1,5 +1,5 @@ #ifndef T_BOARD -#error T_BOARD macro is not defined but we need it! +#error T_BOARD macro is not defined but we need it! #endif /obj/item/weapon/circuitboard/rdconsole @@ -9,12 +9,12 @@ /obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob) if(istype(I,/obj/item/weapon/screwdriver)) user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.") - if(src.build_path == /obj/machinery/computer/rdconsole/core) - src.name = T_BOARD("RD Console - Robotics") - src.build_path = /obj/machinery/computer/rdconsole/robotics + if(build_path == /obj/machinery/computer/rdconsole/core) + name = T_BOARD("RD Console - Robotics") + build_path = /obj/machinery/computer/rdconsole/robotics user << "Access protocols set to robotics." else - src.name = T_BOARD("RD Console") - src.build_path = /obj/machinery/computer/rdconsole/core + name = T_BOARD("RD Console") + build_path = /obj/machinery/computer/rdconsole/core user << "Access protocols set to default." - return + return \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm index 3acb2de7558..fa48be65bbf 100644 --- a/code/game/objects/items/weapons/circuitboards/frame.dm +++ b/code/game/objects/items/weapons/circuitboards/frame.dm @@ -9,37 +9,37 @@ /obj/item/weapon/circuitboard/guestpass name = T_BOARD("guestpass console") build_path = /obj/machinery/computer/guestpass - board_type = "guestpass" + board_type = new /datum/frame/frame_types/guest_pass_console matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /obj/item/weapon/circuitboard/status_display name = T_BOARD("status display") build_path = /obj/machinery/status_display - board_type = "display" + board_type = new /datum/frame/frame_types/display matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /obj/item/weapon/circuitboard/ai_status_display name = T_BOARD("ai status display") build_path = /obj/machinery/ai_status_display - board_type = "display" + board_type = new /datum/frame/frame_types/display matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /obj/item/weapon/circuitboard/newscaster name = T_BOARD("newscaster") build_path = /obj/machinery/newscaster - board_type = "newscaster" + board_type = new /datum/frame/frame_types/newscaster matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /obj/item/weapon/circuitboard/atm name = T_BOARD("atm") build_path = /obj/machinery/atm - board_type = "atm" + board_type = new /datum/frame/frame_types/atm matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /obj/item/weapon/circuitboard/request name = T_BOARD("reques console") build_path = /obj/machinery/requests_console - board_type = "request" + board_type = new /datum/frame/frame_types/supply_request_console matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) //Alarm @@ -47,25 +47,25 @@ /obj/item/weapon/circuitboard/firealarm name = T_BOARD("fire alarm") build_path = /obj/machinery/firealarm - board_type = "firealarm" + board_type = new /datum/frame/frame_types/fire_alarm matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /obj/item/weapon/circuitboard/airalarm name = T_BOARD("air alarm") build_path = /obj/machinery/alarm - board_type = "airalarm" + board_type = new /datum/frame/frame_types/air_alarm matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /obj/item/weapon/circuitboard/intercom name = T_BOARD("intercom") build_path = /obj/item/device/radio/intercom - board_type = "intercom" + board_type = new /datum/frame/frame_types/intercom matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /obj/item/weapon/circuitboard/keycard_auth name = T_BOARD("keycard authenticator") build_path = /obj/machinery/keycard_auth - board_type = "keycard" + board_type = new /datum/frame/frame_types/keycard_authenticator matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) //Computer @@ -73,19 +73,19 @@ /obj/item/weapon/circuitboard/holopad name = T_BOARD("holopad") build_path = /obj/machinery/hologram/holopad - board_type = "holopad" + board_type = new /datum/frame/frame_types/holopad matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) /obj/item/weapon/circuitboard/scanner_console name = T_BOARD("body scanner console") build_path = /obj/machinery/body_scanconsole - board_type = "console" + board_type = new /datum/frame/frame_types/medical_console origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) /obj/item/weapon/circuitboard/sleeper_console name = T_BOARD("sleeper console") build_path = /obj/machinery/sleep_console - board_type = "console" + board_type = new /datum/frame/frame_types/medical_console origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) //Machine @@ -93,7 +93,7 @@ /obj/item/weapon/circuitboard/photocopier name = T_BOARD("photocopier") build_path = /obj/machinery/photocopier - board_type = "photocopier" + board_type = new /datum/frame/frame_types/photocopier matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, @@ -104,7 +104,7 @@ /obj/item/weapon/circuitboard/fax name = T_BOARD("fax") build_path = /obj/machinery/photocopier/faxmachine - board_type = "fax" + board_type = new /datum/frame/frame_types/fax matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, @@ -115,7 +115,7 @@ /obj/item/weapon/circuitboard/conveyor name = T_BOARD("conveyor") build_path = /obj/machinery/conveyor - board_type = "conveyor" + board_type = new /datum/frame/frame_types/conveyor req_components = list( /obj/item/weapon/stock_parts/gear = 2, /obj/item/weapon/stock_parts/motor = 2, @@ -124,7 +124,7 @@ /obj/item/weapon/circuitboard/microwave name = T_BOARD("microwave") build_path = /obj/machinery/microwave - board_type = "microwave" + board_type = new /datum/frame/frame_types/microwave matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) req_components = list( /obj/item/weapon/stock_parts/console_screen = 1, @@ -134,7 +134,7 @@ /obj/item/weapon/circuitboard/recharger name = T_BOARD("recharger") build_path = /obj/machinery/recharger - board_type = "recharger" + board_type = new /datum/frame/frame_types/recharger req_components = list( /obj/item/weapon/stock_parts/capacitor = 1, /obj/item/stack/cable_coil = 5) @@ -142,12 +142,12 @@ /obj/item/weapon/circuitboard/recharger/wrecharger name = T_BOARD("wall recharger") build_path = /obj/machinery/recharger/wallcharger - board_type = "wrecharger" + board_type = new /datum/frame/frame_types/wall_charger /obj/item/weapon/circuitboard/washing name = T_BOARD("washing machine") build_path = /obj/machinery/washing_machine - board_type = "washing" + board_type = new /datum/frame/frame_types/washing_machine matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) req_components = list( /obj/item/weapon/stock_parts/motor = 1, @@ -156,7 +156,7 @@ /obj/item/weapon/circuitboard/grinder name = T_BOARD("reagent grinder") build_path = /obj/machinery/reagentgrinder - board_type = "grinder" + board_type = new /datum/frame/frame_types/grinder req_components = list( /obj/item/weapon/stock_parts/motor = 1, /obj/item/weapon/stock_parts/gear = 1, @@ -185,7 +185,7 @@ /obj/item/weapon/circuitboard/body_scanner name = T_BOARD("body scanner") build_path = /obj/machinery/bodyscanner - board_type = "medpod" + board_type = new /datum/frame/frame_types/medical_pod origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 3, @@ -194,7 +194,7 @@ /obj/item/weapon/circuitboard/sleeper name = T_BOARD("sleeper") build_path = /obj/machinery/sleeper - board_type = "medpod" + board_type = new /datum/frame/frame_types/medical_pod origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, @@ -205,7 +205,7 @@ /obj/item/weapon/circuitboard/dna_analyzer name = T_BOARD("dna analyzer") build_path = /obj/machinery/dnaforensics - board_type = "dna_analyzer" + board_type = new /datum/frame/frame_types/dna_analyzer origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2, TECH_DATA = 2) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 2, @@ -215,104 +215,10 @@ /obj/item/weapon/circuitboard/mass_driver name = T_BOARD("mass driver") build_path = /obj/machinery/mass_driver - board_type = "massdriver" + board_type = new /datum/frame/frame_types/mass_driver req_components = list( /obj/item/weapon/stock_parts/gear = 2, /obj/item/weapon/stock_parts/motor = 2, /obj/item/weapon/stock_parts/capacitor = 1, /obj/item/weapon/stock_parts/spring = 1, - /obj/item/stack/cable_coil = 5) - -//for testing - If this is still in when I commit, someone shoot me. --leaving in for now, shouldn't be able to get these on station anyways. -/obj/item/weapon/storage/box/frame_parts - display_contents_with_number = 1 - New() - ..() - new /obj/item/weapon/circuitboard/guestpass( src ) - new /obj/item/weapon/circuitboard/status_display( src ) - new /obj/item/weapon/circuitboard/ai_status_display( src ) - new /obj/item/weapon/circuitboard/newscaster( src ) - new /obj/item/weapon/circuitboard/atm( src ) - new /obj/item/weapon/circuitboard/firealarm( src ) - new /obj/item/weapon/circuitboard/airalarm( src ) - new /obj/item/weapon/circuitboard/intercom( src ) - new /obj/item/weapon/circuitboard/keycard_auth( src ) - new /obj/item/weapon/circuitboard/holopad( src ) - new /obj/item/weapon/circuitboard/photocopier( src ) - new /obj/item/weapon/circuitboard/fax( src ) - new /obj/item/weapon/circuitboard/microwave( src ) - new /obj/item/weapon/circuitboard/washing( src ) - new /obj/item/weapon/stock_parts/scanning_module( src ) - new /obj/item/weapon/stock_parts/motor( src ) - new /obj/item/weapon/stock_parts/micro_laser( src ) - new /obj/item/weapon/stock_parts/matter_bin( src ) - new /obj/item/weapon/stock_parts/gear( src ) - new /obj/item/weapon/stock_parts/console_screen( src ) - new /obj/item/weapon/stock_parts/capacitor( src ) - new /obj/item/weapon/stock_parts/spring( src ) - new /obj/item/weapon/stock_parts/scanning_module( src ) - new /obj/item/weapon/stock_parts/motor( src ) - new /obj/item/weapon/stock_parts/micro_laser( src ) - new /obj/item/weapon/stock_parts/matter_bin( src ) - new /obj/item/weapon/stock_parts/gear( src ) - new /obj/item/weapon/stock_parts/console_screen( src ) - new /obj/item/weapon/stock_parts/capacitor( src ) - new /obj/item/weapon/stock_parts/spring( src ) - new /obj/item/weapon/stock_parts/scanning_module( src ) - new /obj/item/weapon/stock_parts/motor( src ) - new /obj/item/weapon/stock_parts/micro_laser( src ) - new /obj/item/weapon/stock_parts/matter_bin( src ) - new /obj/item/weapon/stock_parts/gear( src ) - new /obj/item/weapon/stock_parts/console_screen( src ) - new /obj/item/weapon/stock_parts/capacitor( src ) - new /obj/item/weapon/stock_parts/spring( src ) - new /obj/item/weapon/stock_parts/scanning_module( src ) - new /obj/item/weapon/stock_parts/motor( src ) - new /obj/item/weapon/stock_parts/micro_laser( src ) - new /obj/item/weapon/stock_parts/matter_bin( src ) - new /obj/item/weapon/stock_parts/gear( src ) - new /obj/item/weapon/stock_parts/console_screen( src ) - new /obj/item/weapon/stock_parts/capacitor( src ) - new /obj/item/weapon/stock_parts/spring( src ) - new /obj/item/weapon/stock_parts/scanning_module( src ) - new /obj/item/weapon/stock_parts/motor( src ) - new /obj/item/weapon/stock_parts/micro_laser( src ) - new /obj/item/weapon/stock_parts/matter_bin( src ) - new /obj/item/weapon/stock_parts/gear( src ) - new /obj/item/weapon/stock_parts/console_screen( src ) - new /obj/item/weapon/stock_parts/capacitor( src ) - new /obj/item/weapon/stock_parts/spring( src ) - new /obj/item/weapon/stock_parts/scanning_module( src ) - new /obj/item/weapon/stock_parts/motor( src ) - new /obj/item/weapon/stock_parts/micro_laser( src ) - new /obj/item/weapon/stock_parts/matter_bin( src ) - new /obj/item/weapon/stock_parts/gear( src ) - new /obj/item/weapon/stock_parts/console_screen( src ) - new /obj/item/weapon/stock_parts/capacitor( src ) - new /obj/item/weapon/stock_parts/spring( src ) - new /obj/item/weapon/stock_parts/scanning_module( src ) - new /obj/item/weapon/stock_parts/motor( src ) - new /obj/item/weapon/stock_parts/micro_laser( src ) - new /obj/item/weapon/stock_parts/matter_bin( src ) - new /obj/item/weapon/stock_parts/gear( src ) - new /obj/item/weapon/stock_parts/console_screen( src ) - new /obj/item/weapon/stock_parts/capacitor( src ) - new /obj/item/weapon/stock_parts/spring( src ) - new /obj/item/weapon/stock_parts/scanning_module( src ) - new /obj/item/weapon/stock_parts/motor( src ) - new /obj/item/weapon/stock_parts/micro_laser( src ) - new /obj/item/weapon/stock_parts/matter_bin( src ) - new /obj/item/weapon/stock_parts/gear( src ) - new /obj/item/weapon/stock_parts/console_screen( src ) - new /obj/item/weapon/stock_parts/capacitor( src ) - new /obj/item/weapon/stock_parts/spring( src ) - new /obj/item/weapon/stock_parts/scanning_module( src ) - new /obj/item/weapon/stock_parts/motor( src ) - new /obj/item/weapon/stock_parts/micro_laser( src ) - new /obj/item/weapon/stock_parts/matter_bin( src ) - new /obj/item/weapon/stock_parts/gear( src ) - new /obj/item/weapon/stock_parts/console_screen( src ) - new /obj/item/weapon/stock_parts/capacitor( src ) - new /obj/item/weapon/stock_parts/spring( src ) - new /obj/item/stack/cable_coil( src , 5 ) - new /obj/item/stack/material/glass/reinforced( src , 2 ) \ No newline at end of file + /obj/item/stack/cable_coil = 5) \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm index 716e763515c..c32b93484e0 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm @@ -4,8 +4,8 @@ /obj/item/weapon/circuitboard/biogenerator name = T_BOARD("biogenerator") - build_path = "/obj/machinery/biogenerator" - board_type = "machine" + build_path = /obj/machinery/biogenerator + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 2) req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm index a1edb3f4646..ffca070fe9d 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm @@ -4,8 +4,8 @@ /obj/item/weapon/circuitboard/clonepod name = T_BOARD("clone pod") - build_path = "/obj/machinery/clonepod" - board_type = "machine" + build_path = /obj/machinery/clonepod + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 3, TECH_BIO = 3) req_components = list( /obj/item/stack/cable_coil = 2, @@ -15,8 +15,8 @@ /obj/item/weapon/circuitboard/clonescanner name = T_BOARD("cloning scanner") - build_path = "/obj/machinery/dna_scannernew" - board_type = "machine" + build_path = /obj/machinery/dna_scannernew + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 2, TECH_BIO = 2) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/jukebox.dm b/code/game/objects/items/weapons/circuitboards/machinery/jukebox.dm index 4b6296c886c..ab3ae6f3843 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/jukebox.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/jukebox.dm @@ -4,8 +4,8 @@ /obj/item/weapon/circuitboard/jukebox name = T_BOARD("jukebox") - build_path = "/obj/machinery/media/jukebox" - board_type = "machine" + build_path = /obj/machinery/media/jukebox + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_MAGNET = 2, TECH_DATA = 1) req_components = list( /obj/item/weapon/stock_parts/capacitor = 1, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm b/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm index 4515bfd74bc..01d5f0933c8 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm @@ -4,8 +4,8 @@ /obj/item/weapon/circuitboard/mech_recharger name = T_BOARD("mech recharger") - build_path = "/obj/machinery/mech_recharger" - board_type = "machine" + build_path = /obj/machinery/mech_recharger + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 2, TECH_POWER = 2, TECH_ENGINEERING = 2) req_components = list( /obj/item/weapon/stock_parts/capacitor = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm index 653d20d6669..82217a1b8fa 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm @@ -4,8 +4,8 @@ /obj/item/weapon/circuitboard/miningdrill name = T_BOARD("mining drill head") - build_path = "/obj/machinery/mining/drill" - board_type = "machine" + build_path = /obj/machinery/mining/drill + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) req_components = list( /obj/item/weapon/stock_parts/capacitor = 1, @@ -15,7 +15,7 @@ /obj/item/weapon/circuitboard/miningdrillbrace name = T_BOARD("mining drill brace") - build_path = "/obj/machinery/mining/brace" - board_type = "machine" + build_path = /obj/machinery/mining/brace + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1) req_components = list() diff --git a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm b/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm index a5cd69b0f4a..218ffd924ad 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm @@ -4,8 +4,8 @@ /obj/item/weapon/circuitboard/pacman name = T_BOARD("PACMAN-type generator") - build_path = "/obj/machinery/power/port_gen/pacman" - board_type = "machine" + build_path = /obj/machinery/power/port_gen/pacman + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 3, TECH_POWER = 3, TECH_PHORON = 3, TECH_ENGINEERING = 3) req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, @@ -15,10 +15,10 @@ /obj/item/weapon/circuitboard/pacman/super name = T_BOARD("SUPERPACMAN-type generator") - build_path = "/obj/machinery/power/port_gen/pacman/super" + build_path = /obj/machinery/power/port_gen/pacman/super origin_tech = list(TECH_DATA = 3, TECH_POWER = 4, TECH_ENGINEERING = 4) /obj/item/weapon/circuitboard/pacman/mrs name = T_BOARD("MRSPACMAN-type generator") - build_path = "/obj/machinery/power/port_gen/pacman/mrs" + build_path = /obj/machinery/power/port_gen/pacman/mrs origin_tech = list(TECH_DATA = 3, TECH_POWER = 5, TECH_ENGINEERING = 5) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/power.dm b/code/game/objects/items/weapons/circuitboards/machinery/power.dm index 5c8975a207f..6e5667ebe5a 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/power.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/power.dm @@ -4,21 +4,21 @@ /obj/item/weapon/circuitboard/smes name = T_BOARD("superconductive magnetic energy storage") - build_path = "/obj/machinery/power/smes/buildable" - board_type = "machine" + build_path = /obj/machinery/power/smes/buildable + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_POWER = 6, TECH_ENGINEERING = 4) req_components = list(/obj/item/weapon/smes_coil = 1, /obj/item/stack/cable_coil = 30) /obj/item/weapon/circuitboard/batteryrack name = T_BOARD("battery rack PSU") - build_path = "/obj/machinery/power/smes/batteryrack" - board_type = "machine" + build_path = /obj/machinery/power/smes/batteryrack + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 2) req_components = list(/obj/item/weapon/cell = 3) /obj/item/weapon/circuitboard/ghettosmes name = T_BOARD("makeshift PSU") desc = "An APC circuit repurposed into some power storage device controller" - build_path = "/obj/machinery/power/smes/batteryrack/makeshift" - board_type = "machine" + build_path = /obj/machinery/power/smes/batteryrack/makeshift + board_type = new /datum/frame/frame_types/machine req_components = list(/obj/item/weapon/cell = 3) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm index a3684cd894c..f45549bab64 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm @@ -4,8 +4,8 @@ /obj/item/weapon/circuitboard/recharge_station name = T_BOARD("cyborg recharging station") - build_path = "/obj/machinery/recharge_station" - board_type = "machine" + build_path = /obj/machinery/recharge_station + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) req_components = list( /obj/item/stack/cable_coil = 5, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index c871bd3dc51..1e4fe2afd94 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -4,17 +4,30 @@ obj/item/weapon/circuitboard/rdserver name = T_BOARD("R&D server") - build_path = "/obj/machinery/r_n_d/server" - board_type = "machine" + build_path = /obj/machinery/r_n_d/server/core + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 3) req_components = list( /obj/item/stack/cable_coil = 2, /obj/item/weapon/stock_parts/scanning_module = 1) +obj/item/weapon/circuitboard/rdserver/attackby(obj/item/I as obj, mob/user as mob) + if(istype(I,/obj/item/weapon/screwdriver)) + user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.") + if(build_path == /obj/machinery/r_n_d/server/core) + name = T_BOARD("RD Console - Robotics") + build_path = /obj/machinery/r_n_d/server/robotics + user << "Access protocols set to robotics." + else + name = T_BOARD("RD Console") + build_path = /obj/machinery/r_n_d/server/core + user << "Access protocols set to default." + return + /obj/item/weapon/circuitboard/destructive_analyzer name = T_BOARD("destructive analyzer") - build_path = "/obj/machinery/r_n_d/destructive_analyzer" - board_type = "machine" + build_path = /obj/machinery/r_n_d/destructive_analyzer + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_DATA = 2) req_components = list( /obj/item/weapon/stock_parts/scanning_module = 1, @@ -23,8 +36,8 @@ obj/item/weapon/circuitboard/rdserver /obj/item/weapon/circuitboard/autolathe name = T_BOARD("autolathe") - build_path = "/obj/machinery/autolathe" - board_type = "machine" + build_path = /obj/machinery/autolathe + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2) req_components = list( /obj/item/weapon/stock_parts/matter_bin = 3, @@ -33,8 +46,8 @@ obj/item/weapon/circuitboard/rdserver /obj/item/weapon/circuitboard/protolathe name = T_BOARD("protolathe") - build_path = "/obj/machinery/r_n_d/protolathe" - board_type = "machine" + build_path = /obj/machinery/r_n_d/protolathe + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2) req_components = list( /obj/item/weapon/stock_parts/matter_bin = 2, @@ -43,8 +56,8 @@ obj/item/weapon/circuitboard/rdserver /obj/item/weapon/circuitboard/circuit_imprinter name = T_BOARD("circuit imprinter") - build_path = "/obj/machinery/r_n_d/circuit_imprinter" - board_type = "machine" + build_path = /obj/machinery/r_n_d/circuit_imprinter + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2) req_components = list( /obj/item/weapon/stock_parts/matter_bin = 1, @@ -53,8 +66,8 @@ obj/item/weapon/circuitboard/rdserver /obj/item/weapon/circuitboard/mechfab name = "Circuit board (Exosuit Fabricator)" - build_path = "/obj/machinery/mecha_part_fabricator" - board_type = "machine" + build_path = /obj/machinery/mecha_part_fabricator + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) req_components = list( /obj/item/weapon/stock_parts/matter_bin = 2, @@ -64,8 +77,8 @@ obj/item/weapon/circuitboard/rdserver /obj/item/weapon/circuitboard/prosthetics name = "Circuit board (Prosthetics Fabricator)" - build_path = "/obj/machinery/pros_fabricator" - board_type = "machine" + build_path = /obj/machinery/pros_fabricator + board_type = new /datum/frame/frame_types/machine origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3) req_components = list( /obj/item/weapon/stock_parts/matter_bin = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm index 7218b7f094d..1d806a2710d 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm @@ -4,8 +4,8 @@ /obj/item/weapon/circuitboard/shield_gen_ex name = T_BOARD("hull shield generator") - board_type = "machine" - build_path = "/obj/machinery/shield_gen/external" + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/shield_gen/external origin_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3) req_components = list( /obj/item/weapon/stock_parts/manipulator/pico = 2, @@ -17,8 +17,8 @@ /obj/item/weapon/circuitboard/shield_gen name = T_BOARD("bubble shield generator") - board_type = "machine" - build_path = "/obj/machinery/shield_gen" + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/shield_gen origin_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3) req_components = list( /obj/item/weapon/stock_parts/manipulator/pico = 2, @@ -30,8 +30,8 @@ /obj/item/weapon/circuitboard/shield_cap name = T_BOARD("shield capacitor") - board_type = "machine" - build_path = "/obj/machinery/shield_capacitor" + board_type = new /datum/frame/frame_types/machine + build_path = /obj/machinery/shield_capacitor origin_tech = list(TECH_MAGNET = 3, TECH_POWER = 4) req_components = list( /obj/item/weapon/stock_parts/manipulator/pico = 2, diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm index 8a7516f476d..835971b0129 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm @@ -3,11 +3,11 @@ #endif /obj/item/weapon/circuitboard/telecomms - board_type = "machine" + board_type = new /datum/frame/frame_types/machine /obj/item/weapon/circuitboard/telecomms/receiver name = T_BOARD("subspace receiver") - build_path = "/obj/machinery/telecomms/receiver" + build_path = /obj/machinery/telecomms/receiver origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2) req_components = list( /obj/item/weapon/stock_parts/subspace/ansible = 1, @@ -17,7 +17,7 @@ /obj/item/weapon/circuitboard/telecomms/hub name = T_BOARD("hub mainframe") - build_path = "/obj/machinery/telecomms/hub" + build_path = /obj/machinery/telecomms/hub origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) req_components = list( /obj/item/weapon/stock_parts/manipulator = 2, @@ -26,7 +26,7 @@ /obj/item/weapon/circuitboard/telecomms/relay name = T_BOARD("relay mainframe") - build_path = "/obj/machinery/telecomms/relay" + build_path = /obj/machinery/telecomms/relay origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 4, TECH_BLUESPACE = 3) req_components = list( /obj/item/weapon/stock_parts/manipulator = 2, @@ -35,7 +35,7 @@ /obj/item/weapon/circuitboard/telecomms/bus name = T_BOARD("bus mainframe") - build_path = "/obj/machinery/telecomms/bus" + build_path = /obj/machinery/telecomms/bus origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) req_components = list( /obj/item/weapon/stock_parts/manipulator = 2, @@ -44,7 +44,7 @@ /obj/item/weapon/circuitboard/telecomms/processor name = T_BOARD("processor unit") - build_path = "/obj/machinery/telecomms/processor" + build_path = /obj/machinery/telecomms/processor origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) req_components = list( /obj/item/weapon/stock_parts/manipulator = 3, @@ -56,7 +56,7 @@ /obj/item/weapon/circuitboard/telecomms/server name = T_BOARD("telecommunication server") - build_path = "/obj/machinery/telecomms/server" + build_path = /obj/machinery/telecomms/server origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4) req_components = list( /obj/item/weapon/stock_parts/manipulator = 2, @@ -65,7 +65,7 @@ /obj/item/weapon/circuitboard/telecomms/broadcaster name = T_BOARD("subspace broadcaster") - build_path = "/obj/machinery/telecomms/broadcaster" + build_path = /obj/machinery/telecomms/broadcaster origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_BLUESPACE = 2) req_components = list( /obj/item/weapon/stock_parts/manipulator = 2, @@ -77,7 +77,7 @@ //This isn't a real telecomms board but I don't want to make a whole file to hold only one circuitboard. /obj/item/weapon/circuitboard/telecomms/exonet_node name = T_BOARD("exonet node") - build_path = "/obj/machinery/exonet_node" + build_path = /obj/machinery/exonet_node origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4) req_components = list( /obj/item/weapon/stock_parts/subspace/ansible = 1, @@ -90,11 +90,11 @@ /obj/item/weapon/circuitboard/telecomms/pda_multicaster name = T_BOARD("pda multicaster") - build_path = "/obj/machinery/pda_multicaster" + build_path = /obj/machinery/pda_multicaster origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 2, TECH_BLUESPACE = 2) req_components = list( /obj/item/weapon/stock_parts/subspace/ansible = 1, /obj/item/weapon/stock_parts/subspace/filter = 1, /obj/item/weapon/stock_parts/manipulator = 1, /obj/item/weapon/stock_parts/subspace/treatment = 1, - /obj/item/stack/cable_coil = 2) + /obj/item/stack/cable_coil = 2) \ No newline at end of file diff --git a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm index 38438d6327a..07e9ae53dd5 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm @@ -3,7 +3,7 @@ #endif /obj/item/weapon/circuitboard/unary_atmos - board_type = "machine" + board_type = new /datum/frame/frame_types/machine /obj/item/weapon/circuitboard/unary_atmos/construct(var/obj/machinery/atmospherics/unary/U) //TODO: Move this stuff into the relevant constructor when pipe/construction.dm is cleaned up. @@ -15,7 +15,7 @@ /obj/item/weapon/circuitboard/unary_atmos/heater name = T_BOARD("gas heating system") - build_path = "/obj/machinery/atmospherics/unary/heater" + build_path = /obj/machinery/atmospherics/unary/heater origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 1) req_components = list( /obj/item/stack/cable_coil = 5, @@ -24,7 +24,7 @@ /obj/item/weapon/circuitboard/unary_atmos/cooler name = T_BOARD("gas cooling system") - build_path = "/obj/machinery/atmospherics/unary/freezer" + build_path = /obj/machinery/atmospherics/unary/freezer origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2) req_components = list( /obj/item/stack/cable_coil = 2, diff --git a/code/game/objects/items/weapons/circuitboards/mecha.dm b/code/game/objects/items/weapons/circuitboards/mecha.dm index 0ce851e3a38..ac4d83d98c2 100644 --- a/code/game/objects/items/weapons/circuitboards/mecha.dm +++ b/code/game/objects/items/weapons/circuitboards/mecha.dm @@ -10,7 +10,6 @@ item_state = "electronic" board_type = "other" - /obj/item/weapon/circuitboard/mecha/ripley origin_tech = list(TECH_DATA = 3) @@ -22,7 +21,6 @@ name = T_BOARD_MECHA("Ripley central control") icon_state = "mainboard" - /obj/item/weapon/circuitboard/mecha/gygax origin_tech = list(TECH_DATA = 4) @@ -39,7 +37,6 @@ name = T_BOARD_MECHA("Gygax central control") icon_state = "mainboard" - /obj/item/weapon/circuitboard/mecha/durand origin_tech = list(TECH_DATA = 4) @@ -56,7 +53,6 @@ name = T_BOARD_MECHA("Durand central control") icon_state = "mainboard" - /obj/item/weapon/circuitboard/mecha/honker origin_tech = list(TECH_DATA = 4) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index c23af3192be..db630d8fadc 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -9,7 +9,6 @@ var/colour = "red" var/open = 0 - /obj/item/weapon/lipstick/purple name = "purple lipstick" colour = "purple" @@ -22,7 +21,6 @@ name = "black lipstick" colour = "black" - /obj/item/weapon/lipstick/random name = "lipstick" @@ -30,7 +28,6 @@ colour = pick("red","purple","jade","black") name = "[colour] lipstick" - /obj/item/weapon/lipstick/attack_self(mob/user as mob) user << "You twist \the [src] [open ? "closed" : "open"]." open = !open @@ -67,7 +64,6 @@ //you can wipe off lipstick with paper! see code/modules/paperwork/paper.dm, paper/attack() - /obj/item/weapon/haircomb //sparklysheep's comb name = "purple comb" desc = "A pristine purple comb made from flexible plastic." @@ -77,4 +73,18 @@ icon_state = "purplecomb" /obj/item/weapon/haircomb/attack_self(mob/living/user) - user.visible_message(text("[] uses [] to comb their hair with incredible style and sophistication. What a [].", user, src, user.gender == FEMALE ? "lady" : "guy")) + var/text = "person" + if(ishuman(user)) + var/mob/living/carbon/human/U = user + switch(U.identifying_gender) + if(MALE) + text = "guy" + if(FEMALE) + text = "lady" + else + switch(user.gender) + if(MALE) + text = "guy" + if(FEMALE) + text = "lady" + user.visible_message("[user] uses [src] to comb their hair with incredible style and sophistication. What a [text].") \ No newline at end of file diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index 24f6ad53b39..ba60bfc361b 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -160,7 +160,7 @@ /obj/item/weapon/dnainjector/xraymut name = "\improper DNA injector (Xray)" - desc = "Finally you can see what the Captain does." + desc = "Finally you can see what the Station Administrator does." datatype = DNA2_BUF_SE value = 0xFFF //block = 8 diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 2a85fbdfc9e..6e323d7387f 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -7,10 +7,10 @@ hitsound = 'sound/weapons/smash.ogg' flags = CONDUCT throwforce = 10 - w_class = 3.0 + w_class = 3 throw_speed = 2 throw_range = 10 - force = 10.0 + force = 10 matter = list(DEFAULT_WALL_MATERIAL = 90) attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index a38c66333c7..0236297d221 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -92,7 +92,7 @@ M.update_icons() /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 captain." + desc = "Use of this weapon may constiute a war crime in your area, consult your local Station Administrator." name = "clusterbang" icon = 'icons/obj/grenade.dmi' icon_state = "clusterbang" diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 8668794082d..8c1e3f5df14 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -997,7 +997,7 @@ Remember the order:
              Disk, Code, Safety, Timer, Disk, RUN!

              - Intelligence Analysts believe that normal corporate procedure is for the Captain to secure the nuclear authentication disk.

              + Intelligence Analysts believe that normal corporate procedure is for the Station Administrator to secure the nuclear authentication disk.

              Good luck! diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index f4b763c5e91..d957c049b5e 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -8,8 +8,8 @@ sharp = 1 edge = 1 w_class = 2 - force_divisor = 0.2 // 6 with hardness 30 (glass) - thrown_force_divisor = 0.4 // 4 with weight 15 (glass) + force_divisor = 0.25 // 7.5 with hardness 30 (glass) + thrown_force_divisor = 0.5 item_state = "shard-glass" attack_verb = list("stabbed", "slashed", "sliced", "cut") default_material = "glass" @@ -87,7 +87,7 @@ if(affecting) if(affecting.robotic >= ORGAN_ROBOT) return - if(affecting.take_damage(5, 0)) + if(affecting.take_damage(force, 0)) H.UpdateDamageIcon() H.updatehealth() if(affecting.can_feel_pain()) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 97fea878ea9..69207191e7b 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -92,7 +92,7 @@ icon_state = "securitypack" /obj/item/weapon/storage/backpack/captain - name = "captain's backpack" + name = "station administrator's backpack" desc = "It's a special backpack made exclusively for officers." icon_state = "captainpack" @@ -154,7 +154,7 @@ icon_state = "duffle_syndieammo" /obj/item/weapon/storage/backpack/dufflebag/captain - name = "captain's dufflebag" + name = "station administrator's dufflebag" desc = "A large dufflebag for holding extra captainly goods." icon_state = "duffle_captain" @@ -214,25 +214,25 @@ name = "virologist satchel" desc = "A sterile satchel with virologist colours." icon_state = "satchel-vir" - item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") + item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack") /obj/item/weapon/storage/backpack/satchel/chem name = "chemist satchel" desc = "A sterile satchel with chemist colours." icon_state = "satchel-chem" - item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") + item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack") /obj/item/weapon/storage/backpack/satchel/gen name = "geneticist satchel" desc = "A sterile satchel with geneticist colours." icon_state = "satchel-gen" - item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") + item_state_slots = list(slot_r_hand_str = "genpack", slot_l_hand_str = "genpack") /obj/item/weapon/storage/backpack/satchel/tox name = "scientist satchel" desc = "Useful for holding research materials." icon_state = "satchel-tox" - item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") + item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack") /obj/item/weapon/storage/backpack/satchel/sec name = "security satchel" @@ -246,7 +246,7 @@ icon_state = "satchel_hyd" /obj/item/weapon/storage/backpack/satchel/cap - name = "captain's satchel" + name = "station administrator's satchel" desc = "An exclusive satchel for officers." icon_state = "satchel-cap" item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack") diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index d2556917a49..f7de0b46f6a 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -2,7 +2,7 @@ name = "belt" desc = "Can hold various things." icon = 'icons/obj/clothing/belts.dmi' - icon_state = "utilitybelt" + icon_state = "utility" storage_slots = 7 max_storage_space = 28 //This should ensure belts always have enough room to store whatever. max_w_class = 3 @@ -27,11 +27,10 @@ var/mob/M = src.loc M.update_inv_belt() - /obj/item/weapon/storage/belt/utility name = "tool-belt" //Carn: utility belt is nicer, but it bamboozles the text parsing. desc = "Can hold various tools." - icon_state = "utilitybelt" + icon_state = "utility" can_hold = list( ///obj/item/weapon/combitool, /obj/item/weapon/crowbar, @@ -59,7 +58,6 @@ /obj/item/weapon/tape_roll, ) - /obj/item/weapon/storage/belt/utility/full/New() ..() new /obj/item/weapon/screwdriver(src) @@ -69,7 +67,6 @@ new /obj/item/weapon/wirecutters(src) new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange")) - /obj/item/weapon/storage/belt/utility/atmostech/New() ..() new /obj/item/weapon/screwdriver(src) @@ -79,12 +76,10 @@ new /obj/item/weapon/wirecutters(src) new /obj/item/device/t_scanner(src) - - /obj/item/weapon/storage/belt/medical name = "medical belt" desc = "Can hold various medical equipment." - icon_state = "medicalbelt" + icon_state = "medical" can_hold = list( /obj/item/device/healthanalyzer, /obj/item/weapon/dnainjector, @@ -115,12 +110,12 @@ /obj/item/weapon/storage/belt/medical/emt name = "EMT utility belt" desc = "A sturdy black webbing belt with attached pouches." - icon_state = "emsbelt" + icon_state = "ems" /obj/item/weapon/storage/belt/security name = "security belt" desc = "Can hold security gear like handcuffs and flashes." - icon_state = "securitybelt" + icon_state = "security" max_w_class = 3 can_hold = list( /obj/item/weapon/grenade, @@ -150,7 +145,7 @@ /obj/item/weapon/storage/belt/detective name = "forensic utility belt" desc = "A belt for holding forensics equipment." - icon_state = "securitybelt" + icon_state = "security" storage_slots = 7 max_w_class = 3 can_hold = list( @@ -190,7 +185,7 @@ /obj/item/weapon/storage/belt/soulstone name = "soul stone belt" desc = "Designed for ease of access to the shards during a fight, as to not let a single enemy spirit slip away" - icon_state = "soulstonebelt" + icon_state = "soulstone" storage_slots = 6 can_hold = list( /obj/item/device/soulstone @@ -209,7 +204,7 @@ /obj/item/weapon/storage/belt/champion name = "championship belt" desc = "Proves to the world that you are the strongest!" - icon_state = "championbelt" + icon_state = "champion" storage_slots = 1 can_hold = list( "/obj/item/clothing/mask/luchador" @@ -218,7 +213,7 @@ /obj/item/weapon/storage/belt/security/tactical name = "combat belt" desc = "Can hold security gear like handcuffs and flashes, with more pouches for more storage." - icon_state = "swatbelt" + icon_state = "swat" storage_slots = 9 max_w_class = 3 max_storage_space = 28 @@ -231,7 +226,7 @@ /obj/item/weapon/storage/belt/janitor name = "janitorial belt" desc = "A belt used to hold most janitorial supplies." - icon_state = "janibelt" + icon_state = "janitor" storage_slots = 7 max_w_class = 3 can_hold = list( @@ -250,4 +245,34 @@ /obj/item/taperoll, /obj/item/weapon/reagent_containers/spray, /obj/item/weapon/soap + ) + +/obj/item/weapon/storage/belt/archaeology + name = "excavation gear-belt" + desc = "Can hold various excavation gear." + icon_state = "gear" + can_hold = list( + /obj/item/weapon/storage/box/samplebags, + /obj/item/device/core_sampler, + /obj/item/device/beacon_locator, + /obj/item/device/radio/beacon, + /obj/item/device/gps, + /obj/item/device/measuring_tape, + /obj/item/device/flashlight, + /obj/item/weapon/pickaxe, + /obj/item/device/depth_scanner, + /obj/item/device/camera, + /obj/item/weapon/paper, + /obj/item/weapon/photo, + /obj/item/weapon/folder, + /obj/item/weapon/pen, + /obj/item/weapon/folder, + /obj/item/weapon/clipboard, + /obj/item/weapon/anodevice, + /obj/item/clothing/glasses, + /obj/item/weapon/wrench, + /obj/item/weapon/storage/excavation, + /obj/item/weapon/anobattery, + /obj/item/device/ano_scanner, + /obj/item/weapon/pickaxe/hand ) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 8f904972dea..46a3cd29e94 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -387,7 +387,7 @@ /obj/item/weapon/storage/box/monkeycubes/farwacubes name = "farwa cube box" - desc = "Drymate brand farwa cubes, shipped from Ahdomai. Just add water!" + desc = "Drymate brand farwa cubes, shipped from Meralar. Just add water!" /obj/item/weapon/storage/box/monkeycubes/farwacubes/New() ..() diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 6fac98f0e86..2561886efaa 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -192,9 +192,9 @@ desc = "A packet of six AcmeCo cigarettes. For those who somehow want to obtain the record for the most amount of cancerous tumors." icon_state = "Bpacket" - New() - ..() - fill_cigarre_package(src,list("fuel" = 15)) +// New() +// ..() +// fill_cigarre_package(src,list("fuel" = 15)) // New exciting ways to kill your lungs! - Earthcrusher // @@ -220,7 +220,7 @@ /obj/item/weapon/storage/fancy/cigarettes/professionals name = "\improper pack of Professional 120s" - desc = "Let's face it - if you're smoking these, you're either trying to look upper-class or you're 80 years old. That's the only excuse. They taste disgusting, too." + desc = "Let's face it - if you're smoking these, you're either trying to look upper-class or you're 80 years old. That's the only excuse. They are, however, very good quality." icon_state = "P100packet" /obj/item/weapon/storage/fancy/cigar diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index c890377475f..7d0161a2fd5 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -5,7 +5,7 @@ icon_state = "red" item_state_slots = list(slot_r_hand_str = "toolbox_red", slot_l_hand_str = "toolbox_red") flags = CONDUCT - force = 5 + force = 10 throwforce = 10 throw_speed = 1 throw_range = 7 @@ -67,7 +67,7 @@ icon_state = "syndicate" item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi") origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1) - force = 7.0 + force = 14 /obj/item/weapon/storage/toolbox/syndicate/New() ..() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 33a9f46ed17..98c78768112 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -21,9 +21,9 @@ icon_state = "wrench" flags = CONDUCT slot_flags = SLOT_BELT - force = 5.0 - throwforce = 7.0 - w_class = 2.0 + force = 6 + throwforce = 7 + w_class = 2 origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) matter = list(DEFAULT_WALL_MATERIAL = 150) attack_verb = list("bashed", "battered", "bludgeoned", "whacked") @@ -39,9 +39,9 @@ icon_state = "screwdriver" flags = CONDUCT slot_flags = SLOT_BELT | SLOT_EARS - force = 5.0 - w_class = 1.0 - throwforce = 5.0 + force = 6 + w_class = 1 + throwforce = 5 throw_speed = 3 throw_range = 5 matter = list(DEFAULT_WALL_MATERIAL = 75) @@ -100,7 +100,7 @@ icon_state = "cutters" flags = CONDUCT slot_flags = SLOT_BELT - force = 6.0 + force = 6 throw_speed = 2 throw_range = 9 w_class = 2.0 @@ -411,11 +411,11 @@ icon_state = "crowbar" flags = CONDUCT slot_flags = SLOT_BELT - force = 5.0 - throwforce = 7.0 + force = 6 + throwforce = 7 pry = 1 item_state = "crowbar" - w_class = 2.0 + w_class = 2 origin_tech = list(TECH_ENGINEERING = 1) matter = list(DEFAULT_WALL_MATERIAL = 50) attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") 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 62964125d92..be67e9b3ca0 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -1,5 +1,5 @@ /obj/structure/closet/secure_closet/captains - name = "captain's locker" + name = "station administrator's locker" req_access = list(access_captain) icon_state = "capsecure1" icon_closed = "capsecure" @@ -11,15 +11,15 @@ New() ..() new /obj/item/weapon/storage/backpack/dufflebag/captain(src) + new /obj/item/clothing/head/helmet(src) new /obj/item/clothing/suit/storage/vest(src) new /obj/item/weapon/cartridge/captain(src) - new /obj/item/clothing/head/helmet/swat(src) new /obj/item/weapon/storage/lockbox/medal(src) new /obj/item/device/radio/headset/heads/captain(src) new /obj/item/device/radio/headset/heads/captain/alt(src) new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/clothing/suit/armor/captain(src) new /obj/item/weapon/melee/telebaton(src) + new /obj/item/device/flash(src) return diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm index 489cedc1607..19800810cb2 100644 --- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm +++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm @@ -611,7 +611,7 @@ return /obj/structure/closet/wardrobe/captain - name = "captain's wardrobe" + name = "station administrator's wardrobe" icon_state = "cabinet_closed" icon_closed = "cabinet_closed" icon_opened = "cabinet_open" diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 89e841bc580..cb7dac06841 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -7,7 +7,7 @@ w_class = 5 var/state = 0 var/base_icon_state = "" - var/base_name = "Airlock" + var/base_name = "airlock" var/obj/item/weapon/airlock_electronics/electronics = null var/airlock_type = "" //the type path of the airlock once completed var/glass_type = "/glass" @@ -19,91 +19,91 @@ /obj/structure/door_assembly/door_assembly_com base_icon_state = "com" - base_name = "Command Airlock" + base_name = "Command airlock" glass_type = "/glass_command" airlock_type = "/command" /obj/structure/door_assembly/door_assembly_sec base_icon_state = "sec" - base_name = "Security Airlock" + base_name = "Security airlock" glass_type = "/glass_security" airlock_type = "/security" /obj/structure/door_assembly/door_assembly_eng base_icon_state = "eng" - base_name = "Engineering Airlock" + base_name = "Engineering airlock" glass_type = "/glass_engineering" airlock_type = "/engineering" /obj/structure/door_assembly/door_assembly_eat base_icon_state = "eat" - base_name = "Engineering Atmos Airlock" + base_name = "Engineering atmos airlock" glass_type = "/glass_engineeringatmos" airlock_type = "/engineering" /obj/structure/door_assembly/door_assembly_min base_icon_state = "min" - base_name = "Mining Airlock" + base_name = "Mining airlock" glass_type = "/glass_mining" airlock_type = "/mining" /obj/structure/door_assembly/door_assembly_atmo base_icon_state = "atmo" - base_name = "Atmospherics Airlock" + base_name = "Atmospherics airlock" glass_type = "/glass_atmos" airlock_type = "/atmos" /obj/structure/door_assembly/door_assembly_research base_icon_state = "res" - base_name = "Research Airlock" + base_name = "Research airlock" glass_type = "/glass_research" airlock_type = "/research" /obj/structure/door_assembly/door_assembly_science base_icon_state = "sci" - base_name = "Science Airlock" + base_name = "Science airlock" glass_type = "/glass_science" airlock_type = "/science" /obj/structure/door_assembly/door_assembly_med base_icon_state = "med" - base_name = "Medical Airlock" + base_name = "Medical airlock" glass_type = "/glass_medical" airlock_type = "/medical" /obj/structure/door_assembly/door_assembly_mai base_icon_state = "mai" - base_name = "Maintenance Airlock" + base_name = "Maintenance airlock" airlock_type = "/maintenance" glass = -1 /obj/structure/door_assembly/door_assembly_ext base_icon_state = "ext" - base_name = "External Airlock" + base_name = "External airlock" airlock_type = "/external" glass = -1 /obj/structure/door_assembly/door_assembly_fre base_icon_state = "fre" - base_name = "Freezer Airlock" + base_name = "Freezer airlock" airlock_type = "/freezer" glass = -1 /obj/structure/door_assembly/door_assembly_hatch base_icon_state = "hatch" - base_name = "Airtight Hatch" + base_name = "airtight hatch" airlock_type = "/hatch" glass = -1 /obj/structure/door_assembly/door_assembly_mhatch base_icon_state = "mhatch" - base_name = "Maintenance Hatch" + base_name = "maintenance hatch" airlock_type = "/maintenance_hatch" glass = -1 /obj/structure/door_assembly/door_assembly_highsecurity // Borrowing this until WJohnston makes sprites for the assembly base_icon_state = "highsec" - base_name = "High Security Airlock" + base_name = "high security airlock" airlock_type = "/highsecurity" glass = -1 @@ -221,7 +221,6 @@ W.loc = src user << "You installed the airlock electronics!" src.state = 2 - src.name = "Near finished Airlock Assembly" src.electronics = W else if(istype(W, /obj/item/weapon/crowbar) && state == 2 ) @@ -238,7 +237,6 @@ if(!src) return user << "You removed the airlock electronics!" src.state = 1 - src.name = "Wired Airlock Assembly" electronics.loc = src.loc electronics = null @@ -294,9 +292,9 @@ switch (state) if(0) if (anchored) - name = "Secured " + name = "secured " if(1) - name = "Wired " + name = "wired " if(2) - name = "Near Finished " - name += "[glass == 1 ? "Window " : ""][istext(glass) ? "[glass] Airlock" : base_name] Assembly" + name = "near finished " + name += "[glass == 1 ? "window " : ""][istext(glass) ? "[glass] airlock" : base_name] assembly ([created_name])" diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index d868ebfa517..fc4a9c48ca6 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -75,6 +75,7 @@ /obj/structure/flora/pottedplant name = "potted plant" + desc = "Really ties the room together." icon = 'icons/obj/plants.dmi' icon_state = "plant-26" diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index aa961f4c107..52afecd66d3 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -126,7 +126,8 @@ return ..() /obj/structure/girder/proc/construct_wall(obj/item/stack/material/S, mob/user) - if(S.get_amount() < 2) + var/amount_to_use = reinf_material ? 1 : 2 + if(S.get_amount() < amount_to_use) user << "There isn't enough material here to construct a wall." return 0 @@ -143,7 +144,6 @@ user << "You begin adding the plating..." - var/amount_to_use = reinf_material ? 1 : 2 if(!do_after(user,40) || !S.use(amount_to_use)) return 1 //once we've gotten this far don't call parent attackby() diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 8596ce037d7..8271c3a0d52 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -13,20 +13,21 @@ var/victim_name = "corpse" /obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G as obj, mob/user as mob) - if(!istype(G, /obj/item/weapon/grab) || !G.affecting) + if(!istype(G, /obj/item/weapon/grab) || !ismob(G.affecting)) return if(occupied) user << "The spike already has something on it, finish collecting its meat first!" else if(spike(G.affecting)) visible_message("[user] has forced [G.affecting] onto the spike, killing them instantly!") - qdel(G.affecting) + var/mob/M = G.affecting + M.forceMove(src) qdel(G) + qdel(M) else user << "They are too big for the spike, try something smaller!" /obj/structure/kitchenspike/proc/spike(var/mob/living/victim) - if(!istype(victim)) return @@ -52,9 +53,9 @@ return meat-- new meat_type(get_turf(src)) - if(src.meat > 1) + if(meat > 1) user << "You remove some meat from \the [victim_name]." - else if(src.meat == 1) + else if(meat == 1) user << "You remove the last piece of meat from \the [victim_name]!" icon_state = "spike" occupied = 0 diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm index 6a06ef26fbc..d26b421ab51 100644 --- a/code/game/objects/structures/under_wardrobe.dm +++ b/code/game/objects/structures/under_wardrobe.dm @@ -69,6 +69,7 @@ var/datum/category_item/underwear/selected_underwear = input(H, "Choose underwear:", "Choose underwear", H.all_underwear[UWC.name]) as null|anything in UWC.items if(selected_underwear && CanUseTopic(H, default_state)) H.all_underwear[UWC.name] = selected_underwear + H.hide_underwear[UWC.name] = FALSE . = TRUE else if(href_list["underwear"] && href_list["tweak"]) var/underwear = href_list["underwear"] @@ -80,6 +81,7 @@ var/new_metadata = gt.get_metadata(usr, get_metadata(H, underwear, gt), "Wardrobe Underwear Selection") if(new_metadata) set_metadata(H, underwear, gt, new_metadata) + H.hide_underwear[underwear] = FALSE . = TRUE if(.) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index fb48f6249dd..37643866793 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -19,12 +19,18 @@ obj/structure/windoor_assembly w_class = 3 var/obj/item/weapon/airlock_electronics/electronics = null + var/created_name = null //Vars to help with the icon's name var/facing = "l" //Does the windoor open to the left or right? var/secure = "" //Whether or not this creates a secure windoor var/state = "01" //How far the door assembly has progressed in terms of sprites +obj/structure/windoor_assembly/secure + name = "secure windoor assembly" + secure = "secure_" + icon_state = "l_secure_windoor_assembly01" + obj/structure/windoor_assembly/New(Loc, start_dir=NORTH, constructed=0) ..() if(constructed) @@ -65,24 +71,31 @@ obj/structure/windoor_assembly/Destroy() /obj/structure/windoor_assembly/attackby(obj/item/W as obj, mob/user as mob) - //I really should have spread this out across more states but thin little windoors are hard to sprite. + if(istype(W, /obj/item/weapon/pen)) + var/t = sanitizeSafe(input(user, "Enter the name for the windoor.", src.name, src.created_name), MAX_NAME_LEN) + if(!t) return + if(!in_range(src, usr) && src.loc != usr) return + created_name = t + return + switch(state) if("01") if(istype(W, /obj/item/weapon/weldingtool) && !anchored ) var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) - user.visible_message("[user] dissassembles the windoor assembly.", "You start to dissassemble the windoor assembly.") + user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly.") playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) if(do_after(user, 40)) if(!src || !WT.isOn()) return - user << "You dissasembled the windoor assembly!" - new /obj/item/stack/material/glass/reinforced(get_turf(src), 5) + user << "You disassembled the windoor assembly!" if(secure) - PoolOrNew(/obj/item/stack/rods, list(get_turf(src), 4)) + new /obj/item/stack/material/glass/reinforced(get_turf(src), 2) + else + new /obj/item/stack/material/glass(get_turf(src), 2) qdel(src) else - user << "You need more welding fuel to dissassemble the windoor assembly." + user << "You need more welding fuel to disassemble the windoor assembly." return //Wrenching an unsecure assembly anchors it in place. Step 4 complete @@ -95,9 +108,9 @@ obj/structure/windoor_assembly/Destroy() user << "You've secured the windoor assembly!" src.anchored = 1 if(src.secure) - src.name = "Secure Anchored Windoor Assembly" + src.name = "secure anchored windoor assembly" else - src.name = "Anchored Windoor Assembly" + src.name = "anchored windoor assembly" //Unwrenching an unsecure assembly un-anchors it. Step 4 undone else if(istype(W, /obj/item/weapon/wrench) && anchored) @@ -109,26 +122,9 @@ obj/structure/windoor_assembly/Destroy() user << "You've unsecured the windoor assembly!" src.anchored = 0 if(src.secure) - src.name = "Secure Windoor Assembly" + src.name = "secure windoor assembly" else - src.name = "Windoor Assembly" - - //Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete. - else if(istype(W, /obj/item/stack/rods) && !secure) - var/obj/item/stack/rods/R = W - if(R.get_amount() < 4) - user << "You need more rods to do this." - return - user << "You start to reinforce the windoor with rods." - - if(do_after(user,40) && !secure) - if (R.use(4)) - user << "You reinforce the windoor." - src.secure = "secure_" - if(src.anchored) - src.name = "Secure Anchored Windoor Assembly" - else - src.name = "Secure Windoor Assembly" + src.name = "windoor assembly" //Adding cable to the assembly. Step 5 complete. else if(istype(W, /obj/item/stack/cable_coil) && anchored) @@ -140,9 +136,9 @@ obj/structure/windoor_assembly/Destroy() user << "You wire the windoor!" src.state = "02" if(src.secure) - src.name = "Secure Wired Windoor Assembly" + src.name = "secure wired windoor assembly" else - src.name = "Wired Windoor Assembly" + src.name = "wired windoor assembly" else ..() @@ -160,9 +156,9 @@ obj/structure/windoor_assembly/Destroy() new/obj/item/stack/cable_coil(get_turf(user), 1) src.state = "01" if(src.secure) - src.name = "Secure Anchored Windoor Assembly" + src.name = "secure anchored windoor assembly" else - src.name = "Anchored Windoor Assembly" + src.name = "anchored windoor assembly" //Adding airlock electronics for access. Step 6 complete. else if(istype(W, /obj/item/weapon/airlock_electronics) && W:icon_state != "door_electronics_smoked") @@ -175,7 +171,7 @@ obj/structure/windoor_assembly/Destroy() user.drop_item() W.loc = src user << "You've installed the airlock electronics!" - src.name = "Near finished Windoor Assembly" + src.name = "near finished windoor assembly" src.electronics = W else W.loc = src.loc @@ -189,9 +185,9 @@ obj/structure/windoor_assembly/Destroy() if(!src || !src.electronics) return user << "You've removed the airlock electronics!" if(src.secure) - src.name = "Secure Wired Windoor Assembly" + src.name = "secure wired windoor assembly" else - src.name = "Wired Windoor Assembly" + src.name = "wired windoor assembly" var/obj/item/weapon/airlock_electronics/ae = electronics electronics = null ae.loc = src.loc @@ -222,6 +218,9 @@ obj/structure/windoor_assembly/Destroy() windoor.base_state = "rightsecure" windoor.set_dir(src.dir) windoor.density = 0 + windoor.name = created_name + spawn(0) + windoor.close() if(src.electronics.one_access) windoor.req_access = null @@ -240,6 +239,9 @@ obj/structure/windoor_assembly/Destroy() windoor.base_state = "right" windoor.set_dir(src.dir) windoor.density = 0 + windoor.name = created_name + spawn(0) + windoor.close() if(src.electronics.one_access) windoor.req_access = null @@ -257,8 +259,11 @@ obj/structure/windoor_assembly/Destroy() ..() //Update to reflect changes(if applicable) - update_icon() + update_state() +/obj/structure/windoor_assembly/proc/update_state() + update_icon() + name += " ([created_name])" //Rotates the windoor assembly clockwise /obj/structure/windoor_assembly/verb/revrotate() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 8e6c2cd0d57..c419de639d6 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -161,6 +161,7 @@ if(reinf) tforce *= 0.25 if(health - tforce <= 7 && !reinf) anchored = 0 + update_verbs() update_nearby_icons() step(src, get_dir(AM, src)) take_damage(tforce) diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 67a429b2d0c..e78d7941a46 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -79,7 +79,7 @@ tracks.AddTracks(bloodDNA,comingdir,goingdir,bloodcolor) /turf/simulated/proc/update_dirt() - dirt = min(dirt++, 101) + dirt = min(dirt+1, 101) var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, src) if (dirt > 50) if (!dirtoverlay) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index df3be0077f5..3a7c1afdf0d 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -1,5 +1,6 @@ /turf/simulated/floor name = "plating" + desc = "Unfinished flooring." icon = 'icons/turf/flooring/plating.dmi' icon_state = "plating" diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 8bfb4ebf59a..e3cdd8328a4 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -131,7 +131,7 @@ var/const/enterloopsanity = 100 M.lastarea = get_area(M.loc) if(M.lastarea.has_gravity == 0) inertial_drift(M) - else if(is_space()) + else if(!is_space()) M.inertia_dir = 0 M.make_floating(0) ..() diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm index bed720d584a..874b6f3998b 100644 --- a/code/game/verbs/suicide.dm +++ b/code/game/verbs/suicide.dm @@ -27,6 +27,7 @@ src << "You can't commit suicide whilst restrained! ((You can type Ghost instead however.))" return suiciding = 1 + does_not_breathe = 0 //Prevents ling-suicide zombies, or something var/obj/item/held_item = get_active_hand() if(held_item) var/damagetype = held_item.suicide_act(src) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index dc1cbf1c8cd..097ddd0c005 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -59,7 +59,8 @@ proc/admin_notice(var/message, var/rights) PM - SM - [admin_jump_link(M, src)]\]
              - Mob type = [M.type]

              + Mob type: [M.type]
              + Inactivity time: [M.client ? "[M.client.inactivity/600] minutes" : "Logged out"]

              Kick | Warn | Ban | @@ -1348,6 +1349,7 @@ proc/admin_notice(var/message, var/rights) H.paralysis = 0 msg = "has unparalyzed [key_name(H)]." log_and_message_admins(msg) + /datum/admins/proc/set_tcrystals(mob/living/carbon/human/H as mob) set category = "Debug" set name = "Set Telecrystals" @@ -1380,3 +1382,93 @@ proc/admin_notice(var/message, var/rights) else usr << "You do not have access to this command." + +/datum/admins/proc/sendFax() + set category = "Special Verbs" + set name = "Send Fax" + set desc = "Sends a fax to this machine" + var/department = input("Choose a fax", "Fax") as null|anything in alldepartments + for(var/obj/machinery/photocopier/faxmachine/sendto in allfaxes) + if(sendto.department == department) + + if (!istype(src,/datum/admins)) + src = usr.client.holder + if (!istype(src,/datum/admins)) + usr << "Error: you are not an admin!" + return + + var/replyorigin = input(src.owner, "Please specify who the fax is coming from", "Origin") as text|null + + var/obj/item/weapon/paper/admin/P = new /obj/item/weapon/paper/admin( null ) //hopefully the null loc won't cause trouble for us + faxreply = P + + P.admindatum = src + P.origin = replyorigin + P.destination = sendto + + P.adminbrowse() + + +datum/admins/var/obj/item/weapon/paper/admin/faxreply // var to hold fax replies in + +/datum/admins/proc/faxCallback(var/obj/item/weapon/paper/admin/P, var/obj/machinery/photocopier/faxmachine/destination) + var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null + + P.name = "[P.origin] - [customname]" + P.desc = "This is a paper titled '" + P.name + "'." + + var/shouldStamp = 1 + if(!P.sender) // admin initiated + switch(alert("Would you like the fax stamped?",, "Yes", "No")) + if("No") + shouldStamp = 0 + + if(shouldStamp) + P.stamps += "
              This paper has been stamped by the [P.origin] Quantum Relay." + + var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') + var/{x; y;} + x = rand(-2, 0) + y = rand(-1, 2) + P.offset_x += x + P.offset_y += y + stampoverlay.pixel_x = x + stampoverlay.pixel_y = y + + if(!P.ico) + P.ico = new + P.ico += "paper_stamp-cent" + stampoverlay.icon_state = "paper_stamp-cent" + + if(!P.stamped) + P.stamped = new + P.stamped += /obj/item/weapon/stamp/centcomm + P.overlays += stampoverlay + + var/obj/item/rcvdcopy + rcvdcopy = destination.copy(P) + rcvdcopy.loc = null //hopefully this shouldn't cause trouble + adminfaxes += rcvdcopy + + + + if(destination.recievefax(P)) + src.owner << "Message reply to transmitted successfully." + if(P.sender) // sent as a reply + log_admin("[key_name(src.owner)] replied to a fax message from [key_name(P.sender)]") + for(var/client/C in admins) + if((R_ADMIN | R_MOD) & C.holder.rights) + C << "FAX LOG:[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(P.sender)] (VIEW)" + else + log_admin("[key_name(src.owner)] has sent a fax message to [destination.department]") + for(var/client/C in admins) + if((R_ADMIN | R_MOD) & C.holder.rights) + C << "FAX LOG:[key_name_admin(src.owner)] has sent a fax message to [destination.department] (VIEW)" + + else + src.owner << "Message reply failed." + + spawn(100) + qdel(P) + faxreply = null + return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 1cb76cef8d3..8e1e81c6036 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -96,7 +96,8 @@ var/list/admin_verbs_admin = list( /client/proc/toggle_debug_logs, /client/proc/toggle_attack_logs, /datum/admins/proc/paralyze_mob, - /client/proc/fixatmos + /client/proc/fixatmos, + /datum/admins/proc/sendFax ) var/list/admin_verbs_ban = list( /client/proc/unban_panel, @@ -161,7 +162,7 @@ var/list/admin_verbs_server = list( /client/proc/nanomapgen_DumpImage ) var/list/admin_verbs_debug = list( - /client/proc/getruntimelog, //allows us to access runtime logs to somebody, + /client/proc/getruntimelog, //allows us to access runtime logs to somebody, /client/proc/cmd_admin_list_open_jobs, /client/proc/Debug2, /client/proc/kill_air, @@ -195,7 +196,8 @@ var/list/admin_verbs_debug = list( /client/proc/jumptocoord, /client/proc/dsay, /client/proc/toggle_debug_logs, - /client/proc/admin_ghost //allows us to ghost/reenter body at will, + /client/proc/admin_ghost, //allows us to ghost/reenter body at will, + /datum/admins/proc/view_runtimes ) var/list/admin_verbs_paranoid_debug = list( @@ -305,7 +307,9 @@ var/list/admin_verbs_mod = list( /client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head', /datum/admins/proc/paralyze_mob, /client/proc/cmd_admin_direct_narrate, - /client/proc/allow_character_respawn // Allows a ghost to respawn , + /client/proc/allow_character_respawn, // Allows a ghost to respawn , + /datum/admins/proc/sendFax + ) var/list/admin_verbs_mentor = list( diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index 9c73dd9e862..5742b74aa42 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -13,6 +13,7 @@ var/list/admin_datums = list() var/datum/feed_channel/admincaster_feed_channel = new /datum/feed_channel var/admincaster_signature //What you'll sign the newsfeeds as + /datum/admins/New(initial_rank = "Temporary Admin", initial_rights = 0, ckey) if(!ckey) error("Admin datum created without a ckey argument. Datum has been deleted") @@ -57,22 +58,28 @@ proc/admin_proc() NOTE: It checks usr by default. Supply the "user" argument if you wish to check for a specific mob. */ -/proc/check_rights(rights_required, show_msg=1, var/mob/user = usr) - if(user && user.client) - if(rights_required) - if(user.client.holder) - if(rights_required & user.client.holder.rights) - return 1 - else - if(show_msg) - user << "Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")]." +/proc/check_rights(rights_required, show_msg=1, var/client/C = usr) + if(ismob(C)) + var/mob/M = C + C = M.client + if(!C) + return FALSE + if(!(istype(C, /client))) // If we still didn't find a client, something is wrong. + return FALSE + if(!C.holder) + if(show_msg) + C << "Error: You are not an admin." + return FALSE + + if(rights_required) + if(rights_required & C.holder.rights) + return TRUE else - if(user.client.holder) - return 1 - else - if(show_msg) - user << "Error: You are not an admin." - return 0 + if(show_msg) + C << "Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")]." + return FALSE + else + return TRUE //probably a bit iffy - will hopefully figure out a better solution /proc/check_if_greater_rights_than(client/other) diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm index 00ee46de497..b9f5c442980 100644 --- a/code/modules/admin/newbanjob.dm +++ b/code/modules/admin/newbanjob.dm @@ -63,7 +63,7 @@ var/savefile/Banlistjob bantimestamp = CMinutes + minutes if(rank == "Heads") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Personnel") - AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Captain") + AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Station Administrator") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Head of Security") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Chief Engineer") AddBanjob(ckey, computerid, reason, bannedby, temp, minutes, "Research Director") diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 622be84c3d3..ece5f068d7a 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -392,7 +392,7 @@ if (ticker && ticker.current_state >= GAME_STATE_PLAYING) var/dat = "Round Status

              Round Status

              " dat += "Current Game Mode: [ticker.mode.name]
              " - dat += "Round Duration: [round_duration_as_text()]
              " + dat += "Round Duration: [roundduration2text()]
              " dat += "Emergency shuttle
              " if (!emergency_shuttle.online()) dat += "Call Shuttle
              " diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index cf98ede72f1..eaadf431bc3 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -892,9 +892,9 @@ if (ticker && ticker.mode) return alert(usr, "The game has already started.", null, null, null, null) master_mode = href_list["c_mode2"] - log_admin("[key_name(usr)] set the mode as [master_mode].") - message_admins("\blue [key_name_admin(usr)] set the mode as [master_mode].", 1) - world << "\blue The mode is now: [master_mode]" + log_admin("[key_name(usr)] set the mode as [config.mode_names[master_mode]].") + message_admins("\blue [key_name_admin(usr)] set the mode as [config.mode_names[master_mode]].", 1) + world << "\blue The mode is now: [config.mode_names[master_mode]]" Game() // updates the main game menu world.save_mode(master_mode) .(href, list("c_mode"=1)) @@ -1176,6 +1176,18 @@ sleep(2) C.jumptomob(M) + else if(href_list["adminplayerobservefollow"]) + if(!check_rights(R_MENTOR|R_MOD|R_ADMIN|R_SERVER)) + return + + var/mob/M = locate(href_list["adminplayerobservefollow"]) + + var/client/C = usr.client + if(!isobserver(usr)) C.admin_ghost() + var/mob/observer/dead/G = C.mob + sleep(2) + G.ManualFollow(M) + else if(href_list["check_antagonist"]) check_antagonists() @@ -1386,86 +1398,21 @@ H.show(src.owner) return - else if(href_list["CentcommFaxReply"]) - var/mob/sender = locate(href_list["CentcommFaxReply"]) + else if(href_list["FaxReply"]) + var/mob/sender = locate(href_list["FaxReply"]) var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) - - //todo: sanitize - var/input = input(src.owner, "Please enter a message to reply to [key_name(sender)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use
              for line breaks.", "Outgoing message from Centcomm", "") as message|null - if(!input) return - - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null - - // Create the reply message - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( null ) //hopefully the null loc won't cause trouble for us - P.name = "[command_name()]- [customname]" - P.info = input - P.update_icon() - - // Stamps - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-cent" - if(!P.stamped) - P.stamped = new - P.stamped += /obj/item/weapon/stamp - P.overlays += stampoverlay - P.stamps += "
              This paper has been stamped by the Central Command Quantum Relay." - - if(fax.recievefax(P)) - src.owner << "\blue Message reply to transmitted successfully." - log_admin("[key_name(src.owner)] replied to a fax message from [key_name(sender)]: [input]") - message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(sender)]", 1) - else - src.owner << "\red Message reply failed." - - spawn(100) - qdel(P) - return - - else if(href_list["SolGovFaxReply"]) - //TODO - /* - var/mob/living/carbon/human/H = locate(href_list["SolGovFaxReply"]) - var/obj/machinery/photocopier/faxmachine/fax = locate(href_list["originfax"]) - - var/input = input(src.owner, "Please enter a message to reply to [key_name(H)] via secure connection. NOTE: BBCode does not work, but HTML tags do! Use
              for line breaks.", "Outgoing message from Centcomm", "") as message|null - if(!input) return - - var/customname = input(src.owner, "Pick a title for the report", "Title") as text|null - - for(var/obj/machinery/photocopier/faxmachine/F in machines) - if(F == fax) - if(! (F.stat & (BROKEN|NOPOWER) ) ) - - // animate! it's alive! - flick("faxreceive", F) - - // give the sprite some time to flick - spawn(20) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( F.loc ) - P.name = "Sol Government- [customname]" - P.info = input - P.update_icon() - - playsound(F.loc, "sound/items/polaroid1.ogg", 50, 1) - - // Stamps - var/image/stampoverlay = image('icons/obj/bureaucracy.dmi') - stampoverlay.icon_state = "paper_stamp-cap" - if(!P.stamped) - P.stamped = new - P.stamped += /obj/item/weapon/stamp - P.overlays += stampoverlay - P.stamps += "
              This paper has been stamped and encrypted by the Sol Government Quantum Relay." - - src.owner << "Message reply to transmitted successfully." - log_admin("[key_name(src.owner)] replied to a fax message from [key_name(H)]: [input]") - message_admins("[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(H)]", 1) - return - src.owner << "/red Unable to locate fax!" - */ + var/replyorigin = href_list["replyorigin"] + var/obj/item/weapon/paper/admin/P = new /obj/item/weapon/paper/admin( null ) //hopefully the null loc won't cause trouble for us + faxreply = P + + P.admindatum = src + P.origin = replyorigin + P.destination = fax + P.sender = sender + + P.adminbrowse() else if(href_list["jumpto"]) if(!check_rights(R_ADMIN)) return diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index b21abd7e301..9b9aca72b3c 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -262,7 +262,7 @@ id.icon_state = "gold" id.access = get_all_accesses() id.registered_name = H.real_name - id.assignment = "Captain" + id.assignment = "Station Administrator" id.name = "[id.registered_name]'s ID Card ([id.assignment])" H.equip_to_slot_or_del(id, slot_wear_id) H.update_inv_wear_id() @@ -959,3 +959,13 @@ log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!") else alert("Invalid mob") + +/datum/admins/proc/view_runtimes() + set category = "Debug" + set name = "View Runtimes" + set desc = "Open the Runtime Viewer" + + if(!check_rights(R_DEBUG)) + return + + error_cache.showTo(usr) diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 0962d540611..4463209157b 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -131,6 +131,7 @@ prefs.last_id = computer_id //these are gonna be used for banning . = ..() //calls mob.Login() + prefs.sanitize_preferences() if(custom_event_msg && custom_event_msg != "") src << "

              Custom Event

              " diff --git a/code/modules/client/preference_setup/general/02_language.dm b/code/modules/client/preference_setup/general/02_language.dm index 5d4a73c64a4..d42449ab84d 100644 --- a/code/modules/client/preference_setup/general/02_language.dm +++ b/code/modules/client/preference_setup/general/02_language.dm @@ -34,7 +34,7 @@ . += "- [pref.species] cannot choose secondary languages.
              " . += "Language Keys
              " - . += " [english_list(pref.language_prefixes, and_text = " ", comma_text = " ")] Change Reset
              " + . += " [jointext(pref.language_prefixes, " ")] Change Reset
              " /datum/category_item/player_setup_item/general/language/OnTopic(var/href,var/list/href_list, var/mob/user) if(href_list["remove_language"]) diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index 31b510ef1a8..8f2d5af5984 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -52,34 +52,38 @@ var/list/gear_datums = list() S["gear"] << pref.gear /datum/category_item/player_setup_item/loadout/proc/valid_gear_choices(var/max_cost) - var/list/valid_gear_choices = list() + . = list() + var/mob/preference_mob = preference_mob() for(var/gear_name in gear_datums) var/datum/gear/G = gear_datums[gear_name] - if(G.whitelisted && !is_alien_whitelisted(preference_mob(), all_species[G.whitelisted])) + + if(G.whitelisted && !is_alien_whitelisted(preference_mob, all_species[G.whitelisted])) continue if(max_cost && G.cost > max_cost) continue - valid_gear_choices += gear_name - return valid_gear_choices + . += gear_name /datum/category_item/player_setup_item/loadout/sanitize_character() + var/mob/preference_mob = preference_mob() if(!islist(pref.gear)) pref.gear = list() for(var/gear_name in pref.gear) if(!(gear_name in gear_datums)) pref.gear -= gear_name - var/total_cost = 0 for(var/gear_name in pref.gear) if(!gear_datums[gear_name]) + preference_mob << "You cannot have more than one of the \the [gear_name]" pref.gear -= gear_name else if(!(gear_name in valid_gear_choices())) + preference_mob << "You cannot take \the [gear_name] as you are not whitelisted for the species." pref.gear -= gear_name else var/datum/gear/G = gear_datums[gear_name] if(total_cost + G.cost > MAX_GEAR_COST) pref.gear -= gear_name + preference_mob << "You cannot afford to take \the [gear_name]" else total_cost += G.cost diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index ba3cb42d894..769e9966c38 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -39,7 +39,7 @@ /datum/gear/accessory/holster display_name = "holster, armpit" path = /obj/item/clothing/accessory/holster/armpit - allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") + allowed_roles = list("Station Administrator", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") /datum/gear/accessory/holster/hip display_name = "holster, hip" @@ -210,4 +210,12 @@ /datum/gear/accessory/webbing display_name = "webbing, simple" path = /obj/item/clothing/accessory/storage/webbing - cost = 2 \ No newline at end of file + cost = 2 + +/datum/gear/accessory/chaps + display_name = "chaps, brown" + path = /obj/item/clothing/accessory/chaps + +/datum/gear/accessory/chaps/black + display_name = "chaps, black" + path = /obj/item/clothing/accessory/chaps/black \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm index b30bc8ff0fa..e8b2202ddfc 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm @@ -50,7 +50,7 @@ /datum/gear/eyes/shades display_name = "Sunglasses, fat (Security/Command)" path = /obj/item/clothing/glasses/sunglasses/big - allowed_roles = list("Security Officer","Head of Security","Warden","Captain","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") + allowed_roles = list("Security Officer","Head of Security","Warden","Station Administrator","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") /datum/gear/eyes/glasses/fakesun display_name = "Sunglasses, stylish" diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index 4ad804dccde..039da50f655 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -224,3 +224,27 @@ /datum/gear/head/turban/New() ..() gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/head/beanie + display_name = "beanie" + path = /obj/item/clothing/head/beanie + +/datum/gear/head/beanie/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/head/loose_beanie + display_name = "loose beanie" + path = /obj/item/clothing/head/beanie_loose + +/datum/gear/head/loose_beanie/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/head/beretg + display_name = "beret" + path = /obj/item/clothing/head/beretg + +/datum/gear/head/beretg/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes.dm b/code/modules/client/preference_setup/loadout/loadout_shoes.dm index d6e61c561ef..29c6317b1f5 100644 --- a/code/modules/client/preference_setup/loadout/loadout_shoes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_shoes.dm @@ -95,4 +95,12 @@ /datum/gear/shoes/flats/white display_name = "flats, white" - path = /obj/item/clothing/shoes/flats/white \ No newline at end of file + path = /obj/item/clothing/shoes/flats/white + +/datum/gear/shoes/flipflops + display_name = "flip flops" + path = /obj/item/clothing/shoes/flipflop + +/datum/gear/shoes/flipflops/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 5134f48b3f4..f3f97a4c5d6 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -118,40 +118,40 @@ /datum/gear/suit/poncho display_name = "poncho selection" - path = /obj/item/clothing/suit/poncho + path = /obj/item/clothing/accessory/poncho cost = 1 /datum/gear/suit/poncho/New() ..() var/list/ponchos = list() - for(var/poncho_style in (typesof(/obj/item/clothing/suit/poncho) - typesof(/obj/item/clothing/suit/poncho/roles))) - var/obj/item/clothing/suit/storage/toggle/hoodie/poncho = poncho_style + for(var/poncho_style in (typesof(/obj/item/clothing/accessory/poncho) - typesof(/obj/item/clothing/accessory/poncho/roles))) + var/obj/item/clothing/accessory/poncho/poncho = poncho_style ponchos[initial(poncho.name)] = poncho gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ponchos)) /datum/gear/suit/roles/poncho/security display_name = "poncho, security" - path = /obj/item/clothing/suit/poncho/roles/security + path = /obj/item/clothing/accessory/poncho/roles/security allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer") /datum/gear/suit/roles/poncho/medical display_name = "poncho, medical" - path = /obj/item/clothing/suit/poncho/roles/medical + path = /obj/item/clothing/accessory/poncho/roles/medical allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist") /datum/gear/suit/roles/poncho/engineering display_name = "poncho, engineering" - path = /obj/item/clothing/suit/poncho/roles/engineering + path = /obj/item/clothing/accessory/poncho/roles/engineering allowed_roles = list("Chief Engineer","Atmospheric Technician", "Station Engineer") /datum/gear/suit/roles/poncho/science display_name = "poncho, science" - path = /obj/item/clothing/suit/poncho/roles/science + path = /obj/item/clothing/accessory/poncho/roles/science allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist") /datum/gear/suit/roles/poncho/cargo display_name = "poncho, cargo" - path = /obj/item/clothing/suit/poncho/roles/cargo + path = /obj/item/clothing/accessory/poncho/roles/cargo allowed_roles = list("Quartermaster","Cargo Technician") /datum/gear/suit/unathi_robe @@ -180,6 +180,31 @@ path = /obj/item/clothing/suit/wcoat cost = 1 +/datum/gear/suit/wcoat/red + display_name = "red waistcoat" + path = /obj/item/clothing/suit/wcoat/red + +/datum/gear/suit/wcoat/grey + display_name = "grey waistcoat" + path = /obj/item/clothing/suit/wcoat/grey + +/datum/gear/suit/wcoat/brown + display_name = "brown waistcoat" + path = /obj/item/clothing/suit/wcoat/brown + +/datum/gear/suit/swvest + display_name = "black sweatervest" + path = /obj/item/clothing/suit/wcoat/swvest + cost = 1 + +/datum/gear/suit/swvest/blue + display_name = "blue sweatervest" + path = /obj/item/clothing/suit/wcoat/swvest/blue + +/datum/gear/suit/swvest/red + display_name = "red sweatervest" + path = /obj/item/clothing/suit/wcoat/swvest/red + /datum/gear/suit/forensics display_name = "forensics long, red" path = /obj/item/clothing/suit/storage/forensics/red/long @@ -205,9 +230,9 @@ path = /obj/item/clothing/suit/storage/hooded/wintercoat /datum/gear/suit/wintercoat/captain - display_name = "winter coat, captain" + display_name = "winter coat, station administrator" path = /obj/item/clothing/suit/storage/hooded/wintercoat/captain - allowed_roles = list("Captain") + allowed_roles = list("Station Administrator") /datum/gear/suit/wintercoat/security display_name = "winter coat, security" diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index fe8017b6aab..041751d5c9f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -284,9 +284,9 @@ path = /obj/item/clothing/under/dress/dress_fire /datum/gear/uniform/uniform_captain - display_name = "uniform, captain's dress" + display_name = "uniform, station administrator's dress" path = /obj/item/clothing/under/dress/dress_cap - allowed_roles = list("Captain") + allowed_roles = list("Station Administrator") /datum/gear/uniform/corpdetsuit display_name = "uniform, corporate (Detective)" diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index d5cddbc9376..40d1efb7482 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -35,3 +35,8 @@ /datum/gear/utility/paicard display_name = "personal AI device" path = /obj/item/device/paicard + +/datum/gear/utility/securecase + display_name = "secure briefcase" + path =/obj/item/weapon/storage/secure/briefcase + cost = 2 \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm index 9f814743aea..b8ed50c23fa 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm @@ -2,14 +2,12 @@ /datum/gear/suit/zhan_furs display_name = "Zhan-Khazan furs (Tajara)" path = /obj/item/clothing/suit/tajaran/furs - whitelisted = "Tajara" sort_category = "Xenowear" /datum/gear/suit/unathi_mantle display_name = "hide mantle (Unathi)" path = /obj/item/clothing/suit/unathi/mantle cost = 1 - whitelisted = "Unathi" sort_category = "Xenowear" /datum/gear/ears/skrell/chains //Chains @@ -25,7 +23,7 @@ var/obj/item/clothing/ears/skrell/chain/chain = chain_style chaintypes[initial(chain.name)] = chain gear_tweaks += new/datum/gear_tweak/path(sortAssoc(chaintypes)) - + /datum/gear/ears/skrell/bands display_name = "headtail band selection (Skrell)" path = /obj/item/clothing/ears/skrell/band @@ -39,7 +37,7 @@ var/obj/item/clothing/ears/skrell/band/band = band_style bandtypes[initial(band.name)] = band gear_tweaks += new/datum/gear_tweak/path(sortAssoc(bandtypes)) - + /datum/gear/ears/skrell/cloth/male display_name = "male headtail cloth selection (Skrell)" path = /obj/item/clothing/ears/skrell/cloth_male @@ -73,17 +71,17 @@ path = /obj/item/clothing/ears/skrell/colored/band sort_category = "Xenowear" whitelisted = "Skrell" - + /datum/gear/ears/skrell/colored/band/New() ..() gear_tweaks = list(gear_tweak_free_color_choice) - + /datum/gear/ears/skrell/colored/chain display_name = "Colored chain (Skrell)" path = /obj/item/clothing/ears/skrell/colored/chain sort_category = "Xenowear" whitelisted = "Skrell" - + /datum/gear/ears/skrell/colored/chain/New() ..() gear_tweaks = list(gear_tweak_free_color_choice) @@ -123,3 +121,9 @@ display_name = "gear harness (Full Body Prosthetic, Diona)" path = /obj/item/clothing/under/harness sort_category = "Xenowear" + +/datum/gear/uniform/loincloth + display_name = "loincloth (Tajaran, Unathi)" + path = /obj/item/clothing/under/shorts/loincloth + sort_category = "Xenowear" + whitelisted = list("Tajaran", "Unathi") diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index 832d529d7c1..f72ff0645c0 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -129,8 +129,6 @@ // Need due to, for example, the 01_basic module relying on species having been loaded to sanitize correctly but that isn't loaded until module 03_body. for(var/datum/category_item/player_setup_item/PI in items) PI.load_character(S) - for(var/datum/category_item/player_setup_item/PI in items) - PI.sanitize_character() /datum/category_group/player_setup_category/proc/save_character(var/savefile/S) // Sanitize all data, then save it @@ -142,8 +140,6 @@ /datum/category_group/player_setup_category/proc/load_preferences(var/savefile/S) for(var/datum/category_item/player_setup_item/PI in items) PI.load_preferences(S) - for(var/datum/category_item/player_setup_item/PI in items) - PI.sanitize_preferences() /datum/category_group/player_setup_category/proc/save_preferences(var/savefile/S) for(var/datum/category_item/player_setup_item/PI in items) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 4aeaf7c800d..db12940bd9a 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -237,12 +237,14 @@ datum/preferences else if(href_list["reload"]) load_preferences() load_character() + sanitize_preferences() else if(href_list["load"]) if(!IsGuestKey(usr.key)) open_load_dialog(usr) return 1 else if(href_list["changeslot"]) load_character(text2num(href_list["changeslot"])) + sanitize_preferences() close_load_dialog(usr) else return 0 diff --git a/code/modules/client/preferences_factions.dm b/code/modules/client/preferences_factions.dm index 030c8d08a39..214d8e6a9c4 100644 --- a/code/modules/client/preferences_factions.dm +++ b/code/modules/client/preferences_factions.dm @@ -17,7 +17,7 @@ var/global/list/citizenship_choices = list( "Earth", "Mars", "Moghes", - "Ahdomai", + "Meralar", "Qerrbalak" ) @@ -28,7 +28,7 @@ var/global/list/home_system_choices = list( "Tau Ceti", "Qerr'Vallis", "Epsilon Ursae Minoris", - "S'randarr" + "Rarkajar" ) var/global/list/faction_choices = list( @@ -44,7 +44,7 @@ var/global/list/faction_choices = list( "Zeng-Hu Pharmaceuticals", "Hesphaistos Industries" ) - + var/global/list/antag_faction_choices = list() //Should be populated after brainstorming. Leaving as blank in case brainstorming does not occur. var/global/list/antag_visiblity_choices = list( diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b78d78f3ffc..ec3a210e4e3 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -467,6 +467,8 @@ "Teshari" = 'icons/mob/species/seromi/suit.dmi' ) + valid_accessory_slots = list("over") + /obj/item/clothing/suit/update_clothing_icon() if (ismob(src.loc)) var/mob/M = src.loc @@ -505,7 +507,7 @@ //convenience var for defining the icon state for the overlay used when the clothing is worn. //Also used by rolling/unrolling. var/worn_state = null - valid_accessory_slots = list("utility","armband","decor") + valid_accessory_slots = list("utility","armband","decor","over") restricted_accessory_slots = list("utility", "armband") diff --git a/code/modules/clothing/gloves/arm_guards.dm b/code/modules/clothing/gloves/arm_guards.dm index fa9036e2cd2..2108cd48e83 100644 --- a/code/modules/clothing/gloves/arm_guards.dm +++ b/code/modules/clothing/gloves/arm_guards.dm @@ -2,7 +2,7 @@ name = "arm guards" desc = "These arm guards will protect your hands and arms." body_parts_covered = HANDS|ARMS - slowdown = 1 + slowdown = 0.5 overgloves = 1 w_class = 3 diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 9d53f8cdb0b..12378997942 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -1,6 +1,6 @@ /obj/item/clothing/gloves/captain desc = "Regal blue gloves, with a nice gold trim. Swanky." - name = "captain's gloves" + name = "station administrator's gloves" icon_state = "captain" item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue") diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 2253fe6d478..fe6432796cd 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -44,7 +44,7 @@ body_parts_covered = 0 /obj/item/clothing/head/collectable/captain - name = "collectable captain's hat" + name = "collectable station administrator's hat" desc = "A Collectable Hat that'll make you look just like a real comdom!" icon_state = "captain" body_parts_covered = 0 diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 9d4ec828b12..ea982569253 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -7,13 +7,13 @@ //Captain /obj/item/clothing/head/caphat - name = "captain's hat" + name = "station administrator's hat" icon_state = "captain" desc = "It's good being the king." body_parts_covered = 0 /obj/item/clothing/head/caphat/cap - name = "captain's cap" + name = "station administrator's cap" desc = "You fear to wear it for the negligence it brings." icon_state = "capcap" @@ -32,7 +32,8 @@ /obj/item/clothing/head/chaplain_hood name = "chaplain's hood" desc = "It's hood that covers the head. It keeps you warm during the space winters." - icon_state = "beret_black" + icon_state = "chaplain_hood" + item_state_slots = list(slot_r_hand_str = "beret_black", slot_l_hand_str = "beret_black") flags_inv = BLOCKHAIR body_parts_covered = HEAD diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 09cc0356ad9..5403fe4ffb0 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -5,6 +5,11 @@ siemens_coefficient = 0.9 body_parts_covered = 0 +/obj/item/clothing/head/centhat/customs + name = "Customs Hat" + desc = "A formal hat for SolGov Customs Officers." + icon_state = "customshat" + /obj/item/clothing/head/hairflower name = "hair flower pin" icon_state = "hairflower" @@ -73,13 +78,13 @@ /obj/item/clothing/head/nursehat name = "nurse's hat" desc = "It allows quick identification of trained medical personnel." - item_state_slots = list(slot_r_hand_str = "nursehat", slot_l_hand_str = "nursehat") + icon_state = "nursehat" siemens_coefficient = 0.9 body_parts_covered = 0 /obj/item/clothing/head/syndicatefake name = "red space-helmet replica" - item_state_slots = list(slot_r_hand_str = "syndicate-helm-black-red", slot_l_hand_str = "syndicate-helm-black-red") + item_state_slots = list(slot_r_hand_str = "syndicate-helm-black-red", slot_l_hand_str = "syndicate-helm-black-red") icon_state = "syndicate" desc = "A plastic replica of a bloodthirsty mercenary's space helmet, you'll look just like a real murderous criminal operative in this! This is a toy, it is not made for use in space!" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|BLOCKHAIR @@ -125,7 +130,7 @@ /obj/item/clothing/head/justice/pink icon_state = "justicepink" - + /obj/item/clothing/head/rabbitears name = "rabbit ears" desc = "Wearing these makes you looks useless, and only good for your sex appeal." @@ -202,7 +207,7 @@ name = "fez" icon_state = "fez" desc = "You should wear a fez. Fezzes are cool." - + /obj/item/clothing/head/cowboy_hat name = "cowboy hat" desc = "For those that have spurs that go jingle jangle jingle." @@ -277,3 +282,21 @@ item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white") body_parts_covered = 0 flags_inv = BLOCKHAIR + +/obj/item/clothing/head/beanie + name = "beanie" + desc = "A head-hugging brimless winter cap. This one is tight." + icon_state = "beanie" + body_parts_covered = 0 + +/obj/item/clothing/head/beanie_loose + name = "loose beanie" + desc = "A head-hugging brimless winter cap. This one is loose." + icon_state = "beanie_hang" + body_parts_covered = 0 + +/obj/item/clothing/head/beretg + name = "beret" + desc = "A beret, an artists favorite headwear." + icon_state = "beret_g" + body_parts_covered = 0 \ No newline at end of file diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index f79b7ca4f03..43bcce5e51b 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -46,7 +46,7 @@ /obj/item/clothing/shoes/rainbow name = "rainbow shoes" - desc = "Very gay shoes." + desc = "Very colourful shoes." icon_state = "rain_bow" /obj/item/clothing/shoes/flats diff --git a/code/modules/clothing/shoes/leg_guards.dm b/code/modules/clothing/shoes/leg_guards.dm index b063e2b50ac..640b6c2e062 100644 --- a/code/modules/clothing/shoes/leg_guards.dm +++ b/code/modules/clothing/shoes/leg_guards.dm @@ -2,7 +2,7 @@ name = "leg guards" desc = "These will protect your legs and feet." body_parts_covered = LEGS|FEET - slowdown = 0 //Shoes have a slowdown of -1, so this needs to be 0 in order for it to effectively be 1 slowdown. + slowdown = SHOES_SLOWDOWN+0.5 species_restricted = null //Unathi and Taj can wear leg armor now w_class = 3 diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index f6423106a5f..723d8021865 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -199,4 +199,9 @@ cold_protection = FEET|LEGS min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE heat_protection = FEET|LEGS - max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE + max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE + +/obj/item/clothing/shoes/flipflop + name = "flip flops" + desc = "A pair of foam flip flops. For those not afraid to show a little ankle." + icon_state = "thongsandal" diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index c8d73b0f3e1..f9884846eec 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -10,7 +10,7 @@ //Captain's space suit This is not the proper path but I don't currently know enough about how this all works to mess with it. /obj/item/clothing/suit/armor/captain - name = "Captain's armor" + name = "Station Administrator's armor" desc = "A bulky, heavy-duty piece of exclusive corporate armor. YOU are in charge!" icon_state = "caparmor" w_class = 5 diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index cb269daa2e1..becbd2a4696 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -168,7 +168,7 @@ /obj/item/rig_module/self_destruct name = "self-destruct module" - desc = "Oh my God, Captain. A bomb." + desc = "Oh my God, Station Administrator. A bomb." icon_state = "deadman" usable = 1 active = 1 diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index ae064dd2a89..23a5a69039b 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -15,6 +15,7 @@ req_one_access = list() req_access = list() w_class = 5 + action_button_name = "Toggle Heatsink" // These values are passed on to all component pieces. armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20) @@ -54,6 +55,12 @@ var/image/mob_icon // Holder for on-mob icon. var/list/installed_modules = list() // Power consumption/use bookkeeping. + // Cooling system vars. + var/cooling_on = 0 //is it turned on? + var/max_cooling = 15 // in degrees per second - probably don't need to mess with heat capacity here + var/charge_consumption = 2 // charge per second at max_cooling //more effective on a rig, because it's all built in already + var/thermostat = T20C + // Rig status vars. var/open = 0 // Access panel status. var/locked = 1 // Lock status. @@ -91,8 +98,13 @@ usr << "\icon[piece] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed." if(src.loc == usr) + usr << "The access panel is [locked? "locked" : "unlocked"]." usr << "The maintenance panel is [open ? "open" : "closed"]." usr << "Hardsuit systems are [offline ? "offline" : "online"]." + usr << "The cooling stystem is [cooling_on ? "active" : "inactive"]." + + if(open) + usr << "It's equipped with [english_list(installed_modules)]." /obj/item/weapon/rig/New() ..() @@ -298,8 +310,97 @@ piece.item_flags |= (STOPPRESSUREDAMAGE|AIRTIGHT) update_icon(1) -/obj/item/weapon/rig/process() +/obj/item/weapon/rig/ui_action_click() + toggle_cooling(usr) +/obj/item/weapon/rig/proc/toggle_cooling(var/mob/user) + if(cooling_on) + turn_cooling_off(user) + else + turn_cooling_on(user) + +/obj/item/weapon/rig/proc/turn_cooling_on(var/mob/user) + if(!cell) + return + if(cell.charge <= 0) + user << "\The [src] has no power!." + return + if(!suit_is_deployed()) + user << "The hardsuit needs to be deployed first!." + return + + cooling_on = 1 + usr << "You switch \the [src]'s cooling system on." + + +/obj/item/weapon/rig/proc/turn_cooling_off(var/mob/user, var/failed) + if(failed) visible_message("\The [src]'s cooling system clicks and whines as it powers down.") + else usr << "You switch \the [src]'s cooling system off." + cooling_on = 0 + +/obj/item/weapon/rig/proc/get_environment_temperature() + if (ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(istype(H.loc, /obj/mecha)) + var/obj/mecha/M = H.loc + return M.return_temperature() + else if(istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell)) + var/obj/machinery/atmospherics/unary/cryo_cell/cryo = H.loc + return cryo.air_contents.temperature + + var/turf/T = get_turf(src) + if(istype(T, /turf/space)) + return 0 //space has no temperature, this just makes sure the cooling unit works in space + + var/datum/gas_mixture/environment = T.return_air() + if (!environment) + return 0 + + return environment.temperature + +/obj/item/weapon/rig/proc/attached_to_back(mob/M) + if (!ishuman(M)) + return 0 + + var/mob/living/carbon/human/H = M + + if (!H.wear_suit || H.back != src) + return 0 + + return 1 + +/obj/item/weapon/rig/proc/coolingProcess() + if (!cooling_on || !cell) + return + + if (!ismob(loc)) + return + + if (!attached_to_back(loc)) //make sure the rig's not just in their hands + return + + if (!suit_is_deployed()) //inbuilt systems only work on the suit they're designed to work on + return + + var/mob/living/carbon/human/H = loc + + var/efficiency = 1 - H.get_pressure_weakness() //you need to have a good seal for effective cooling + var/env_temp = get_environment_temperature() //wont save you from a fire + var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling) + + if (temp_adj < 0.5) //only cools, doesn't heat, also we don't need extreme precision + return + + var/charge_usage = (temp_adj/max_cooling)*charge_consumption + + H.bodytemperature -= temp_adj*efficiency + + cell.use(charge_usage) + + if(cell.charge <= 0) + turn_cooling_off(H, 1) + +/obj/item/weapon/rig/process() // If we've lost any parts, grab them back. var/mob/living/M for(var/obj/item/piece in list(gloves,boots,helmet,chest)) @@ -308,6 +409,8 @@ M = piece.loc M.unEquip(piece) piece.forceMove(src) + // Run through cooling + coolingProcess() if(!istype(wearer) || loc != wearer || wearer.back != src || canremove || !cell || cell.charge <= 0) if(!cell || cell.charge <= 0) diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 270d21cfebd..17d5d534259 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -61,7 +61,7 @@ desc = "A heavy, powerful rig used by construction crews and mining corporations." icon_state = "engineering_rig" armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 50) - slowdown = 3 + slowdown = 1 offline_slowdown = 10 offline_vision_restriction = 2 emp_protection = -20 @@ -168,7 +168,7 @@ helm_type = /obj/item/clothing/head/helmet/space/rig/ert - allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/box/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) + 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) req_access = list() req_one_access = list() diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index dde178e33db..13db80ae391 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -5,7 +5,7 @@ desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." icon_state = "rig0-engineering" item_state_slots = list(slot_r_hand_str = "eng_helm", slot_l_hand_str = "eng_helm") - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) + armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80) /obj/item/clothing/suit/space/void/engineering name = "engineering voidsuit" @@ -13,7 +13,7 @@ icon_state = "rig-engineering" item_state_slots = list(slot_r_hand_str = "eng_voidsuit", slot_l_hand_str = "eng_voidsuit") slowdown = 1 - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) + armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80) 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) //Mining @@ -22,7 +22,7 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has reinforced plating." icon_state = "rig0-mining" item_state_slots = list(slot_r_hand_str = "mining_helm", slot_l_hand_str = "mining_helm") - armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20) + armor = list(melee = 50, bullet = 5, laser = 20, energy = 5, bomb = 55, bio = 100, rad = 20) light_overlay = "helmet_light_dual" /obj/item/clothing/suit/space/void/mining @@ -30,7 +30,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating." icon_state = "rig-mining" item_state_slots = list(slot_r_hand_str = "mining_voidsuit", slot_l_hand_str = "mining_voidsuit") - armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20) + armor = list(melee = 50, bullet = 5, laser = 20, energy = 5, bomb = 55, bio = 100, rad = 20) //Medical /obj/item/clothing/head/helmet/space/void/medical @@ -38,7 +38,7 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has minor radiation shielding." icon_state = "rig0-medical" item_state_slots = list(slot_r_hand_str = "medical_helm", slot_l_hand_str = "medical_helm") - armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50) + armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50) /obj/item/clothing/suit/space/void/medical name = "medical voidsuit" @@ -46,7 +46,7 @@ icon_state = "rig-medical" item_state_slots = list(slot_r_hand_str = "medical_voidsuit", slot_l_hand_str = "medical_voidsuit") 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) - armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50) + armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50) //Security /obj/item/clothing/head/helmet/space/void/security @@ -54,7 +54,7 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor." icon_state = "rig0-sec" item_state_slots = list(slot_r_hand_str = "sec_helm", slot_l_hand_str = "sec_helm") - armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10) + armor = list(melee = 50, bullet = 25, laser = 25, energy = 5, bomb = 45, bio = 100, rad = 10) siemens_coefficient = 0.7 light_overlay = "helmet_light_dual" @@ -63,7 +63,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor." icon_state = "rig-sec" item_state_slots = list(slot_r_hand_str = "sec_voidsuit", slot_l_hand_str = "sec_voidsuit") - armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10) + armor = list(melee = 50, bullet = 25, laser = 25, energy = 5, bomb = 45, bio = 100, rad = 10) 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) siemens_coefficient = 0.7 @@ -73,7 +73,7 @@ name = "atmospherics voidsuit helmet" icon_state = "rig0-atmos" item_state_slots = list(slot_r_hand_str = "atmos_helm", slot_l_hand_str = "atmos_helm") - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 50) + armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 50) max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE light_overlay = "helmet_light_dual" @@ -82,5 +82,5 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding." icon_state = "rig-atmos" item_state_slots = list(slot_r_hand_str = "atmos_voidsuit", slot_l_hand_str = "atmos_voidsuit") - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 50) + armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 50) max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE \ No newline at end of file diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index cb3f20749bf..0260142abbe 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -14,15 +14,15 @@ //Captain /obj/item/clothing/suit/captunic - name = "captain's parade tunic" - desc = "Worn by a Captain to show their class." + name = "station administrator's parade tunic" + desc = "Worn by a Station Administrator to show their class." icon_state = "captunic" body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEJUMPSUIT /obj/item/clothing/suit/captunic/capjacket - name = "captain's uniform jacket" - desc = "A less formal jacket for everyday captain use." + name = "station administrator's uniform jacket" + desc = "A less formal jacket for everyday Station Administrator use." icon_state = "capjacket" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index c93bb207602..fecc19b5a27 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -55,7 +55,7 @@ flags = CONDUCT fire_resist = T0C+5200 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - + /obj/item/clothing/suit/greatcoat name = "great coat" desc = "A heavy great coat" @@ -92,6 +92,31 @@ blood_overlay_type = "armor" body_parts_covered = UPPER_TORSO|LOWER_TORSO +/obj/item/clothing/suit/wcoat/red + name = "red waistcoat" + icon_state = "red_waistcoat" + +/obj/item/clothing/suit/wcoat/grey + name = "grey waistcoat" + icon_state = "grey_waistcoat" + +/obj/item/clothing/suit/wcoat/brown + name = "brown waistcoat" + icon_state = "brown_waistcoat" + +/obj/item/clothing/suit/wcoat/swvest + name = "black sweatervest" + desc = "A sleeveless sweater. Wear this if you don't want your arms to be warm, or if you're a nerd." + icon_state = "sweatervest" + +/obj/item/clothing/suit/wcoat/swvest/blue + name = "blue sweatervest" + icon_state = "sweatervest_blue" + +/obj/item/clothing/suit/wcoat/swvest/red + name = "red sweatervest" + icon_state = "sweatervest_red" + /obj/item/clothing/suit/apron/overalls name = "coveralls" desc = "A set of denim overalls." @@ -197,7 +222,13 @@ desc = "A flowing, black coat." icon_state = "neocoat" item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") - + +/obj/item/clothing/suit/customs + name = "customs jacket" + desc = "A standard SolGov Customs formal jacket." + icon_state = "customs_jacket" + item_state_slots = list(slot_r_hand_str = "suit_blue", slot_l_hand_str = "suit_blue") + /* * stripper */ @@ -224,59 +255,6 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT siemens_coefficient = 2.0 -/* - * Poncho - */ -/obj/item/clothing/suit/poncho - name = "poncho" - desc = "A simple, comfortable poncho." - icon_state = "classicponcho" - -/obj/item/clothing/suit/poncho/green - name = "green poncho" - desc = "A simple, comfortable cloak without sleeves. This one is green." - icon_state = "greenponcho" - -/obj/item/clothing/suit/poncho/red - name = "red poncho" - desc = "A simple, comfortable cloak without sleeves. This one is red." - icon_state = "redponcho" - -/obj/item/clothing/suit/poncho/purple - name = "purple poncho" - desc = "A simple, comfortable cloak without sleeves. This one is purple." - icon_state = "purpleponcho" - -/obj/item/clothing/suit/poncho/blue - name = "blue poncho" - desc = "A simple, comfortable cloak without sleeves. This one is blue." - icon_state = "blueponcho" - -/obj/item/clothing/suit/poncho/roles/security - name = "security poncho" - desc = "A simple, comfortable cloak without sleeves. This one is black and red, standard NanoTrasen Security colors." - icon_state = "secponcho" - -/obj/item/clothing/suit/poncho/roles/medical - name = "medical poncho" - desc = "A simple, comfortable cloak without sleeves. This one is white with green and blue tint, standard Medical colors." - icon_state = "medponcho" - -/obj/item/clothing/suit/poncho/roles/engineering - name = "engineering poncho" - desc = "A simple, comfortable cloak without sleeves. This one is yellow and orange, standard Engineering colors." - icon_state = "engiponcho" - -/obj/item/clothing/suit/poncho/roles/science - name = "science poncho" - desc = "A simple, comfortable cloak without sleeves. This one is white with purple trim, standard NanoTrasen Science colors." - icon_state = "sciponcho" - -/obj/item/clothing/suit/poncho/roles/cargo - name = "cargo poncho" - desc = "A simple, comfortable cloak without sleeves. This one is tan and grey, the colors of Cargo." - icon_state = "cargoponcho" - /obj/item/clothing/suit/jacket/puffer name = "puffer jacket" desc = "A thick jacket with a rubbery, water-resistant shell." @@ -524,7 +502,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE /obj/item/clothing/suit/storage/hooded/wintercoat/captain - name = "captain's winter coat" + name = "station administrator's winter coat" icon_state = "coatcaptain" item_state_slots = list(slot_r_hand_str = "coatcaptain", slot_l_hand_str = "coatcaptain") armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0) @@ -732,4 +710,4 @@ icon_open = "suitjacket_green_open" icon_closed = "suitjacket_green" blood_overlay_type = "coat" - body_parts_covered = UPPER_TORSO|ARMS + body_parts_covered = UPPER_TORSO|ARMS diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 59b2ba17975..9878420d7cc 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -26,4 +26,90 @@ /obj/item/clothing/accessory/checkered_jacket name = "checkered suit jacket" desc = "Lucky suit jacket." - icon_state = "checkered_jacket" \ No newline at end of file + icon_state = "checkered_jacket" + +/obj/item/clothing/accessory/chaps + name = "brown chaps" + desc = "A pair of loose, brown leather chaps." + icon_state = "chaps" + +/obj/item/clothing/accessory/chaps/black + name = "black chaps" + desc = "A pair of loose, black leather chaps." + icon_state = "chaps_black" + +/* + * Poncho + */ +/obj/item/clothing/accessory/poncho + name = "poncho" + desc = "A simple, comfortable poncho." + icon_state = "classicponcho" + item_state = "classicponcho" + icon_override = 'icons/mob/ties.dmi' + var/fire_resist = T0C+100 + allowed = list(/obj/item/weapon/tank/emergency_oxygen) + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + slot_flags = SLOT_OCLOTHING | SLOT_TIE + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + siemens_coefficient = 0.9 + w_class = 3 + slot = "over" + + sprite_sheets = list( + "Teshari" = 'icons/mob/species/seromi/suit.dmi' + ) + +/obj/item/clothing/accessory/poncho/green + name = "green poncho" + desc = "A simple, comfortable cloak without sleeves. This one is green." + icon_state = "greenponcho" + item_state = "greenponcho" + +/obj/item/clothing/accessory/poncho/red + name = "red poncho" + desc = "A simple, comfortable cloak without sleeves. This one is red." + icon_state = "redponcho" + item_state = "redponcho" + +/obj/item/clothing/accessory/poncho/purple + name = "purple poncho" + desc = "A simple, comfortable cloak without sleeves. This one is purple." + icon_state = "purpleponcho" + item_state = "purpleponcho" + +/obj/item/clothing/accessory/poncho/blue + name = "blue poncho" + desc = "A simple, comfortable cloak without sleeves. This one is blue." + icon_state = "blueponcho" + item_state = "blueponcho" + +/obj/item/clothing/accessory/poncho/roles/security + name = "security poncho" + desc = "A simple, comfortable cloak without sleeves. This one is black and red, standard NanoTrasen Security colors." + icon_state = "secponcho" + item_state = "secponcho" + +/obj/item/clothing/accessory/poncho/roles/medical + name = "medical poncho" + desc = "A simple, comfortable cloak without sleeves. This one is white with green and blue tint, standard Medical colors." + icon_state = "medponcho" + item_state = "medponcho" + +/obj/item/clothing/accessory/poncho/roles/engineering + name = "engineering poncho" + desc = "A simple, comfortable cloak without sleeves. This one is yellow and orange, standard Engineering colors." + icon_state = "engiponcho" + item_state = "engiponcho" + +/obj/item/clothing/accessory/poncho/roles/science + name = "science poncho" + desc = "A simple, comfortable cloak without sleeves. This one is white with purple trim, standard NanoTrasen Science colors." + icon_state = "sciponcho" + item_state = "sciponcho" + +/obj/item/clothing/accessory/poncho/roles/cargo + name = "cargo poncho" + desc = "A simple, comfortable cloak without sleeves. This one is tan and grey, the colors of Cargo." + icon_state = "cargoponcho" + item_state = "cargoponcho" \ No newline at end of file diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 6e922f57440..0f175ad0e99 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -7,8 +7,8 @@ rolled_sleeves = 0 /obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define. - desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"." - name = "captain's jumpsuit" + desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Station Administrator\"." + name = "station administrator's jumpsuit" icon_state = "captain" rolled_sleeves = 0 diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index e3c1d6b45de..e673de378c1 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -33,6 +33,14 @@ icon_state = "waiter" rolled_sleeves = 0 +/obj/item/clothing/under/customs + name = "customs uniform" + desc = "A standard SolGov customs uniform. Complete with epaulettes." + icon_state = "cu_suit" + +/obj/item/clothing/under/customs/khaki + icon_state = "cu_suit_kh" + /obj/item/clothing/under/rank/mailman name = "mailman's jumpsuit" desc = "'Special delivery!'" @@ -145,7 +153,7 @@ rolled_sleeves = 0 /obj/item/clothing/under/gimmick/rank/captain/suit - name = "captain's suit" + name = "station administrator's suit" desc = "A green suit and yellow necktie. Exemplifies authority." icon_state = "green_suit" item_state_slots = list(slot_r_hand_str = "centcom", slot_l_hand_str = "centcom") @@ -217,6 +225,7 @@ desc = "Includes shoes and plaid" icon_state = "kilt" body_parts_covered = UPPER_TORSO|LOWER_TORSO|FEET + rolled_sleeves = 0 /obj/item/clothing/under/sexymime name = "sexy mime outfit" @@ -253,7 +262,7 @@ /obj/item/clothing/under/dress/stripeddress name = "striped dress" desc = "Fashion in space." - icon_state = "striped_dress" + icon_state = "striped_dress" /obj/item/clothing/under/dress/sailordress name = "sailor dress" @@ -307,8 +316,8 @@ item_state_slots = list(slot_r_hand_str = "dress_white", slot_l_hand_str = "dress_white") /obj/item/clothing/under/dress/dress_cap - name = "captain's dress uniform" - desc = "Feminine fashion for the style concious captain." + name = "station administrator's dress uniform" + desc = "Feminine fashion for the style concious Station Administrator." icon_state = "dress_cap" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -374,8 +383,8 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/captainformal - name = "captain's formal uniform" - desc = "A captain's formal-wear, for special occasions." + name = "station administrator's formal uniform" + desc = "A Station Administrator's formal-wear, for special occasions." icon_state = "captain_formal" item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue") @@ -529,7 +538,7 @@ name = "fancy dark red dress" desc = "A short, red dress with a black belt. Fancy." icon_state = "darkreddress" - + /* * swimsuit */ @@ -566,7 +575,7 @@ desc = "An oldfashioned red swimsuit." icon_state = "swim_red" siemens_coefficient = 1 - + /* * pyjamas */ @@ -583,7 +592,7 @@ icon_state = "red_pyjamas" item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red") body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS - + /obj/item/clothing/under/stripper body_parts_covered = 0 @@ -598,7 +607,7 @@ desc = "A rather skimpy green swimsuit." icon_state = "stripper_g_under" siemens_coefficient = 1 - + /obj/item/clothing/under/stripper/mankini name = "mankini" desc = "No honest man would wear this abomination" diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm index 3cfc550e437..3c210cc0c07 100644 --- a/code/modules/clothing/under/pants.dm +++ b/code/modules/clothing/under/pants.dm @@ -82,6 +82,16 @@ desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station." icon_state = "camopants" +/obj/item/clothing/under/pants/chaps + name = "sexy brown chaps" + desc = "A pair of sexy, tight brown leather chaps." + icon_state = "chapsb" + +/obj/item/clothing/under/pants/chaps/black + name = "sexy black chaps" + desc = "A pair of sexy, tight black leather chaps." + icon_state = "chapsbl" + /* * Baggy Pants */ diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index 0690b49565e..59db7aaab57 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -83,6 +83,11 @@ name = "khaki short shorts" icon_state = "khaki_shorts_f" +/obj/item/clothing/under/shorts/loincloth + name = "loincloth" + desc = "A piece of cloth wrapped around the waist." + icon_state = "loincloth" + //Argh, skirts be below this line -> ------------------------------ /obj/item/clothing/under/skirt @@ -128,50 +133,50 @@ desc = "A preppy red skirt with a white blouse." icon_state = "plaid_red" item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red") - + /obj/item/clothing/under/skirt/plaid_purple name = "blue purple skirt" desc = "A preppy purple skirt with a white blouse." icon_state = "plaid_purple" item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple") - + /obj/item/clothing/under/rank/cargo/skirt name = "quartermaster's jumpskirt" desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." icon_state = "qmf" item_state_slots = list(slot_r_hand_str = "qm", slot_l_hand_str = "qm") - + /obj/item/clothing/under/rank/cargotech/skirt name = "cargo technician's jumpskirt" desc = "Skirrrrrts! They're comfy and easy to wear!" icon_state = "cargof" item_state_slots = list(slot_r_hand_str = "cargo", slot_l_hand_str = "cargo") - + /obj/item/clothing/under/rank/engineer/skirt desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding." name = "engineer's jumpskirt" icon_state = "enginef" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) item_state_slots = list(slot_r_hand_str = "engine", slot_l_hand_str = "engine") - + /obj/item/clothing/under/rank/chief_engineer/skirt desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding." name = "chief engineer's jumpskirt" icon_state = "chieff" item_state_slots = list(slot_r_hand_str = "chiefengineer", slot_l_hand_str = "chiefengineer") - + /obj/item/clothing/under/rank/atmospheric_technician/skirt desc = "It's a jumpskirt worn by atmospheric technicians." name = "atmospheric technician's jumpskirt" icon_state = "atmosf" item_state_slots = list(slot_r_hand_str = "atmos", slot_l_hand_str = "atmos") - + /obj/item/clothing/under/rank/roboticist/skirt desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work." name = "roboticist's jumpskirt" icon_state = "roboticsf" item_state_slots = list(slot_r_hand_str = "robotics", slot_l_hand_str = "robotics") - + /obj/item/clothing/under/rank/scientist/skirt name = "scientist's jumpskirt" icon_state = "sciencef" diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm index 9fc49b1bf7c..3d442dfb4ab 100644 --- a/code/modules/detectivework/microscope/dnascanner.dm +++ b/code/modules/detectivework/microscope/dnascanner.dm @@ -17,7 +17,6 @@ var/report_num = 0 /obj/machinery/dnaforensics/New() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/console_screen(src) component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 06ee34b3128..b16c03f0ef4 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -97,7 +97,7 @@ user << "The [initial(name)] is dry!" else user.visible_message("\The [user] starts to wipe down [A] with [src]!") - reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping. + //reagents.splash(A, 1) //get a small amount of liquid on the thing we're wiping. update_name() if(do_after(user,30)) user.visible_message("\The [user] finishes wiping off the [A]!") diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index bc0388d40d9..688f562f9a8 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -80,24 +80,7 @@ log transactions return 1 /obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "atm" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "atm_4" - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) return if(istype(I, /obj/item/weapon/card)) if(emagged > 0) @@ -131,7 +114,7 @@ log transactions T.amount = I:worth T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() authenticated_account.transaction_log.Add(T) user << "You insert [I] into [src]." @@ -260,7 +243,7 @@ log transactions T.purpose = transfer_purpose T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() T.amount = "([transfer_amount])" authenticated_account.transaction_log.Add(T) else @@ -302,7 +285,7 @@ log transactions T.purpose = "Unauthorised login attempt" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() failed_account.transaction_log.Add(T) else usr << "\red \icon[src] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining." @@ -322,7 +305,7 @@ log transactions T.purpose = "Remote terminal access" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() authenticated_account.transaction_log.Add(T) usr << "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'" @@ -350,7 +333,7 @@ log transactions T.amount = "([amount])" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() authenticated_account.transaction_log.Add(T) else usr << "\icon[src]You don't have enough funds to do that!" @@ -375,7 +358,7 @@ log transactions T.amount = "([amount])" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() authenticated_account.transaction_log.Add(T) else usr << "\icon[src]You don't have enough funds to do that!" @@ -387,7 +370,7 @@ log transactions R.info += "Account holder: [authenticated_account.owner_name]
              " R.info += "Account number: [authenticated_account.account_number]
              " R.info += "Balance: $[authenticated_account.money]
              " - R.info += "Date and time: [worldtime2text()], [current_date_string]

              " + R.info += "Date and time: [stationtime2text()], [current_date_string]

              " R.info += "Service terminal ID: [machine_id]
              " //stamp the paper @@ -410,7 +393,7 @@ log transactions R.info = "Transaction logs
              " R.info += "Account holder: [authenticated_account.owner_name]
              " R.info += "Account number: [authenticated_account.account_number]
              " - R.info += "Date and time: [worldtime2text()], [current_date_string]

              " + R.info += "Date and time: [stationtime2text()], [current_date_string]

              " R.info += "Service terminal ID: [machine_id]
              " R.info += "
    Command
    SpecialCaptain
    SpecialStation AdministratorCustom
    " R.info += "" @@ -486,7 +469,7 @@ log transactions T.purpose = "Remote terminal access" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() authenticated_account.transaction_log.Add(T) view_screen = NO_SCREEN diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm index 712c591741f..cfd720d4dc8 100644 --- a/code/modules/economy/Accounts.dm +++ b/code/modules/economy/Accounts.dm @@ -40,7 +40,7 @@ M.account_number = rand(111111, 999999) else T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() T.source_terminal = source_db.machine_id M.account_number = next_account_number @@ -57,7 +57,7 @@ R.info += "Account number: [M.account_number]
    " R.info += "Account pin: [M.remote_access_pin]
    " R.info += "Starting balance: $[M.money]
    " - R.info += "Date and time: [worldtime2text()], [current_date_string]

    " + R.info += "Date and time: [stationtime2text()], [current_date_string]

    " R.info += "Creation terminal ID: [source_db.machine_id]
    " R.info += "Authorised NT officer overseeing creation: [source_db.held_card.registered_name]
    " @@ -80,7 +80,7 @@ for(var/datum/money_account/D in all_money_accounts) if(D.account_number == attempt_account_number && !D.suspended) D.money += amount - + //create a transaction log entry var/datum/transaction/T = new() T.target_name = source_name @@ -90,12 +90,12 @@ else T.amount = "[amount]" T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() T.source_terminal = terminal_id D.transaction_log.Add(T) - + return 1 - + return 0 //this returns the first account datum that matches the supplied accnum/pin combination, it returns null if the combination did not match any account diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm index 20278d07574..200c3c83200 100644 --- a/code/modules/economy/Accounts_DB.dm +++ b/code/modules/economy/Accounts_DB.dm @@ -28,7 +28,7 @@ T.purpose = reason T.amount = amount T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() T.source_terminal = machine_id return T diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index 003816e04c5..21ef8b4bfad 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -140,7 +140,7 @@ T.amount = transaction_amount T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() linked_account.transaction_log.Add(T) else usr << "\icon[src]\The [O] doesn't have that much money!" @@ -264,7 +264,7 @@ T.amount = "[transaction_amount]" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() D.transaction_log.Add(T) // T = new() @@ -273,7 +273,7 @@ T.amount = "[transaction_amount]" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() linked_account.transaction_log.Add(T) else usr << "\icon[src]You don't have that much money!" diff --git a/code/modules/economy/Events_Mundane.dm b/code/modules/economy/Events_Mundane.dm index 5728560040a..a064b86b1f7 100644 --- a/code/modules/economy/Events_Mundane.dm +++ b/code/modules/economy/Events_Mundane.dm @@ -84,7 +84,7 @@ [pick("playwright","author","director","actor","TV star")] [random_name(pick(MALE,FEMALE))] comes the latest sensation: '\ [pick("Deadly","The last","Lost","Dead")] [pick("Starships","Warriors","outcasts","Tajarans","Unathi","Skrell")] \ [pick("of","from","raid","go hunting on","visit","ravage","pillage","destroy")] \ - [pick("Moghes","Earth","Biesel","Ahdomai","S'randarr","the Void","the Edge of Space")]'.\ + [pick("Moghes","Earth","Biesel","Meralar","Rarkajar","the Void","the Edge of Space")]'.\ . Own it on webcast today, or visit the galactic premier on [affected_dest.name]!" if(BIG_GAME_HUNTERS) diff --git a/code/modules/economy/cash_register.dm b/code/modules/economy/cash_register.dm index 109572ffc0a..87f7b53a7fb 100644 --- a/code/modules/economy/cash_register.dm +++ b/code/modules/economy/cash_register.dm @@ -256,7 +256,7 @@ T.amount = "([transaction_amount])" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() D.transaction_log.Add(T) // Create log entry in owner's account @@ -266,7 +266,7 @@ T.amount = "[transaction_amount]" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() linked_account.transaction_log.Add(T) // Save log @@ -304,7 +304,7 @@ T.amount = "[transaction_amount]" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() linked_account.transaction_log.Add(T) // Save log @@ -414,7 +414,7 @@
    - +
    Customer[c_name]
    Pay Method[p_method]
    Station Time[worldtime2text()]
    Station Time[stationtime2text()]
    "} diff --git a/code/modules/economy/retail_scanner.dm b/code/modules/economy/retail_scanner.dm index 0a79ad5018e..4ddf058de23 100644 --- a/code/modules/economy/retail_scanner.dm +++ b/code/modules/economy/retail_scanner.dm @@ -231,7 +231,7 @@ T.amount = "([transaction_amount])" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() D.transaction_log.Add(T) // Create log entry in owner's account @@ -241,7 +241,7 @@ T.amount = "[transaction_amount]" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() linked_account.transaction_log.Add(T) // Save log @@ -274,7 +274,7 @@ T.amount = "[transaction_amount]" T.source_terminal = machine_id T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() linked_account.transaction_log.Add(T) // Save log @@ -348,7 +348,7 @@ - +
    Customer[c_name]
    Pay Method[p_method]
    Station Time[worldtime2text()]
    Station Time[stationtime2text()]
    "} diff --git a/code/modules/error_handler/_defines.dm b/code/modules/error_handler/_defines.dm new file mode 100644 index 00000000000..0c98f4a9b9f --- /dev/null +++ b/code/modules/error_handler/_defines.dm @@ -0,0 +1,9 @@ +// Settings for the error handler and error viewer + +#define ERROR_COOLDOWN 600 // The "cooldown" time for each occurrence of a unique error +#define ERROR_LIMIT 9 // How many occurrences before the next will silence them +#define ERROR_MAX_COOLDOWN (ERROR_COOLDOWN * ERROR_LIMIT) +#define ERROR_SILENCE_TIME 6000 // How long a unique error will be silenced for + +// How long to wait between messaging admins about occurrences of a unique error +#define ERROR_MSG_DELAY 50 diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm new file mode 100644 index 00000000000..de71bfc1cab --- /dev/null +++ b/code/modules/error_handler/error_handler.dm @@ -0,0 +1,118 @@ +var/list/error_last_seen = list() +// error_cooldown items will either be positive (cooldown time) or negative (silenced error) +// If negative, starts at -1, and goes down by 1 each time that error gets skipped +var/list/error_cooldown = list() +var/total_runtimes = 0 +var/total_runtimes_skipped = 0 +// The ifdef needs to be down here, since the error viewer references total_runtimes +#ifdef DEBUG +/world/Error(var/exception/e, var/datum/e_src) + if(!istype(e)) // Something threw an unusual exception + log_to_dd("\[[time_stamp()]] Uncaught exception: [e]") + return ..() + if(!error_last_seen) // A runtime is occurring too early in start-up initialization + return ..() + total_runtimes++ + + var/erroruid = "[e.file][e.line]" + var/last_seen = error_last_seen[erroruid] + var/cooldown = error_cooldown[erroruid] || 0 + if(last_seen == null) // A new error! + error_last_seen[erroruid] = world.time + last_seen = world.time + if(cooldown < 0) + error_cooldown[erroruid]-- // Used to keep track of skip count for this error + total_runtimes_skipped++ + return // Error is currently silenced, skip handling it + + // Handle cooldowns and silencing spammy errors + var/silencing = 0 + // Each occurrence of a unique error adds to its "cooldown" time... + cooldown = max(0, cooldown - (world.time - last_seen)) + ERROR_COOLDOWN + // ... which is used to silence an error if it occurs too often, too fast + if(cooldown > ERROR_MAX_COOLDOWN) + cooldown = -1 + silencing = 1 + spawn(0) + usr = null + sleep(ERROR_SILENCE_TIME) + var/skipcount = abs(error_cooldown[erroruid]) - 1 + error_cooldown[erroruid] = 0 + if(skipcount > 0) + log_to_dd("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file],[e.line].") + error_cache.logError(e, skipCount = skipcount) + error_last_seen[erroruid] = world.time + error_cooldown[erroruid] = cooldown + + // The detailed error info needs some tweaking to make it look nice + var/list/srcinfo = null + var/list/usrinfo = null + var/locinfo + // First, try to make better src/usr info lines + if(istype(e_src)) + srcinfo = list(" src: [log_info_line(e_src)]") + locinfo = log_info_line(e_src) + if(locinfo) + srcinfo += " src.loc: [locinfo]" + if(istype(usr)) + usrinfo = list(" usr: [log_info_line(usr)]") + locinfo = log_info_line(usr) + if(locinfo) + usrinfo += " usr.loc: [locinfo]" + // The proceeding mess will almost definitely break if error messages are ever changed + // I apologize in advance + var/list/splitlines = splittext(e.desc, "\n") + var/list/desclines = list() + if(splitlines.len > 2) // If there aren't at least three lines, there's no info + for(var/line in splitlines) + if(length(line) < 3) + continue // Blank line, skip it + if(findtext(line, "source file:")) + continue // Redundant, skip it + if(findtext(line, "usr.loc:")) + continue // Our usr.loc is better, skip it + if(findtext(line, "usr:")) + if(usrinfo) + desclines.Add(usrinfo) + usrinfo = null + continue // Our usr info is better, replace it + if(srcinfo) + if(findtext(line, "src.loc:")) + continue + if(findtext(line, "src:")) + desclines.Add(srcinfo) + srcinfo = null + continue + if(copytext(line, 1, 3) != " ") + desclines += (" " + line) // Pad any unpadded lines, so they look pretty + else + desclines += line + if(srcinfo) // If these aren't null, they haven't been added yet + desclines.Add(srcinfo) + if(usrinfo) + desclines.Add(usrinfo) + if(silencing) + desclines += " (This error will now be silenced for [ERROR_SILENCE_TIME / 600] minutes)" + + // Now to actually output the error info... + log_to_dd("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]") + for(var/line in desclines) + log_to_dd(line) + if(error_cache) + error_cache.logError(e, desclines, e_src = e_src) + +#endif + +/proc/log_runtime(exception/e, datum/e_src, extra_info) + if(!istype(e)) + world.Error(e, e_src) + return + + if(extra_info) + // Adding extra info adds two newlines, because parsing runtimes is funky + if(islist(extra_info)) + e.desc = " [jointext(extra_info, "\n ")]\n\n" + e.desc + else + e.desc = " [extra_info]\n\n" + e.desc + + world.Error(e, e_src) diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm new file mode 100644 index 00000000000..0f1fd0ba960 --- /dev/null +++ b/code/modules/error_handler/error_viewer.dm @@ -0,0 +1,206 @@ +// Error viewing datums, responsible for storing error info, notifying admins +// when errors occur, and showing them to admins on demand. + +// There are 3 different types used here: +// +// - ErrorCache keeps track of all error sources, as well as all individually +// logged errors. Only one instance of this datum should ever exist, and it's +// right here: + +#ifdef DEBUG +var/global/datum/ErrorViewer/ErrorCache/error_cache = new() +#else +// If debugging is disabled, there's nothing useful to log, so don't bother. +var/global/datum/ErrorViewer/ErrorCache/error_cache = null +#endif + +// - ErrorSource datums exist for each line (of code) that generates an error, +// and keep track of all errors generated by that line. +// +// - ErrorEntry datums exist for each logged error, and keep track of all +// relevant info about that error. + +// Common vars and procs are kept at the ErrorViewer level +/datum/ErrorViewer/ + var/name = "" + +/datum/ErrorViewer/proc/browseTo(var/user, var/html) + if(user) + var/datum/browser/popup = new(user, "error_viewer", "Runtime Viewer", 700, 500) + popup.add_head_content({""}) + popup.set_content(html) + popup.open(0) + +/datum/ErrorViewer/proc/buildHeader(var/datum/ErrorViewer/back_to, var/linear, var/refreshable) + // Common starter HTML for showTo + var/html = "" + + if(istype(back_to)) + html += "[back_to.makeLink("<<<", null, linear)] " + if(refreshable) + html += "[makeLink("Refresh", null, linear)]" + if(html) + html += "

    " + return html + +/datum/ErrorViewer/proc/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear) + // Specific to each child type + return + +/datum/ErrorViewer/proc/makeLink(var/linktext, var/datum/ErrorViewer/back_to, var/linear) + var/back_to_param = "" + if(!linktext) + linktext = name + if(istype(back_to)) + back_to_param = ";viewruntime_backto=\ref[back_to]" + if(linear) + back_to_param += ";viewruntime_linear=1" + return "[html_encode(linktext)]" + +/datum/ErrorViewer/Topic(href, href_list) + if(..()) + return 1 + if(href_list["viewruntime_backto"]) + showTo(usr, locate(href_list["viewruntime_backto"]), href_list["viewruntime_linear"]) + else + showTo(usr, null, href_list["viewruntime_linear"]) + +/datum/ErrorViewer/ErrorCache + var/list/errors = list() + var/list/error_sources = list() + var/list/errors_silenced = list() + +/datum/ErrorViewer/ErrorCache/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear) + var/html = buildHeader(null, linear, refreshable=1) + html += "[total_runtimes] runtimes, [total_runtimes_skipped] skipped

    " + if(!linear) + html += "organized | [makeLink("linear", null, 1)]
    " + var/datum/ErrorViewer/ErrorSource/error_source + for(var/erroruid in error_sources) + error_source = error_sources[erroruid] + html += "

    [error_source.makeLink(null, src)]

    " + else + html += "[makeLink("organized", null)] | linear
    " + for(var/datum/ErrorViewer/ErrorEntry/error_entry in errors) + html += "

    [error_entry.makeLink(null, src, 1)]

    " + browseTo(user, html) + +/datum/ErrorViewer/ErrorCache/proc/logError(var/exception/e, var/list/desclines, var/skipCount, var/datum/e_src) + if(!istype(e)) + return // Abnormal exception, don't even bother + + var/erroruid = "[e.file][e.line]" + var/datum/ErrorViewer/ErrorSource/error_source = error_sources[erroruid] + if(!error_source) + error_source = new(e) + error_sources[erroruid] = error_source + + var/datum/ErrorViewer/ErrorEntry/error_entry = new(e, desclines, skipCount, e_src) + error_entry.error_source = error_source + errors += error_entry + error_source.errors += error_entry + if(skipCount) + return // Skip notifying admins about skipped errors + + // Show the error to admins with debug messages turned on, but only if one + // from the same source hasn't been shown too recently + // (Also, make sure config is initialized, or log_debug will runtime) + if(config && error_source.next_message_at <= world.time) + var/const/viewtext = "\[view]" // Nesting these in other brackets went poorly + log_debug("Runtime in [e.file],[e.line]: [html_encode(e.name)] [error_entry.makeLink(viewtext)]") + error_source.next_message_at = world.time + ERROR_MSG_DELAY + +/datum/ErrorViewer/ErrorSource + var/list/errors = list() + var/next_message_at = 0 + +/datum/ErrorViewer/ErrorSource/New(var/exception/e) + if(!istype(e)) + name = "\[[time_stamp()]] Uncaught exceptions" + return + name = "\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]" + +/datum/ErrorViewer/ErrorSource/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear) + if(!istype(back_to)) + back_to = error_cache + var/html = buildHeader(back_to, refreshable=1) + for(var/datum/ErrorViewer/ErrorEntry/error_entry in errors) + html += "

    [error_entry.makeLink(null, src)]

    " + browseTo(user, html) + +/datum/ErrorViewer/ErrorEntry + var/datum/ErrorViewer/ErrorSource/error_source + var/exception/exc + var/desc = "" + var/srcRef + var/srcType + var/turf/srcLoc + var/usrRef + var/turf/usrLoc + var/isSkipCount + +/datum/ErrorViewer/ErrorEntry/New(var/exception/e, var/list/desclines, var/skipCount, var/datum/e_src) + if(!istype(e)) + name = "\[[time_stamp()]] Uncaught exception: [e]" + return + if(skipCount) + name = "\[[time_stamp()]] Skipped [skipCount] runtimes in [e.file],[e.line]." + isSkipCount = TRUE + return + name = "\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]" + exc = e + if(istype(desclines)) + for(var/line in desclines) + // There's probably a better way to do this than non-breaking spaces... + desc += "  " + html_encode(line) + "
    " + if(istype(e_src)) + srcRef = "\ref[e_src]" + srcType = e_src.type + srcLoc = get_turf(e_src) + if(usr) + usrRef = "\ref[usr]" + usrLoc = get_turf(usr) + +/datum/ErrorViewer/ErrorEntry/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear) + if(!istype(back_to)) + back_to = error_source + var/html = buildHeader(back_to, linear) + html += "
    [html_encode(name)]
    [desc]
    " + if(srcRef) + html += "
    src: VV" + if(ispath(srcType, /mob)) + html += " PP" + html += " Follow" + if(istype(srcLoc)) + html += "
    src.loc: VV" + html += " JMP" + if(usrRef) + html += "
    usr: VV" + html += " PP" + html += " Follow" + if(istype(usrLoc)) + html += "
    usr.loc: VV" + html += " JMP" + browseTo(user, html) + +/datum/ErrorViewer/ErrorEntry/makeLink(var/linktext, var/datum/ErrorViewer/back_to, var/linear) + if(isSkipCount) + return html_encode(name) + else + return ..() diff --git a/code/modules/error_handler/~defines.dm b/code/modules/error_handler/~defines.dm new file mode 100644 index 00000000000..98712eaa091 --- /dev/null +++ b/code/modules/error_handler/~defines.dm @@ -0,0 +1,6 @@ +// Settings for the error handler and error viewer +#undef ERROR_COOLDOWN +#undef ERROR_LIMIT +#undef ERROR_MAX_COOLDOWN +#undef ERROR_SILENCE_TIME +#undef ERROR_MSG_DELAY diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 4fca5eb3d97..534c5aa56d2 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -44,7 +44,7 @@ if(EM.add_to_queue) EC.available_events += EM - log_debug("Event '[EM.name]' has completed at [worldtime2text()].") + log_debug("Event '[EM.name]' has completed at [worldtime2stationtime(world.time)].") /datum/event_manager/proc/delay_events(var/severity, var/delay) var/list/datum/event_container/EC = event_containers[severity] @@ -67,12 +67,12 @@ var/datum/event_meta/EM = E.event_meta if(EM.name == "Nothing") continue - var/message = "'[EM.name]' began at [worldtime2text(E.startedAt)] " + var/message = "'[EM.name]' began at [worldtime2stationtime(E.startedAt)] " if(E.isRunning) message += "and is still running." else if(E.endedAt - E.startedAt > MinutesToTicks(5)) // Only mention end time if the entire duration was more than 5 minutes - message += "and ended at [worldtime2text(E.endedAt)]." + message += "and ended at [worldtime2stationtime(E.endedAt)]." else message += "and ran to completion." @@ -130,7 +130,7 @@ var/next_event_at = max(0, EC.next_event_time - world.time) html += "" html += "" - html += "" + html += "" html += "" html += "" html += "" html += "" - html += "" + html += "" html += "" html += "" html += "" diff --git a/code/modules/events/money_hacker.dm b/code/modules/events/money_hacker.dm index 07d18c2746a..b0304d4f882 100644 --- a/code/modules/events/money_hacker.dm +++ b/code/modules/events/money_hacker.dm @@ -15,15 +15,15 @@ kill() /datum/event/money_hacker/announce() - var/message = "A brute force hack has been detected (in progress since [worldtime2text()]). The target of the attack is: Financial account #[affected_account.account_number], \ + var/message = "A brute force hack has been detected (in progress since [stationtime2text()]). The target of the attack is: Financial account #[affected_account.account_number], \ without intervention this attack will succeed in approximately 10 minutes. Required intervention: temporary suspension of affected accounts until the attack has ceased. \ Notifications will be sent as updates occur.
    " var/my_department = "[station_name()] firewall subroutines" - + for(var/obj/machinery/message_server/MS in world) if(!MS.active) continue MS.send_rc_message("Head of Personnel's Desk", my_department, message, "", "", 2) - + /datum/event/money_hacker/tick() if(world.time >= end_time) @@ -51,7 +51,7 @@ T.date = pick("", current_date_string, date1, date2) var/time1 = rand(0, 99999999) var/time2 = "[round(time1 / 36000)+12]:[(time1 / 600 % 60) < 10 ? add_zero(time1 / 600 % 60, 1) : time1 / 600 % 60]" - T.time = pick("", worldtime2text(), time2) + T.time = pick("", stationtime2text(), time2) T.source_terminal = pick("","[pick("Biesel","New Gibson")] GalaxyNet Terminal #[rand(111,999)]","your mums place","nantrasen high CommanD") affected_account.transaction_log.Add(T) diff --git a/code/modules/events/money_lotto.dm b/code/modules/events/money_lotto.dm index b905dd576cc..df7f8d1674a 100644 --- a/code/modules/events/money_lotto.dm +++ b/code/modules/events/money_lotto.dm @@ -16,7 +16,7 @@ T.purpose = "Winner!" T.amount = winner_sum T.date = current_date_string - T.time = worldtime2text() + T.time = stationtime2text() T.source_terminal = "Sif TCD Terminal #[rand(111,333)]" D.transaction_log.Add(T) diff --git a/code/modules/events/prison_break.dm b/code/modules/events/prison_break.dm index 51732366275..2f5d099e8d0 100644 --- a/code/modules/events/prison_break.dm +++ b/code/modules/events/prison_break.dm @@ -4,7 +4,7 @@ var/releaseWhen = 60 var/list/area/areas = list() //List of areas to affect. Filled by start() - + var/eventDept = "Security" //Department name in announcement var/list/areaName = list("Brig") //Names of areas mentioned in AI and Engineering announcements var/list/areaType = list(/area/security/prison, /area/security/brig) //Area types to include. @@ -47,7 +47,7 @@ if(areas && areas.len > 0) var/my_department = "[station_name()] firewall subroutines" - var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [worldtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.
    " + var/rc_message = "An unknown malicious program has been detected in the [english_list(areaName)] lighting and airlock control systems at [stationtime2text()]. Systems will be fully compromised within approximately three minutes. Direct intervention is required immediately.
    " for(var/obj/machinery/message_server/MS in world) MS.send_rc_message("Engineering", my_department, rc_message, "", "", 2) for(var/mob/living/silicon/ai/A in player_list) diff --git a/code/modules/examine/descriptions/containers.dm b/code/modules/examine/descriptions/containers.dm new file mode 100644 index 00000000000..fb0c4e2d25e --- /dev/null +++ b/code/modules/examine/descriptions/containers.dm @@ -0,0 +1,35 @@ +/obj/item/weapon/reagent_containers/food/drinks/cans/cola + description_fluff = "Space Cola is the most popular soft drink in known space. It was invented by Nikolas Fedorov, a Martian-Russian immagrant to Tau Ceti. He then went on to create Nikolas Beverages Inc., a soft drink corporation that is now part of Centauri Provisions." + +/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle + description_fluff = "This is a generic, NanoTrasen branded bottle of water. The company swears on the quality of the water, saying it comes from the Martian poles. Most people disregard that and assume it's recycled from hydroponics trays." + +/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind + description_fluff = "This cola was allegedly made after Vasily Federov, the son of Nikolas Federov and the second CEO of Federov Beverages Inc., went on a climbing expedition to an arctic planet. He then created this citris flavored soft drink. Scientists claim that it can eat through styrafoam in a matter of weeks, but people drink it anyway." + +/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko + description_fluff = "A beverage loved by college students. The Thirteen Loko Company created this highly alcoholic beverage as an energy drink. It is illegal in much of SolGov space and most of Skrell space. This drink has been regulated more than any other in known space, and doctors strongly advise not to drink it." + +/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb + description_fluff = "Originally made by a doctor seeking to mix several different flavors, this soda has become widely popular in the past decade. The drink has become so popular, in fact, that Nikolas Beverages bought it. Ever since then, the drink has never been the same. As a result, people all across known space beg for the old formula, but Nikolas Beverages does not appear to be listening." + +/obj/item/weapon/reagent_containers/food/drinks/cans/starkist + description_fluff = "Nikolas Beverages' attempt at an orange-flavored drink. Advertised as a nice summer beverage. The company tries to paint it as one of their more 'healthy' beverages due to its 'orange' and 'vitamins'." + +/obj/item/weapon/reagent_containers/food/drinks/cans/space_up + description_fluff = "This drink is advertised as one of the most carbonated beverages on the market. It's owned by Federov Beverages, and advertised for its carbonation, not its flavor. Children will commonly make 'Space-Up Volcanoes' by dropping mints into a can of Space-Up and causing it to create a long stream of fizz upward." + +/obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime + description_fluff = "This is a NanoTrasen branded can of Lemon-Lime juice. NanoTrasen swears to their 'natural' beverage, but most people think differently." + +/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea + description_fluff = "Vrisk Iced Tea is named after it's creator, Penelope Vrisk. She was a canner for Federov Beverages who wanted to create an authentic-tasting Southern iced tea. After finishing her formula and managing to get it produced, the tea became an instant hit." + +/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice + description_fluff = "This is a NanoTrasen branded can of grape juice. NanoTrasen claims that they use the same grapes that this juice is made of to make their wine." + +/obj/item/weapon/reagent_containers/food/drinks/cans/tonic + description_fluff = "Endorsed by the popular positronic rapper, T-Borg, this drink is advertised as a 'high class' drink. Most people just use it to mix with their gin, and not much can be said about the quality." + +/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater + description_fluff = "This is a NanoTrasen branded can of soda water. They use the same water for this that they use for the bottled water that they sell. That may explain why the stuff isn't exactly flying off of the shelves." diff --git a/code/modules/examine/descriptions/smokeables.dm b/code/modules/examine/descriptions/smokeables.dm new file mode 100644 index 00000000000..957090b8e34 --- /dev/null +++ b/code/modules/examine/descriptions/smokeables.dm @@ -0,0 +1,39 @@ +/obj/item/weapon/storage/fancy/cigarettes + description_fluff = "The Trans-Stellar Duty-Free cigarette company was created as a sub-company of NanoTrasen. They are the most boring, tasteless, dry cigarettes on the market, but due to how generic they are, they are still the most well-known and widespread cigarettes in the universe." + +/obj/item/weapon/storage/fancy/cigarettes/dromedaryco + description_fluff = "DromedaryCo is one of the oldest companies that produces cigarettes. Being a company that has changed hands and names several times through the years, their cigarettes are now very different from the original, and old-timers tend to complain about the quality of their current product. While they have been dwindling when it comes to profits in the past years due to marketing schemes deemed 'unethical', they still remain on the forefront of the smokeable industry." + +/obj/item/weapon/storage/fancy/cigarettes/killthroat + description_fluff = "AcmeCo is known for their signature high-tar cigarettes. Being a sub-company Xion, some accuse the cigarettes of having other harmful things in them besides tar. Xion officials refuse to comment on the issue." + +/obj/item/weapon/storage/fancy/cigarettes/luckystars + description_fluff = "Lucky Stars were created on Venus by a researcher seeking to make a good quality cigarette from pod-based tobacco plants. The researcher only managed to make these, but made quite a profit off of them when she started her company." + +/obj/item/weapon/storage/fancy/cigarettes/jerichos + description_fluff = "Hephaistos Industries ex-military employees once decided to make a cigarette that was easy to light and had a waterproof case, specifically tailored for soldiers. They created Jerichos. Jerichos are known for their Hickory smoke and warm feeling in your lungs. They are loved by soldiers and people employed in para-military outfits." + +/obj/item/weapon/storage/fancy/cigarettes/menthols + description_fluff = "The Temperamento Menthol Company is a large cigarette company based in Mars. They have been around since the very dawn of Human colonization and have remained a favorite for those seeking a more.. numbing cigarette.
    \ +
    \ + This is a pack of Temperamento Menthols, the main product of the company. They taste like menthol, surprisingly enough." + +/obj/item/weapon/storage/fancy/cigarettes/carcinomas + description_fluff = "The CarcinoCo was originally destined to fail, as the company blatantly advertized themselves as creating the 'most cancerous cigarette'. Somehow, after endorsement from a reporter, the cigarettes took off." + +/obj/item/weapon/storage/fancy/cigarettes/professionals + description_fluff = "Decades ago, probably before you were born, Gilthari Exports created the Professional 120s. They wanted to make a fancy cigarette that would be considered a luxury. Nowadays, people who use them are generally laughed at for being wannabe rich people or old. They are, however, very high-quality and made from the very best tobacco." + +/obj/item/clothing/mask/smokable/cigarette/cigar + description_fluff = "While the label does say that this is a 'premium cigar', it really cannot match other types of cigars on the market. Is it a quality cigarette? Perhaps. Was it hand-made with care? No. This is what differentiates between quality products that Gilthari puts out and NanoTrasen 'premium' cigars like this one." + +/obj/item/clothing/mask/smokable/cigarette/cigar/cohiba + description_fluff = "Cohiba has been a popular cigar company for centuries. They are still based out of Cuba and refuse to expand and therefore have a very limited quantity, making their cigars coveted all through known space. Robusto is one of their most popular shapes of cigars." + +/obj/item/clothing/mask/smokable/cigarette/cigar/havana + description_fluff = "'Havanian' is an umbrella term for any cigar made in the typical handmade style of Cuba. This particular cigar is from Gilthari's cigar manufacturers. While the way of making quality cigars has become slightly bastardized over the years, overall quality has remained relatively the same, even if there is a large quantity of 'Havanian' cigars." + +/obj/item/clothing/mask/smokable/pipe + description_fluff = "ClassiCo Men's Accessories and Haberdashers is a widespread company originating out of Mars. They seek to create quality goods to give men a more 'classy' look. Most of their items are high-end and expensive, but they do back that up with quality.
    \ +
    \ + This pipe is a ClassiCo pipe. It is made out of fine, stained cherry wood." \ No newline at end of file diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index 6ac9483e2f9..cda4ab86cef 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -1,6 +1,6 @@ var/list/dreams = list( - "an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the captain", + "an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the Station Administrator", "voices from all around","deep space","a doctor","the engine","a traitor","an ally","darkness", "light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun", "a hat","the Luna","a ruined station","a planet","phoron","air","the medical bay","the bridge","blinking lights", diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 803fbc67aee..e074c264ace 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -189,7 +189,7 @@ mob/living/carbon/proc/handle_hallucinations() var/possible_txt = list("Launch Escape Pods","Self-Destruct Sequence","\[Swipe ID\]","De-Monkify",\ "Reticulate Splines","Plasma","Open Valve","Lockdown","Nerf Airflow","Kill Traitor","Nihilism",\ - "OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Captain IQ","Retrieve Arms",\ + "OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Station Administrator IQ","Retrieve Arms",\ "Play Charades","Oxygen","Inject BeAcOs","Ninja Lizards","Limit Break","Build Sentry") if(mid_txts) diff --git a/code/modules/games/cah_black_cards.dm b/code/modules/games/cah_black_cards.dm index ec27fa12700..6aae5e6da28 100644 --- a/code/modules/games/cah_black_cards.dm +++ b/code/modules/games/cah_black_cards.dm @@ -5,7 +5,7 @@ "The Chaplain this shift is worshiping _____.", "Cargo ordered a crate full of _____.", "An ERT was called due to ______.", - "Alert! The Captain has armed themselves with _____.", + "Alert! The Station Administrator has armed themselves with _____.", "Current Laws: ________ is your master.", "Current Laws: ________ is the enemy.", "_____ vented the entirety of Cargo.", @@ -14,7 +14,7 @@ "Caution, ______ have been detected in collision course with the station.", "Today's kitchen menu includes _______.", "What did the mercenaries want when they attacked the station?", - "I think the Captain is insane. He just demanded ______ in his office.", + "I think the Station Administrator is insane. He just demanded ______ in his office.", "Fuckin' scientists, they just turned Misc. Research into _______ .", "What's my fetish?", "Hello, _______ here with _______", diff --git a/code/modules/games/cah_white_cards.dm b/code/modules/games/cah_white_cards.dm index 2ed8a494db9..387c058972f 100644 --- a/code/modules/games/cah_white_cards.dm +++ b/code/modules/games/cah_white_cards.dm @@ -5,7 +5,7 @@ "Space 'Nam", "Space lesbians", "The Gardener getting SUPER high", - "The Captain thinking they're a badass", + "The Station Administrator thinking they're a badass", "Being in a cult", "Racially biased lawsets", "An Unathi who WON'T STOP FIGHTING", @@ -57,7 +57,7 @@ "An irritatingly chipper robot", "Androids hanging out in the bar drinking beer", "Gear harnesses", - "A seventeen-year-old Captain", + "A seventeen-year-old Station Administrator", "The throbbing erection that the HoS gets at the thought of shooting something", "Trying to stab someone and hugging them instead", "Waking up naked in the maintenance tunnels", diff --git a/code/modules/games/spaceball_cards.dm b/code/modules/games/spaceball_cards.dm index 0ea8bb6ab3f..11ded835503 100644 --- a/code/modules/games/spaceball_cards.dm +++ b/code/modules/games/spaceball_cards.dm @@ -16,7 +16,7 @@ else var/language_type = pick(/datum/language/human,/datum/language/diona,/datum/language/tajaran,/datum/language/unathi) var/datum/language/L = new language_type() - var/team = pick("Brickburn Galaxy Trekers","Mars Rovers", "Qerrbalak Saints", "Moghes Rockets", "Ahdomai Lightening", starsys_name+" Vixens", "Euphoric-Earth Alligators") + var/team = pick("Brickburn Galaxy Trekers","Mars Rovers", "Qerrbalak Saints", "Moghes Rockets", "Meralar Lightning", starsys_name+" Vixens", "Euphoric-Earth Alligators") P.name = "[L.get_random_name(pick(MALE,FEMALE))], [year - rand(0,50)] [team]" P.card_icon = "spaceball_standard" P.back_icon = "card_back_spaceball" diff --git a/code/modules/hydroponics/seed_datums.dm b/code/modules/hydroponics/seed_datums.dm index eb1eeb40cae..e8881a5dc72 100644 --- a/code/modules/hydroponics/seed_datums.dm +++ b/code/modules/hydroponics/seed_datums.dm @@ -1028,8 +1028,8 @@ /datum/seed/shand name = "shand" - seed_name = "S'randar's hand" - display_name = "S'randar's hand leaves" + seed_name = "Selem's hand" + display_name = "Selem's hand leaves" chems = list("bicaridine" = list(0,10)) kitchen_tag = "shand" @@ -1048,8 +1048,8 @@ /datum/seed/mtear name = "mtear" - seed_name = "Messa's tear" - display_name = "Messa's tear leaves" + seed_name = "Malani's tear" + display_name = "Malani's tear leaves" chems = list("honey" = list(1,10), "kelotane" = list(3,5)) kitchen_tag = "mtear" diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 809fa76a3a5..b6e2a49fe07 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -395,7 +395,7 @@ var/list/name_to_material weight = 15 door_icon_base = "stone" destruction_desc = "shatters" - window_options = list("One Direction" = 1, "Full Window" = 4) + window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 2) created_window = /obj/structure/window/basic rod_product = /obj/item/stack/material/glass/reinforced @@ -425,6 +425,12 @@ var/list/name_to_material for (var/obj/structure/window/check_window in user.loc) window_count++ possible_directions -= check_window.dir + for (var/obj/structure/windoor_assembly/check_assembly in user.loc) + window_count++ + possible_directions -= check_assembly.dir + for (var/obj/machinery/door/window/check_windoor in user.loc) + window_count++ + possible_directions -= check_windoor.dir // Get the closest available dir to the user's current facing. var/build_dir = SOUTHWEST //Default to southwest for fulltile windows. @@ -435,18 +441,12 @@ var/list/name_to_material else if(choice in list("One Direction","Windoor")) if(possible_directions.len) - for(var/direction in list(user.dir, turn(user.dir,90), turn(user.dir,180), turn(user.dir,270) )) + for(var/direction in list(user.dir, turn(user.dir,90), turn(user.dir,270), turn(user.dir,180))) if(direction in possible_directions) build_dir = direction break else failed_to_build = 1 - if(!failed_to_build && choice == "Windoor") - if(!is_reinforced()) - user << "This material is not reinforced enough to use for a door." - return - if((locate(/obj/structure/windoor_assembly) in T.contents) || (locate(/obj/machinery/door/window) in T.contents)) - failed_to_build = 1 if(failed_to_build) user << "There is no room in this location." return 1 @@ -454,7 +454,8 @@ var/list/name_to_material var/build_path = /obj/structure/windoor_assembly var/sheets_needed = window_options[choice] if(choice == "Windoor") - build_dir = user.dir + if(is_reinforced()) + build_path = /obj/structure/windoor_assembly/secure else build_path = created_window @@ -484,7 +485,7 @@ var/list/name_to_material weight = 30 stack_origin_tech = "materials=2" composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT / 2, "glass" = SHEET_MATERIAL_AMOUNT) - window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 5) + window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 2) created_window = /obj/structure/window/reinforced wire_product = null rod_product = null @@ -497,6 +498,7 @@ var/list/name_to_material integrity = 100 icon_colour = "#FC2BC5" stack_origin_tech = list(TECH_MATERIAL = 4) + window_options = list("One Direction" = 1, "Full Window" = 4) created_window = /obj/structure/window/phoronbasic wire_product = null rod_product = /obj/item/stack/material/glass/phoronrglass @@ -507,6 +509,7 @@ var/list/name_to_material stack_type = /obj/item/stack/material/glass/phoronrglass stack_origin_tech = list(TECH_MATERIAL = 5) composite_material = list() //todo + window_options = list("One Direction" = 1, "Full Window" = 4) created_window = /obj/structure/window/phoronreinforced hardness = 40 weight = 30 diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index eeb7546211d..7c964b9d4b0 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -42,7 +42,6 @@ /obj/machinery/mining/drill/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/capacitor(src) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index ce3ec04a25a..ea696708856 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -57,7 +57,7 @@ var/drill_verb = "drilling" sharp = 1 - var/excavation_amount = 100 + var/excavation_amount = 200 /obj/item/weapon/pickaxe/hammer name = "sledgehammer" diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 6d460dd8508..1c6208061dd 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -121,6 +121,12 @@ var/list/mining_overlay_cache = list() if(!mining_overlay_cache["rock_side_[place_dir]"]) mining_overlay_cache["rock_side_[place_dir]"] = image('icons/turf/walls.dmi', "rock_side", dir = place_dir) T.overlays += mining_overlay_cache["rock_side_[place_dir]"] + + if(archaeo_overlay) + overlays += archaeo_overlay + + if(excav_overlay) + overlays += excav_overlay else name = "sand" @@ -320,13 +326,12 @@ var/list/mining_overlay_cache = list() if (istype(W, /obj/item/device/measuring_tape)) var/obj/item/device/measuring_tape/P = W user.visible_message("\The [user] extends \a [P] towards \the [src].","You extend \the [P] towards \the [src].") - if(do_after(user,25)) - user << "\icon[P] [src] has been excavated to a depth of [2*excavation_level]cm." + if(do_after(user, 15)) + user << "\The [src] has been excavated to a depth of [excavation_level]cm." return if (istype(W, /obj/item/weapon/pickaxe)) - var/turf/T = user.loc - if (!( istype(T, /turf) )) + if(!istype(user.loc, /turf)) return var/obj/item/weapon/pickaxe/P = W @@ -335,44 +340,37 @@ var/list/mining_overlay_cache = list() last_act = world.time playsound(user, P.drill_sound, 20, 1) + var/newDepth = excavation_level + P.excavation_amount // Used commonly below //handle any archaeological finds we might uncover - var/fail_message + var/fail_message = "" if(finds && finds.len) var/datum/find/F = finds[1] - if(excavation_level + P.excavation_amount > F.excavation_required) - //Chance to destroy / extract any finds here + if(newDepth > F.excavation_required) // Digging too deep can break the item. At least you won't summon a Balrog (probably) fail_message = ". [pick("There is a crunching noise","[W] collides with some different rock","Part of the rock face crumbles away","Something breaks under [W]")]" - user << "You start [P.drill_verb][fail_message ? fail_message : ""]." + user << "You start [P.drill_verb][fail_message]." if(fail_message && prob(90)) if(prob(25)) - excavate_find(5, finds[1]) + excavate_find(prob(5), finds[1]) else if(prob(50)) finds.Remove(finds[1]) if(prob(50)) artifact_debris() if(do_after(user,P.digspeed)) - user << "You finish [P.drill_verb] \the [src]." if(finds && finds.len) var/datum/find/F = finds[1] - if(round(excavation_level + P.excavation_amount) == F.excavation_required) - //Chance to extract any items here perfectly, otherwise just pull them out along with the rock surrounding them - if(excavation_level + P.excavation_amount > F.excavation_required) - //if you can get slightly over, perfect extraction - excavate_find(100, F) - else - excavate_find(80, F) + if(newDepth == F.excavation_required) // When the pick hits that edge just right, you extract your find perfectly, it's never confined in a rock + excavate_find(1, F) + else if(newDepth > F.excavation_required - F.clearance_range) // Not quite right but you still extract your find, the closer to the bottom the better, but not above 80% + excavate_find(prob(80 * (F.excavation_required - newDepth) / F.clearance_range), F) - else if(excavation_level + P.excavation_amount > F.excavation_required - F.clearance_range) - //just pull the surrounding rock out - excavate_find(0, F) + user << "You finish [P.drill_verb] \the [src]." - if( excavation_level + P.excavation_amount >= 100 ) - //if players have been excavating this turf, leave some rocky debris behind + if(newDepth >= 200) // This means the rock is mined out fully var/obj/structure/boulder/B if(artifact_find) if( excavation_level > 0 || prob(15) ) @@ -382,7 +380,7 @@ var/list/mining_overlay_cache = list() B.artifact_find = artifact_find else artifact_debris(1) - else if(prob(15)) + else if(prob(5)) //empty boulder B = new(src) @@ -393,36 +391,44 @@ var/list/mining_overlay_cache = list() return excavation_level += P.excavation_amount + var/updateIcon = 0 //archaeo overlays if(!archaeo_overlay && finds && finds.len) var/datum/find/F = finds[1] if(F.excavation_required <= excavation_level + F.view_range) archaeo_overlay = "overlay_archaeo[rand(1,3)]" - overlays += archaeo_overlay + updateIcon = 1 + + else if(archaeo_overlay && (!finds || !finds.len)) + archaeo_overlay = null + updateIcon = 1 //there's got to be a better way to do this var/update_excav_overlay = 0 - if(excavation_level >= 75) - if(excavation_level - P.excavation_amount < 75) + if(excavation_level >= 150) + if(excavation_level - P.excavation_amount < 150) + update_excav_overlay = 1 + else if(excavation_level >= 100) + if(excavation_level - P.excavation_amount < 100) update_excav_overlay = 1 else if(excavation_level >= 50) if(excavation_level - P.excavation_amount < 50) update_excav_overlay = 1 - else if(excavation_level >= 25) - if(excavation_level - P.excavation_amount < 25) - update_excav_overlay = 1 //update overlays displaying excavation level if( !(excav_overlay && excavation_level > 0) || update_excav_overlay ) var/excav_quadrant = round(excavation_level / 25) + 1 excav_overlay = "overlay_excv[excav_quadrant]_[rand(1,3)]" - overlays += excav_overlay + updateIcon = 1 + + if(updateIcon) + update_icon() //drop some rocks - next_rock += P.excavation_amount * 10 - while(next_rock > 100) - next_rock -= 100 + next_rock += P.excavation_amount + while(next_rock > 50) + next_rock -= 50 var/obj/item/weapon/ore/O = new(src) geologic_data.UpdateNearbyArtifactInfo(src) O.geologic_data = geologic_data @@ -481,11 +487,11 @@ var/list/mining_overlay_cache = list() make_floor() update_icon(1) -/turf/simulated/mineral/proc/excavate_find(var/prob_clean = 0, var/datum/find/F) +/turf/simulated/mineral/proc/excavate_find(var/is_clean = 0, var/datum/find/F) //with skill and luck, players can cleanly extract finds //otherwise, they come out inside a chunk of rock var/obj/item/weapon/X - if(prob_clean) + if(is_clean) X = new /obj/item/weapon/archaeological_find(src, new_item_type = F.find_type) else X = new /obj/item/weapon/ore/strangerock(src, inside_item_type = F.find_type) @@ -503,7 +509,7 @@ var/list/mining_overlay_cache = list() //many finds are ancient and thus very delicate - luckily there is a specialised energy suspension field which protects them when they're being extracted if(prob(F.prob_delicate)) var/obj/effect/suspension_field/S = locate() in src - if(!S || S.field_type != get_responsive_reagent(F.find_type)) + if(!S) if(X) visible_message("\The [pick("[display_name] crumbles away into dust","[display_name] breaks apart")].") qdel(X) diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index 19cdf2a18b6..1f78c7ce771 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -1,5 +1,5 @@ /obj/item/weapon/ore - name = "rock" + name = "small rock" icon = 'icons/obj/mining.dmi' icon_state = "ore2" w_class = 2 diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index d4a967dc7b1..b20d39ddce9 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -820,16 +820,26 @@ mob/observer/dead/MayRespawn(var/feedback = 0) set category = "Ghost" set name = "Choose Sprite" - icon = 'icons/mob/ghost.dmi' - overlays.Cut() var/choice + var/previous_state var/finalized = "No" + while(finalized == "No" && src.client) - choice = input(usr,"What would you like to use for your ghost sprite?") as null|anything in possible_ghost_sprites - if(!choice) return + if(!choice) + return - icon_state = possible_ghost_sprites[choice] - finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes") + if(choice) + icon = 'icons/mob/ghost.dmi' + overlays.Cut() - ghost_sprite = possible_ghost_sprites[choice] + if(icon_state && icon) + previous_state = icon_state + + icon_state = possible_ghost_sprites[choice] + finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes") + + ghost_sprite = possible_ghost_sprites[choice] + + if(finalized == "No") + icon_state = previous_state diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 9fe7f221e11..5e7cfe2603c 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -78,7 +78,7 @@ healths.icon_state = "health6" timeofdeath = world.time - if(mind) mind.store_memory("Time of death: [worldtime2text()]", 0) + if(mind) mind.store_memory("Time of death: [stationtime2text()]", 0) living_mob_list -= src dead_mob_list |= src diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 4f14216747f..711b3a13d0c 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -64,7 +64,7 @@ if(speaker == src) src << "You cannot hear yourself speak!" else - src << "[speaker_name][alt_name] talks but you cannot hear \him." + src << "[speaker_name][alt_name] talks but you cannot hear." else if(language) on_hear_say("[speaker_name][alt_name] [track][language.format_message(message, verb)]") @@ -194,7 +194,7 @@ on_hear_radio(part_a, speaker_name, track, part_b, formatted) /proc/say_timestamp() - return "\[[worldtime2text()]\]" + return "\[[stationtime2text()]\]" /mob/proc/on_hear_radio(part_a, speaker_name, track, part_b, formatted) src << "[part_a][speaker_name][part_b][formatted]" diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 0e20458291a..8265eb9e807 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -25,13 +25,13 @@ flags = WHITELISTED space_chance = 40 syllables = list( - "za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz", - "ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh", - "la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl", - "ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk", - "sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss", - "ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr", - "a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s" + "za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz", + "ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh", + "la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl", + "ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk", + "sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss", + "ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr", + "a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s" ) /datum/language/unathi/get_random_name() @@ -42,8 +42,8 @@ return capitalize(new_name) /datum/language/tajaran - name = "Siik'tajr" - desc = "The traditionally employed tongue of Ahdomai, composed of expressive yowls and chirps. Native to the Tajaran." + name = "Siik" + desc = "The most prevalant language of Meralar, composed of expressive yowls and chirps. Native to the Tajaran." speech_verb = "mrowls" ask_verb = "mrowls" exclaim_verb = "yowls" diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm index 7f9c832e849..ae756f6a5fc 100644 --- a/code/modules/mob/living/autohiss.dm +++ b/code/modules/mob/living/autohiss.dm @@ -53,7 +53,7 @@ autohiss_basic_map = list( "r" = list("rr", "rrr", "rrrr") ) - autohiss_exempt = list("Siik'tajr") + autohiss_exempt = list("Siik") /datum/species/proc/handle_autohiss(message, datum/language/lang, mode) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 60a431aad30..6cb5908f6fb 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -2,7 +2,7 @@ name = "Cleanbot" desc = "A little cleaning robot, he looks so excited!" icon_state = "cleanbot0" - req_access = list(access_janitor) + req_one_access = list(access_robotics, access_janitor) botcard_access = list(access_janitor, access_maint_tunnels) locked = 0 // Start unlocked so roboticist can set them to patrol. diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index e623f58be86..42452c49fa5 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -10,7 +10,7 @@ icon_state = "farmbot0" health = 50 maxHealth = 50 - req_access = list(access_hydroponics) + req_one_access = list(access_robotics, access_hydroponics) var/action = "" // Used to update icon var/waters_trays = 1 diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index cb297178868..0072d9a444a 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -2,7 +2,7 @@ name = "Floorbot" desc = "A little floor repairing robot, he looks so excited!" icon_state = "floorbot0" - req_access = list(access_construction) + req_one_access = list(access_robotics, access_construction) wait_if_pulled = 1 min_target_dist = 0 diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index e4d39b5afe1..8a0c7564d12 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -2,7 +2,7 @@ name = "Medbot" desc = "A little medical robot. He looks somewhat underwhelmed." icon_state = "medibot0" - req_access = list(access_medical) + req_one_access = list(access_robotics, access_medical) botcard_access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics) var/skin = null //Set to "tox", "ointment" or "o2" for the other two firstaid kits. diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index 0cd58d330af..b07202572e9 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -4,7 +4,7 @@ icon_state = "secbot0" maxHealth = 100 health = 100 - req_one_access = list(access_security, access_forensics_lockers) + req_one_access = list(access_robotics, access_security, access_forensics_lockers) botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) patrol_speed = 2 target_speed = 3 diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm index 54c7f9a9692..1ec266e9cba 100644 --- a/code/modules/mob/living/carbon/alien/progression.dm +++ b/code/modules/mob/living/carbon/alien/progression.dm @@ -28,6 +28,7 @@ adult.set_species(new_species) show_evolution_blurb() + adult.name = input(src,"Choose a name for yourself (please stick to any appropriate naming conventions).") as text|null if(mind) mind.transfer_to(adult) else @@ -38,6 +39,7 @@ for(var/datum/language/L in languages) adult.add_language(L.name) + qdel(src) /mob/living/carbon/alien/proc/update_progression() diff --git a/code/modules/mob/living/carbon/breathe.dm b/code/modules/mob/living/carbon/breathe.dm index 476e1c11176..6b8a3c43b3c 100644 --- a/code/modules/mob/living/carbon/breathe.dm +++ b/code/modules/mob/living/carbon/breathe.dm @@ -7,7 +7,7 @@ /mob/living/carbon/proc/breathe() //if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell)) return - if(!should_have_organ(O_LUNGS) || does_not_breathe) return + if(!should_have_organ(O_LUNGS)) return var/datum/gas_mixture/breath = null @@ -24,6 +24,11 @@ breath = get_breath_from_internal() //First, check for air from internals if(!breath) breath = get_breath_from_environment() //No breath from internals so let's try to get air from our location + if(!breath) + var/static/datum/gas_mixture/vacuum //avoid having to create a new gas mixture for each breath in space + if(!vacuum) vacuum = new + + breath = vacuum //still nothing? must be vacuum handle_breath(breath) handle_post_breath(breath) diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm index c3813000bbb..101390b3d63 100644 --- a/code/modules/mob/living/carbon/human/appearance.dm +++ b/code/modules/mob/living/carbon/human/appearance.dm @@ -27,6 +27,13 @@ update_dna() return 1 +/mob/living/carbon/human/proc/change_gender_identity(var/identifying_gender) + if(src.identifying_gender == identifying_gender) + return + + src.identifying_gender = identifying_gender + return 1 + /mob/living/carbon/human/proc/change_hair(var/hair_style) if(!hair_style) return @@ -149,7 +156,7 @@ continue if(blacklist.len && (current_species_name in blacklist)) continue - if((current_species.spawn_flags & SPECIES_IS_WHITELISTED) && !is_alien_whitelisted(src, current_species_name)) + if((current_species.spawn_flags & SPECIES_IS_WHITELISTED) && !is_alien_whitelisted(src, current_species)) continue valid_species += current_species_name diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 89db40f75d6..7d9712277c7 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -124,10 +124,16 @@ //suit/armour if(wear_suit) + var/tie_msg + if(istype(wear_suit,/obj/item/clothing/suit)) + var/obj/item/clothing/suit/U = wear_suit + if(U.accessories.len) + tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]" + if(wear_suit.blood_DNA) msg += "[T.He] [T.is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_suit.name]!\n" else - msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit].\n" + msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit][tie_msg].\n" //suit/armour storage if(s_store && !skipsuitstorage) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index df1bfc46675..d7c7de37ee0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -41,6 +41,10 @@ human_mob_list |= src ..() + hide_underwear.Cut() + for(var/category in global_underwear.categories_by_name) + hide_underwear[category] = FALSE + if(dna) dna.ready_dna(src) dna.real_name = real_name @@ -928,9 +932,8 @@ /mob/living/carbon/human/proc/rupture_lung() var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] - if(L && !L.is_bruised()) - src.custom_pain("You feel a stabbing pain in your chest!", 1) - L.damage = L.min_bruised_damage + if(L) + L.rupture() /* /mob/living/carbon/human/verb/simulate() @@ -1416,6 +1419,22 @@ return 1 return 0 +/mob/living/carbon/human/verb/toggle_underwear() + set name = "Toggle Underwear" + set desc = "Shows/hides selected parts of your underwear." + set category = "Object" + + if(stat) return + var/datum/category_group/underwear/UWC = input(usr, "Choose underwear:", "Show/hide underwear") as null|anything in global_underwear.categories + var/datum/category_item/underwear/UWI = all_underwear[UWC.name] + if(!UWI || UWI.name == "None") + src << "You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "\a [UWC.display_name]"]." + return + hide_underwear[UWC.name] = !hide_underwear[UWC.name] + update_underwear(1) + src << "You [hide_underwear[UWC.name] ? "take off" : "put on"] your [UWC.display_name]." + return + /mob/living/carbon/human/verb/pull_punches() set name = "Pull Punches" set desc = "Try not to hurt them." diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 99bbe8ffcf3..fef4752a2a8 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -35,6 +35,7 @@ var/list/all_underwear = list() var/list/all_underwear_metadata = list() + var/list/hide_underwear = list() var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack. var/pdachoice = 1 //Which PDA type the player has chosen. Default, Slim, or Old. diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 93706ccdb4a..fee0169939e 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -5,8 +5,8 @@ #define HUMAN_CRIT_MAX_OXYLOSS ( 2.0 / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. last_tick_duration = ~2.0 on average #define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point -#define HEAT_DAMAGE_LEVEL_2 4 //Amount of damage applied when your body temperature passes the 400K point -#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 1000K point +#define HEAT_DAMAGE_LEVEL_2 10 //Amount of damage applied when your body temperature passes the 400K point +#define HEAT_DAMAGE_LEVEL_3 20 //Amount of damage applied when your body temperature passes the 1000K point #define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point #define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point @@ -327,6 +327,11 @@ if(status_flags & GODMODE) return + if(does_not_breathe) + failed_last_breath = 0 + adjustOxyLoss(-5) + return + if(!breath || (breath.total_moles == 0) || suiciding) failed_last_breath = 1 if(suiciding) @@ -338,12 +343,22 @@ else adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) + if(should_have_organ(O_LUNGS)) + var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] + if(!L.is_bruised() && prob(8)) + if(breath.total_moles) + if(breath.total_moles < BREATH_MOLES / 5 || breath.total_moles > BREATH_MOLES * 5) + rupture_lung() + else + rupture_lung() + oxygen_alert = max(oxygen_alert, 1) return 0 var/safe_pressure_min = 16 // Minimum safe partial pressure of breathable gas in kPa + // Lung damage increases the minimum safe pressure. if(should_have_organ(O_LUNGS)) var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] @@ -1184,10 +1199,10 @@ // if(resting || lying || sleeping) rest.icon_state = "rest1" // else rest.icon_state = "rest0" if(toxin) - if(hal_screwyhud == 4 || phoron_alert) toxin.icon_state = "tox1" + if(hal_screwyhud == 4 || (phoron_alert && !does_not_breathe)) toxin.icon_state = "tox1" else toxin.icon_state = "tox0" if(oxygen) - if(hal_screwyhud == 3 || oxygen_alert) oxygen.icon_state = "oxy1" + if(hal_screwyhud == 3 || (oxygen_alert && !does_not_breathe)) oxygen.icon_state = "oxy1" else oxygen.icon_state = "oxy0" if(fire) if(fire_alert) fire.icon_state = "fire[fire_alert]" //fire_alert is either 0 if no alert, 1 for cold and 2 for heat. diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 5a8fcba715a..c3bb679b082 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -221,14 +221,22 @@ H.internal_organs_by_name[organ_tag] = O -/datum/species/proc/hug(var/mob/living/carbon/human/H,var/mob/living/target) +/datum/species/proc/hug(var/mob/living/carbon/human/H, var/mob/living/target) var/t_him = "them" - switch(target.gender) - if(MALE) - t_him = "him" - if(FEMALE) - t_him = "her" + if(ishuman(target)) + var/mob/living/carbon/human/T = target + switch(T.identifying_gender) + if(MALE) + t_him = "him" + if(FEMALE) + t_him = "her" + else + switch(target.gender) + if(MALE) + t_him = "him" + if(FEMALE) + t_him = "her" H.visible_message("[H] hugs [target] to make [t_him] feel better!", \ "You hug [target] to make [t_him] feel better!") diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm index 293df932157..1fb7b6c3009 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm @@ -130,8 +130,13 @@ var/list/wrapped_species_by_ref = list() if(!new_gender) return + var/new_gender_identity = input("Please select a gender Identity.", "Shapeshifter Gender Identity") as null|anything in list(FEMALE, MALE, NEUTER, PLURAL) + if(!new_gender_identity) + return + visible_message("\The [src]'s form contorts subtly.") change_gender(new_gender) + change_gender_identity(new_gender_identity) /mob/living/carbon/human/proc/shapeshifter_select_shape() diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index 5eae3da61e0..863fb7d0297 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -97,17 +97,25 @@ var/datum/species/shapeshifter/promethean/prometheans else H.equip_to_slot_or_del(L, slot_in_backpack) -/datum/species/shapeshifter/promethean/hug(var/mob/living/carbon/human/H,var/mob/living/target) +/datum/species/shapeshifter/promethean/hug(var/mob/living/carbon/human/H, var/mob/living/target) var/t_him = "them" - switch(target.gender) - if(MALE) - t_him = "him" - if(FEMALE) - t_him = "her" + if(ishuman(target)) + var/mob/living/carbon/human/T = target + switch(T.identifying_gender) + if(MALE) + t_him = "him" + if(FEMALE) + t_him = "her" + else + switch(target.gender) + if(MALE) + t_him = "him" + if(FEMALE) + t_him = "her" H.visible_message("\The [H] glomps [target] to make [t_him] feel better!", \ - "You glomps [target] to make [t_him] feel better!") + "You glomp [target] to make [t_him] feel better!") H.apply_stored_shock_to(target) /datum/species/shapeshifter/promethean/handle_death(var/mob/living/carbon/human/H) @@ -171,11 +179,11 @@ var/datum/species/shapeshifter/promethean/prometheans return var/t_she = "She is" - if(H.gender == MALE) + if(H.identifying_gender == MALE) t_she = "He is" - else if(H.gender == PLURAL) + else if(H.identifying_gender == PLURAL) t_she = "They are" - else if(H.gender == NEUTER) + else if(H.identifying_gender == NEUTER) t_she = "It is" switch(stored_shock_by_ref["\ref[H]"]) diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm index 93dfcb6244d..5fa81a04d91 100644 --- a/code/modules/mob/living/carbon/human/species/station/seromi.dm +++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm @@ -49,7 +49,7 @@ heat_level_1 = 320 heat_level_2 = 370 heat_level_3 = 600 - heat_discomfort_level = 292 + heat_discomfort_level = 295 heat_discomfort_strings = list( "Your feathers prickle in the heat.", "You feel uncomfortably warm.", @@ -120,4 +120,4 @@ /datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H) ..() - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) \ No newline at end of file + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index ebbacc747eb..7c13fc239ce 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -96,8 +96,8 @@ burn_mod = 1.15 gluttonous = 1 num_alternate_languages = 2 - secondary_langs = list("Siik'tajr") - name_language = "Siik'tajr" + secondary_langs = list("Siik") + name_language = "Siik" health_hud_intensity = 2.5 min_age = 17 diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm index 19d7a799dd9..f1c92b6255c 100644 --- a/code/modules/mob/living/carbon/human/stripping.dm +++ b/code/modules/mob/living/carbon/human/stripping.dm @@ -124,8 +124,7 @@ if(can_reach_splints) var/removed_splint - for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM)) - var/obj/item/organ/external/o = get_organ(organ) + for(var/obj/item/organ/external/o in organs) if (o && o.status & ORGAN_SPLINTED) var/obj/item/W = new /obj/item/stack/medical/splint(get_turf(src), 1) o.status &= ~ORGAN_SPLINTED diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 43123eab0a0..6607d166bf7 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -336,6 +336,8 @@ var/global/list/damage_icon_parts = list() if(species.appearance_flags & HAS_UNDERWEAR) overlays_standing[UNDERWEAR_LAYER] = list() for(var/category in all_underwear) + if(hide_underwear[category]) + continue var/datum/category_item/underwear/UWI = all_underwear[category] overlays_standing[UNDERWEAR_LAYER] += UWI.generate_image(all_underwear_metadata[category]) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index d84dfe28a8b..3c6f8585f67 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -151,8 +151,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c add_language("Galactic Common", 1) add_language("Sol Common", 0) add_language("Sinta'unathi", 0) - add_language("Siik'maas", 0) - add_language("Siik'tajr", 0) + add_language("Siik", 0) add_language("Skrellian", 0) add_language("Tradeband", 1) add_language("Gutter", 0) @@ -565,7 +564,21 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c var/icon_list[] = list( "default", "floating face", - "carp" + "carp", + "ian", + "runtime", + "poly", + "pun pun", + "male human", + "female human", + "male unathi", + "female unathi", + "male tajara", + "female tajara", + "male tesharii", + "female tesharii", + "male skrell", + "female skrell" ) input = input("Please select a hologram:") as null|anything in icon_list if(input) @@ -577,6 +590,35 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo2")) if("carp") holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holo4")) + if("ian") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"corgi")) + if("runtime") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"cat")) + if("poly") + holo_icon = getHologramIcon(icon('icons/mob/animal.dmi',"parrot_fly")) + if("pun pun") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"punpun")) + if("male human") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holohumm")) + if("female human") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holohumf")) + if("male unathi") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holounam")) + if("female unathi") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holounaf")) + if("male tajara") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotajm")) + if("female tajara") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotajf")) + if("male tesharii") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotesm")) + if("female tesharii") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holotesf")) + if("male skrell") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holoskrm")) + if("female skrell") + holo_icon = getHologramIcon(icon('icons/mob/AI.dmi',"holoskrf")) + return //Toggles the luminosity and applies it by re-entereing the camera. diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 537e7c0c50f..1b11e4e9845 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -469,11 +469,11 @@ user.translator_on = !user.translator_on if(user.translator_on) user.add_language("Sinta'unathi") - user.add_language("Siik'tajr") + user.add_language("Siik") user.add_language("Skrellian") else user.remove_language("Sinta'unathi") - user.remove_language("Siik'tajr") + user.remove_language("Siik") user.remove_language("Skrellian") is_active(mob/living/silicon/pai/user) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 03fa56387a3..c1ca5732b5f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -23,7 +23,7 @@ var/global/list/robot_modules = list( var/hide_on_manifest = 0 var/channels = list() var/networks = list() - var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK_TAJR = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0) + var/languages = list(LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, LANGUAGE_SIIK = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_GUTTER = 0, LANGUAGE_SCHECHI = 0) var/sprites = list() var/can_be_pushed = 1 var/no_slip = 0 @@ -488,8 +488,7 @@ var/global/list/robot_modules = list( languages = list( LANGUAGE_SOL_COMMON = 1, LANGUAGE_UNATHI = 1, - LANGUAGE_SIIK_MAAS = 1, - LANGUAGE_SIIK_TAJR = 1, + LANGUAGE_SIIK = 1, LANGUAGE_SKRELLIAN = 1, LANGUAGE_ROOTSPEAK = 1, LANGUAGE_TRADEBAND = 1, @@ -649,8 +648,7 @@ var/global/list/robot_modules = list( LANGUAGE_SOL_COMMON = 1, LANGUAGE_TRADEBAND = 1, LANGUAGE_UNATHI = 0, - LANGUAGE_SIIK_MAAS = 0, - LANGUAGE_SIIK_TAJR = 0, + LANGUAGE_SIIK = 0, LANGUAGE_SKRELLIAN = 0, LANGUAGE_ROOTSPEAK = 0, LANGUAGE_GUTTER = 1, diff --git a/code/modules/mob/living/simple_animal/head.dm b/code/modules/mob/living/simple_animal/head.dm index 227d2bcf04a..0ce662d613e 100644 --- a/code/modules/mob/living/simple_animal/head.dm +++ b/code/modules/mob/living/simple_animal/head.dm @@ -28,7 +28,7 @@ "Crab say what?", "Man they say we have space lizards now, man this shit is getting more wack every minute", "The so called \"improved\" station AI is just bullshit, that thing aint fun for noone", - "The Captain is a traitor, he took my power core.", + "The Station Administrator is a traitor, he took my power core.", "Say \"what\" again. Say \"what\" again. I dare you. I double-dare you, motherfucker. Say \"what\" one more goddamn time.", "Ezekiel 25:17 ,The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who in the name of charity and good will shepherds the weak through the valley of darkness, for he is truly his brother's keeper and the finder of lost children. And I will strike down upon thee with great vengeance and furious anger those who attempt to poison and destroy my brothers. And you will know my name is the Lord... when I lay my vengeance upon thee.", "Did you notice a sign out in front of my house that said \"Dead Nigger Storage\"?") diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 081eb39a5c7..9d7ba1bc633 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -654,8 +654,8 @@ if(.) if(statpanel("Status") && ticker && ticker.current_state != GAME_STATE_PREGAME) - stat("Station Time", worldtime2text()) - stat("Round Duration", round_duration_as_text()) + stat("Station Time", stationtime2text()) + stat("Round Duration", roundduration2text()) if(client.holder) if(statpanel("Status")) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 46cead5a3b9..060bd2b651e 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -76,7 +76,7 @@ stat("Game Mode:", "Secret") else if(ticker.hide_mode == 0) - stat("Game Mode:", "[master_mode]") // Old setting for showing the game mode + stat("Game Mode:", "[config.mode_names[master_mode]]") // Old setting for showing the game mode if(ticker.current_state == GAME_STATE_PREGAME) stat("Time To Start:", "[ticker.pregame_timeleft][round_progressing ? "" : " (DELAYED)"]") @@ -362,7 +362,7 @@ var/dat = "
    " dat += "Welcome, [name].
    " - dat += "Round Duration: [round_duration_as_text()]
    " + dat += "Round Duration: [roundduration2text()]
    " if(emergency_shuttle) //In case Nanotrasen decides reposess CentComm's shuttles. if(emergency_shuttle.going_to_centcom()) //Shuttle is going to centcomm, not recalled diff --git a/code/modules/mob/new_player/skill.dm b/code/modules/mob/new_player/skill.dm index 1f713292029..e1e1025bae1 100644 --- a/code/modules/mob/new_player/skill.dm +++ b/code/modules/mob/new_player/skill.dm @@ -62,7 +62,7 @@ var/global/list/SKILL_PRE = list("Engineer" = SKILL_ENGINEER, "Roboticist" = SKI /datum/skill/knowledge/law ID = "law" name = "Corporate Law" - desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for captains." + desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for Station Administrators." field = "Security" secondary = 1 diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 7c68dc59721..1ff859d4d18 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -614,6 +614,28 @@ name = "Dwarf Beard" icon_state = "facial_dwarf" +//unathi horn beards and the like + + una_chinhorn + name = "Unathi Chin Horn" + icon_state = "facial_chinhorns" + species_allowed = list("Unathi") + + una_hornadorns + name = "Unathi Horn Adorns" + icon_state = "facial_hornadorns" + species_allowed = list("Unathi") + + una_spinespikes + name = "Unathi Spine Spikes" + icon_state = "facial_spikes" + species_allowed = list("Unathi") + + una_dorsalfrill + name = "Unathi Dorsal Frill" + icon_state = "facial_dorsalfrill" + species_allowed = list("Unathi") + /* /////////////////////////////////// / =---------------------------= / @@ -648,6 +670,26 @@ icon_state = "soghun_horns" species_allowed = list("Unathi") + una_bighorns + name = "Unathi Big Horns" + icon_state = "unathi_bighorn" + species_allowed = list("Unathi") + + una_smallhorns + name = "Unathi Small Horns" + icon_state = "unathi_smallhorn" + species_allowed = list("Unathi") + + una_ramhorns + name = "Unathi Ram Horns" + icon_state = "unathi_ramhorn" + species_allowed = list("Unathi") + + una_sidefrills + name = "Unathi Side Frills" + icon_state = "unathi_sidefrills" + species_allowed = list("Unathi") + skr_tentacle_m name = "Skrell Male Tentacles" icon_state = "skrell_hair_m" diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 2c5f24984a5..105a547e08e 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -135,16 +135,18 @@ var/const/BLOOD_VOLUME_SURVIVE = 40 drip(blood_max) //Makes a blood drop, leaking amt units of blood from the mob -/mob/living/carbon/human/proc/drip(var/amt as num) +/mob/living/carbon/human/proc/drip(var/amt) + if(remove_blood(amt)) + blood_splatter(src,src) +/mob/living/carbon/human/proc/remove_blood(var/amt) if(!should_have_organ(O_HEART)) //TODO: Make drips come from the reagents instead. - return + return 0 if(!amt) - return + return 0 - vessel.remove_reagent("blood",amt) - blood_splatter(src,src) + return vessel.remove_reagent("blood",amt * (src.mob_size/MOB_MEDIUM)) /**************************************************** BLOOD TRANSFERS diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm index fae4bc5ee6b..ab0b10ddf86 100644 --- a/code/modules/organs/internal/lungs.dm +++ b/code/modules/organs/internal/lungs.dm @@ -18,9 +18,15 @@ owner.emote("cough") //respitory tract infection if(is_bruised()) - if(prob(2)) + if(prob(4)) spawn owner.emote("me", 1, "coughs up blood!") owner.drip(10) - if(prob(4)) + if(prob(8)) spawn owner.emote("me", 1, "gasps for air!") - owner.losebreath += 15 \ No newline at end of file + owner.losebreath += 15 + +/obj/item/organ/internal/lungs/proc/rupture() + var/obj/item/organ/external/parent = owner.get_organ(parent_organ) + if(istype(parent)) + owner.custom_pain("You feel a stabbing pain in your [parent.name]!", 1) + bruise() \ No newline at end of file diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index e1cf0cad9e2..fad60cc0d78 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -247,6 +247,9 @@ var/list/organ_cache = list() if(parent && !silent) owner.custom_pain("Something inside your [parent.name] hurts a lot.", 1) +/obj/item/organ/proc/bruise() + damage = max(damage, min_bruised_damage) + /obj/item/organ/proc/robotize() //Being used to make robutt hearts, etc robotic = ORGAN_ROBOT src.status &= ~ORGAN_BROKEN diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 1ff2c297788..612cda4a985 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -474,6 +474,11 @@ This function completely restores a damaged organ to perfect condition. wounds += I owner.custom_pain("You feel something rip in your [name]!", 1) +//Burn damage can cause fluid loss due to blistering and cook-off + if((damage > 5 || damage + burn_dam >= 15) && type == BURN && (robotic < ORGAN_ROBOT)) + var/fluid_loss = (damage/(owner.maxHealth - config.health_threshold_dead)) * owner.species.blood_volume*(1 - BLOOD_VOLUME_SURVIVE/100) + owner.remove_blood(fluid_loss) + // first check whether we can widen an existing wound if(wounds.len > 0 && prob(max(50+(number_wounds-1)*10,90))) if((type == CUT || type == BRUISE) && damage >= 5) diff --git a/code/modules/organs/wound.dm b/code/modules/organs/wound.dm index 2c97bf4cfc0..4c2538f703c 100644 --- a/code/modules/organs/wound.dm +++ b/code/modules/organs/wound.dm @@ -92,7 +92,7 @@ // checks whether the wound has been appropriately treated proc/is_treated() - if(damage_type == BRUISE || damage_type == CUT) + if(damage_type == BRUISE || damage_type == CUT || damage_type == PIERCE) return bandaged else if(damage_type == BURN) return salved @@ -398,4 +398,4 @@ datum/wound/puncture/massive ..(damage_amt) /datum/wound/lost_limb/can_merge(var/datum/wound/other) - return 0 //cannot be merged \ No newline at end of file + return 0 //cannot be merged diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm new file mode 100644 index 00000000000..7843552f8c1 --- /dev/null +++ b/code/modules/paperwork/adminpaper.dm @@ -0,0 +1,155 @@ +//Adminpaper - it's like paper, but more adminny! +/obj/item/weapon/paper/admin + name = "administrative paper" + desc = "If you see this, something has gone horribly wrong." + var/datum/admins/admindatum = null + + var/interactions = null + var/isCrayon = 0 + var/origin = null + var/mob/sender = null + var/obj/machinery/photocopier/faxmachine/destination + + var/header = null + var/headerOn = TRUE + + var/footer = null + var/footerOn = FALSE + +/obj/item/weapon/paper/admin/New() + ..() + generateInteractions() + + +/obj/item/weapon/paper/admin/proc/generateInteractions() + //clear first + interactions = null + + //Snapshot is crazy and likes putting each topic hyperlink on a seperate line from any other tags so it's nice and clean. + interactions += "
    The fax will transmit everything above this line
    " + interactions += "Send fax " + interactions += "Pen mode: [isCrayon ? "Crayon" : "Pen"] " + interactions += "Cancel fax " + interactions += "
    " + interactions += "Toggle Header " + interactions += "Toggle Footer " + interactions += "Clear page " + interactions += "
    " + +/obj/item/weapon/paper/admin/proc/generateHeader() + var/originhash = md5("[origin]") + var/timehash = copytext(md5("[world.time]"),1,10) + var/text = null + var/logo = alert(usr, "Do you want the header of your fax to have a Nanotrasen or SolGov logo?","Fax Logo","Nanotrasen","SolGov") + if(logo == "SolGov") + logo = "sglogo.png" + else + logo = "ntlogo.png" + //TODO change logo based on who you're contacting. + text = "

    " + text += "[origin] Quantum Uplink Signed Message
    " + text += "Encryption key: [originhash]
    " + text += "Challenge: [timehash]

    " + + header = text + +/obj/item/weapon/paper/admin/proc/generateFooter() + var/text = null + + text = "
    " + text += "This transmission is intended only for the addressee and may contain confidential information. Any unauthorized disclosure is strictly prohibited.

    " + text += "If this transmission is recieved in error, please notify both the sender and the office of [boss_name] Internal Affairs immediately so that corrective action may be taken." + text += "Failure to comply is a breach of regulation and may be prosecuted to the fullest extent of the law, where applicable." + text += "
    " + + footer = text + + +/obj/item/weapon/paper/admin/proc/adminbrowse() + updateinfolinks() + generateHeader() + generateFooter() + updateDisplay() + +obj/item/weapon/paper/admin/proc/updateDisplay() + usr << browse("[name][headerOn ? header : ""][info_links][stamps][footerOn ? footer : ""][interactions]", "window=[name];can_close=0") + + + +/obj/item/weapon/paper/admin/Topic(href, href_list) + if(href_list["write"]) + var/id = href_list["write"] + if(free_space <= 0) + usr << "There isn't enough space left on \the [src] to write anything." + return + + var/t = sanitize(input("Enter what you want to write:", "Write", null, null) as message, free_space, extra = 0) + + if(!t) + return + + var last_fields_value = fields + + //t = html_encode(t) + t = replacetext(t, "\n", "
    ") + t = parsepencode(t,,, isCrayon) // Encode everything from pencode to html + + + if(fields > 50)//large amount of fields creates a heavy load on the server, see updateinfolinks() and addtofield() + usr << "Too many fields. Sorry, you can't do this." + fields = last_fields_value + return + + if(id!="end") + addtofield(text2num(id), t) // He wants to edit a field, let him. + else + info += t // Oh, he wants to edit to the end of the file, let him. + updateinfolinks() + + update_space(t) + + updateDisplay() + + update_icon() + return + + if(href_list["confirm"]) + switch(alert("Are you sure you want to send the fax as is?",, "Yes", "No")) + if("Yes") + if(headerOn) + info = header + info + if(footerOn) + info += footer + updateinfolinks() + usr << browse(null, "window=[name]") + admindatum.faxCallback(src, destination) + return + + if(href_list["penmode"]) + isCrayon = !isCrayon + generateInteractions() + updateDisplay() + return + + if(href_list["cancel"]) + usr << browse(null, "window=[name]") + qdel(src) + return + + if(href_list["clear"]) + clearpaper() + updateDisplay() + return + + if(href_list["toggleheader"]) + headerOn = !headerOn + updateDisplay() + return + + if(href_list["togglefooter"]) + footerOn = !footerOn + updateDisplay() + return + +/obj/item/weapon/paper/admin/get_signature() + return input(usr, "Enter the name you wish to sign the paper with (will prompt for multiple entries, in order of entry)", "Signature") as text|null \ No newline at end of file diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 8c30f1d4863..cf1da677f09 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -142,6 +142,7 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins flick("faxreceive", src) playsound(loc, "sound/effects/printer.ogg", 50, 1) + // give the sprite some time to flick sleep(20) @@ -163,11 +164,12 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins use_power(200) + //recieved copies should not use toner since it's being used by admins only. var/obj/item/rcvdcopy if (istype(copyitem, /obj/item/weapon/paper)) - rcvdcopy = copy(copyitem) + rcvdcopy = copy(copyitem, 0) else if (istype(copyitem, /obj/item/weapon/photo)) - rcvdcopy = photocopy(copyitem) + rcvdcopy = photocopy(copyitem, 0) else if (istype(copyitem, /obj/item/weapon/paper_bundle)) rcvdcopy = bundlecopy(copyitem, 0) else @@ -178,14 +180,15 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins adminfaxes += rcvdcopy //message badmins that a fax has arrived - switch(destination) - if (boss_name) - message_admins(sender, "[uppertext(boss_short)] FAX", rcvdcopy, "CentcommFaxReply", "#006100") - if ("Sif Governmental Authority") - message_admins(sender, "SIF GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0") - //message_admins(sender, "SOL GOVERNMENT FAX", rcvdcopy, "SolGovFaxReply", "#1F66A0") - if ("Supply") - message_admins(sender, "[uppertext(boss_short)] SUPPLY FAX", rcvdcopy, "CentcommFaxReply", "#5F4519") + if (destination == boss_name) + message_admins(sender, "[uppertext(boss_short)] FAX", rcvdcopy, "CentcommFaxReply", "#006100") + else if ("Sif Governmental Authority") + message_admins(sender, "SIF GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0") + else if ("Supply") + message_admins(sender, "[uppertext(boss_short)] SUPPLY FAX", rcvdcopy, "CentcommFaxReply", "#5F4519") + else + message_admins(sender, "[uppertext(destination)] FAX", rcvdcopy, "UNKNOWN") + sendcooldown = 1800 sleep(50) @@ -193,9 +196,11 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins /obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/obj/item/sent, var/reply_type, font_colour="#006100") - var/msg = "\blue [faxname]: [key_name(sender, 1)] (PP) (VV) (SM) ([admin_jump_link(sender, src)]) (CA) (REPLY): Receiving '[sent.name]' via secure connection ... view message" + var/msg = "[faxname]: [get_options_bar(sender, 2,1,1)]" + msg += "(REPLY): " + msg += "Receiving '[sent.name]' via secure connection ... view message" for(var/client/C in admins) - if(R_ADMIN & C.holder.rights) + if(check_rights((R_ADMIN|R_MOD),0,C)) C << msg C << 'sound/effects/printer.ogg' diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 57691fed9ba..a8e0c6eacb8 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -30,7 +30,6 @@ if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/folder) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/paper_bundle)) I.loc = src - /obj/structure/filingcabinet/attackby(obj/item/P as obj, mob/user as mob) if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/weapon/paper_bundle)) user << "You put [P] in [src]." @@ -57,7 +56,6 @@ else user << "You can't put [P] in [src]!" - /obj/structure/filingcabinet/attack_hand(mob/user as mob) if(contents.len <= 0) user << "\The [src] is empty." @@ -103,7 +101,6 @@ sleep(5) icon_state = initial(icon_state) - /* * Security Record Cabinets */ diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index cfb662a3409..b6450b44555 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -23,7 +23,7 @@ icon_state = "folder_white" /obj/item/weapon/folder/blue_captain - desc = "A blue folder with Captain markings." + desc = "A blue folder with Station Administrator markings." icon_state = "folder_captain" /obj/item/weapon/folder/blue_hop diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 1e85563ee80..d290c073820 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -232,11 +232,12 @@ t = replacetext(t, "\[/i\]", "") t = replacetext(t, "\[u\]", "") t = replacetext(t, "\[/u\]", "") - t = replacetext(t, "\[time\]", "[worldtime2text()]") - t = replacetext(t, "\[date\]", "[worlddate2text()]") + t = replacetext(t, "\[time\]", "[stationtime2text()]") + t = replacetext(t, "\[date\]", "[stationtime2text()]") t = replacetext(t, "\[large\]", "") t = replacetext(t, "\[/large\]", "") - t = replacetext(t, "\[sign\]", "[get_signature(P, user)]") + if(findtext(t, "\[sign\]")) + t = replacetext(t, "\[sign\]", "[get_signature(P, user)]") t = replacetext(t, "\[field\]", "") t = replacetext(t, "\[h1\]", "

    ") @@ -520,7 +521,7 @@ /obj/item/weapon/paper/courtroom name = "A Crash Course in Legal SOP on SS13" - info = "Roles:
    \nThe Detective is basically the investigator and prosecutor.
    \nThe Staff Assistant can perform these functions with written authority from the Detective.
    \nThe Captain/HoP/Warden is ct as the judicial authority.
    \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport.
    \n
    \nInvestigative Phase:
    \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates.
    \n
    \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant.
    \n
    \nPre-Pre-Trial Phase:
    \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination.
    \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here.
    \nPossible Motions:
    \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security.
    \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial.
    \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued.
    \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence.
    \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial.
    \n
    \nALL SIDES MOVE TO A COURTROOM
    \nPre-Trial Hearings:
    \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning.
    \n
    \nThe Trial:
    \nThe trial has three phases.
    \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence.
    \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list.
    \nFINALLY once both sides are done calling witnesses we move onto the next phase.
    \n3. Closing Arguments- Same as opening.
    \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors.
    \n
    \nSentencing Phase:
    \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part.
    \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence.
    \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence.
    \n
    \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record.
    \n" + info = "Roles:
    \nThe Detective is basically the investigator and prosecutor.
    \nThe Staff Assistant can perform these functions with written authority from the Detective.
    \nThe Station Administrator/HoP/Warden is ct as the judicial authority.
    \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport.
    \n
    \nInvestigative Phase:
    \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates.
    \n
    \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant.
    \n
    \nPre-Pre-Trial Phase:
    \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination.
    \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here.
    \nPossible Motions:
    \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security.
    \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial.
    \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued.
    \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence.
    \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial.
    \n
    \nALL SIDES MOVE TO A COURTROOM
    \nPre-Trial Hearings:
    \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning.
    \n
    \nThe Trial:
    \nThe trial has three phases.
    \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence.
    \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list.
    \nFINALLY once both sides are done calling witnesses we move onto the next phase.
    \n3. Closing Arguments- Same as opening.
    \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors.
    \n
    \nSentencing Phase:
    \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part.
    \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence.
    \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence.
    \n
    \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record.
    \n" /obj/item/weapon/paper/hydroponics name = "Greetings from Billy Bob" @@ -537,7 +538,7 @@ /obj/item/weapon/paper/jobs name = "Job Information" - info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
    \nThe data will be in the following form.
    \nGenerally lower ranking positions come first in this list.
    \n
    \nJob Name general access>lab access-engine access-systems access (atmosphere control)
    \n\tJob Description
    \nJob Duties (in no particular order)
    \nTips (where applicable)
    \n
    \nResearch Assistant 1>1-0-0
    \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
    \n1. Assist the researchers.
    \n2. Clean up the labs.
    \n3. Prepare materials.
    \n
    \nStaff Assistant 2>0-0-0
    \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
    \n1. Patrol ship/Guard key areas
    \n2. Assist security officer
    \n3. Perform other security duties.
    \n
    \nTechnical Assistant 1>0-0-1
    \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
    \n1. Assist Station technician and Engineers.
    \n2. Perform general maintenance of station.
    \n3. Prepare materials.
    \n
    \nMedical Assistant 1>1-0-0
    \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
    \n1. Assist the medical personnel.
    \n2. Update medical files.
    \n3. Prepare materials for medical operations.
    \n
    \nResearch Technician 2>3-0-0
    \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
    \n1. Inform superiors of research.
    \n2. Perform research alongside of official researchers.
    \n
    \nDetective 3>2-0-0
    \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
    \n1. Perform crime-scene investigations/draw conclusions.
    \n2. Store and catalogue evidence properly.
    \n3. Testify to superiors/inquieries on findings.
    \n
    \nStation Technician 2>0-2-3
    \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
    \n1. Maintain SS13 systems.
    \n2. Repair equipment.
    \n
    \nAtmospheric Technician 3>0-0-4
    \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
    \n1. Maintain atmosphere on SS13
    \n2. Research atmospheres on the space station. (safely please!)
    \n
    \nEngineer 2>1-3-0
    \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
    \n1. Upkeep the engine.
    \n2. Prevent fires in the engine.
    \n3. Maintain a safe orbit.
    \n
    \nMedical Researcher 2>5-0-0
    \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
    \n1. Make sure the station is kept safe.
    \n2. Research medical properties of materials studied of Space Station 13.
    \n
    \nScientist 2>5-0-0
    \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Phoron Technicians as phoron is the material they routinly handle.
    \n1. Research phoron
    \n2. Make sure all phoron is properly handled.
    \n
    \nMedical Doctor (Officer) 2>0-0-0
    \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
    \n1. Heal wounded people.
    \n2. Perform examinations of all personnel.
    \n3. Moniter usage of medical equipment.
    \n
    \nSecurity Officer 3>0-0-0
    \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
    \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
    \n1. Maintain order.
    \n2. Assist others.
    \n3. Repair structural problems.
    \n
    \nHead of Security 4>5-2-2
    \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
    \n1. Oversee security.
    \n2. Assign patrol duties.
    \n3. Protect the station and staff.
    \n
    \nHead of Personnel 4>4-2-2
    \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
    \n1. Assign duties.
    \n2. Moderate personnel.
    \n3. Moderate research.
    \n
    \nCaptain 5>5-5-5 (unrestricted station wide access)
    \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
    \n1. Assign all positions on SS13
    \n2. Inspect the station for any problems.
    \n3. Perform administrative duties.
    \n" + info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
    \nThe data will be in the following form.
    \nGenerally lower ranking positions come first in this list.
    \n
    \nJob Name general access>lab access-engine access-systems access (atmosphere control)
    \n\tJob Description
    \nJob Duties (in no particular order)
    \nTips (where applicable)
    \n
    \nResearch Assistant 1>1-0-0
    \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
    \n1. Assist the researchers.
    \n2. Clean up the labs.
    \n3. Prepare materials.
    \n
    \nStaff Assistant 2>0-0-0
    \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
    \n1. Patrol ship/Guard key areas
    \n2. Assist security officer
    \n3. Perform other security duties.
    \n
    \nTechnical Assistant 1>0-0-1
    \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
    \n1. Assist Station technician and Engineers.
    \n2. Perform general maintenance of station.
    \n3. Prepare materials.
    \n
    \nMedical Assistant 1>1-0-0
    \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
    \n1. Assist the medical personnel.
    \n2. Update medical files.
    \n3. Prepare materials for medical operations.
    \n
    \nResearch Technician 2>3-0-0
    \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
    \n1. Inform superiors of research.
    \n2. Perform research alongside of official researchers.
    \n
    \nDetective 3>2-0-0
    \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
    \n1. Perform crime-scene investigations/draw conclusions.
    \n2. Store and catalogue evidence properly.
    \n3. Testify to superiors/inquieries on findings.
    \n
    \nStation Technician 2>0-2-3
    \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
    \n1. Maintain SS13 systems.
    \n2. Repair equipment.
    \n
    \nAtmospheric Technician 3>0-0-4
    \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
    \n1. Maintain atmosphere on SS13
    \n2. Research atmospheres on the space station. (safely please!)
    \n
    \nEngineer 2>1-3-0
    \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
    \n1. Upkeep the engine.
    \n2. Prevent fires in the engine.
    \n3. Maintain a safe orbit.
    \n
    \nMedical Researcher 2>5-0-0
    \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
    \n1. Make sure the station is kept safe.
    \n2. Research medical properties of materials studied of Space Station 13.
    \n
    \nScientist 2>5-0-0
    \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Phoron Technicians as phoron is the material they routinly handle.
    \n1. Research phoron
    \n2. Make sure all phoron is properly handled.
    \n
    \nMedical Doctor (Officer) 2>0-0-0
    \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
    \n1. Heal wounded people.
    \n2. Perform examinations of all personnel.
    \n3. Moniter usage of medical equipment.
    \n
    \nSecurity Officer 3>0-0-0
    \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
    \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
    \n1. Maintain order.
    \n2. Assist others.
    \n3. Repair structural problems.
    \n
    \nHead of Security 4>5-2-2
    \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
    \n1. Oversee security.
    \n2. Assign patrol duties.
    \n3. Protect the station and staff.
    \n
    \nHead of Personnel 4>4-2-2
    \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
    \n1. Assign duties.
    \n2. Moderate personnel.
    \n3. Moderate research.
    \n
    \nStation Administrator 5>5-5-5 (unrestricted station wide access)
    \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
    \n1. Assign all positions on SS13
    \n2. Inspect the station for any problems.
    \n3. Perform administrative duties.
    \n" /obj/item/weapon/paper/photograph name = "photo" diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index ec0d7acf19f..57d10ed227e 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -16,7 +16,6 @@ var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier! /obj/machinery/photocopier/New() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/motor(src) @@ -165,7 +164,7 @@ toner = 0 return -/obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy) +/obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy, var/need_toner=1) var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc) if(toner > 10) //lots of toner, make it dark c.info = "" @@ -196,13 +195,14 @@ img.pixel_y = copy.offset_y[j] c.overlays += img c.updateinfolinks() - toner-- + if(need_toner) + toner-- if(toner == 0) visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") return c -/obj/machinery/photocopier/proc/photocopy(var/obj/item/weapon/photo/photocopy) +/obj/machinery/photocopier/proc/photocopy(var/obj/item/weapon/photo/photocopy, var/need_toner=1) var/obj/item/weapon/photo/p = photocopy.copy() p.loc = src.loc @@ -216,7 +216,8 @@ p.img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) p.tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100)) p.icon = I - toner -= 5 //photos use a lot of ink! + if(need_toner) + toner -= 5 //photos use a lot of ink! if(toner < 0) toner = 0 visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index feb740ba735..59f0dd67b2e 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -13,7 +13,7 @@ attack_verb = list("stamped") /obj/item/weapon/stamp/captain - name = "captain's rubber stamp" + name = "station administrator's rubber stamp" icon_state = "stamp-cap" /obj/item/weapon/stamp/hop diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index b2277c74cf2..d17b69f93f7 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -200,6 +200,25 @@ user << "You need more welding fuel to complete this task." return + if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL) + var/amt = Ceiling(( initial(integrity) - integrity)/10) + if(!amt) + user << "\The [src] is already fully repaired." + return + var/obj/item/stack/P = W + if(P.amount < amt) + user << "You don't have enough sheets to repair this! You need at least [amt] sheets." + return + user << "You begin repairing \the [src]..." + if(do_after(user, 30)) + if(P.use(amt)) + user << "You have repaired \the [src]." + integrity = initial(integrity) + return + else + user << "You don't have enough sheets to repair this! You need at least [amt] sheets." + return + if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(emagged) user << "The lock seems to be broken." @@ -225,10 +244,25 @@ return 1 /obj/machinery/power/emitter/bullet_act(var/obj/item/projectile/P) - if(!P || !P.damage || (!P.damage_type == BRUTE || !P.damage_type == BURN) ) + if(!P || !P.damage || P.get_structure_damage() <= 0 ) return integrity = integrity - P.damage - if(integrity >= 0) - explosion(get_turf(src), 1, 2, 4) + if(integrity <= 0) + if(powernet && avail(active_power_usage)) // If it's powered, it goes boom if killed. + visible_message(src, "\The [src] explodes violently!", "You hear an explosion!") + explosion(get_turf(src), 1, 2, 4) + else + src.visible_message("\The [src] crumples apart!", "You hear metal collapsing.") qdel(src) + +/obj/machinery/power/emitter/examine(mob/user) + ..() + var/integrity_percentage = round((integrity / initial(integrity)) * 100) + switch(integrity_percentage) + if(0 to 30) + user << "\The [src] is close to falling apart!" + if(31 to 70) + user << "\The [src] is damaged." + if(77 to 99) + user << "\The [src] is slightly damaged." diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 115d9f057f6..c1a80f3b1a2 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -135,10 +135,11 @@ if(safety_level == 1) M << "\The [src] hisses in dissapointment." visible_message("\The [src] announces, \"Self-destruct occurring in ten seconds.\"", "\The [src] announces, \"Self-destruct occurring in ten seconds.\"") - sleep(100) - explosion(src, -1, 0, 2, 3, 0) - exploding = 1 - qdel(src) + spawn(100) + explosion(src, 0, 0, 3, 4) + exploding = 1 + sleep(1) + qdel(src) return 0 if(HULK in M.mutations) M << "Your fingers are much too large for the trigger guard!" 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 5d400776357..525309f93b5 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -587,7 +587,7 @@ name = "Tea" id = "tea" description = "Tasty black tea, it has antioxidants, it's good for you!" - color = "#101000" + color = "#832700" adj_dizzy = -2 adj_drowsy = -1 adj_sleepy = -3 @@ -596,6 +596,10 @@ glass_name = "cup of tea" glass_desc = "Tasty black tea, it has antioxidants, it's good for you!" + cup_icon_state = "cup_tea" + cup_name = "cup of tea" + cup_desc = "Tasty black tea, it has antioxidants, it's good for you!" + /datum/reagent/drink/tea/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien == IS_DIONA) @@ -606,13 +610,17 @@ name = "Iced Tea" id = "icetea" description = "No relation to a certain rap artist/ actor." - color = "#104038" // rgb: 16, 64, 56 + color = "#AC7F24" // rgb: 16, 64, 56 adj_temp = -5 glass_name = "iced tea" glass_desc = "No relation to a certain rap artist/ actor." glass_special = list(DRINK_ICE) + cup_icon_state = "cup_tea" + cup_name = "cup of iced tea" + cup_desc = "No relation to a certain rap artist/ actor." + /datum/reagent/drink/coffee name = "Coffee" id = "coffee" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index ac054b224f9..0d83a5725c2 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -133,7 +133,7 @@ M.adjustOxyLoss(3 * removed) M.Weaken(10) M.silent = max(M.silent, 10) - M.tod = worldtime2text() + M.tod = stationtime2text() /datum/reagent/toxin/zombiepowder/Destroy() if(holder && holder.my_atom && ismob(holder.my_atom)) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index c1a585cbaad..b8a6e2bd517 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -256,8 +256,8 @@ ..() /obj/item/weapon/reagent_containers/food/drinks/flask - name = "\improper Captain's flask" - desc = "A metal flask belonging to the captain" + name = "\improper Station Administrator's flask" + desc = "A metal flask belonging to the Station Administrator" icon_state = "flask" volume = 60 center_of_mass = list("x"=17, "y"=7) diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm index c0189dd1c67..a8a8bca6d3b 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm @@ -6,12 +6,13 @@ amount_per_transfer_from_this = 10 volume = 100 item_state = "broken_beer" //Generic held-item sprite until unique ones are made. - force = 5 + force = 6 var/smash_duration = 5 //Directly relates to the 'weaken' duration. Lowered by armor (i.e. helmets) var/isGlass = 1 //Whether the 'bottle' is made of glass or not so that milk cartons dont shatter when someone gets hit by it var/obj/item/weapon/reagent_containers/glass/rag/rag = null var/rag_underlay = "rag" + on_reagent_change() return // To suppress price updating. Bottles have their own price tags. /obj/item/weapon/reagent_containers/food/drinks/bottle/New() ..() @@ -172,7 +173,7 @@ desc = "A bottle with a sharp broken bottom." icon = 'icons/obj/drinks.dmi' icon_state = "broken_bottle" - force = 9 + force = 10 throwforce = 5 throw_speed = 3 throw_range = 5 diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 6296a8b9516..8a5c8cc7b41 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -38,7 +38,6 @@ operating = 1 setmove() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/gear(src) component_parts += new /obj/item/weapon/stock_parts/motor(src) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index e444bcb8c15..6831034edf1 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -24,7 +24,6 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). /obj/machinery/r_n_d/circuit_imprinter/New() ..() - circuit = new circuit() component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 686a2730238..3fbb141f7e8 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -18,7 +18,6 @@ Note: Must be placed within 3 tiles of the R&D Console /obj/machinery/r_n_d/destructive_analyzer/New() ..() - circuit = new circuit() component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 46b688929d3..d5237e5a818 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -19,7 +19,6 @@ /obj/machinery/r_n_d/protolathe/New() ..() - circuit = new circuit() component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 186c869ad35..24e0c7ae4e9 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -389,7 +389,7 @@ won't update every console in existence) but it's more of a hassle to do. Also, PR.name = "list of researched technologies" PR.info = "
    [station_name()] Science Laboratories" PR.info += "

    [ (text2num(href_list["print"]) == 2) ? "Detailed" : ] Research Progress Report

    " - PR.info += "report prepared at [worldtime2text()] station time

    " + PR.info += "report prepared at [stationtime2text()] station time


    " if(text2num(href_list["print"]) == 2) PR.info += GetResearchListInfo() else diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index bf4cab0697e..abcfdd0fa0b 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -17,7 +17,6 @@ /obj/machinery/r_n_d/server/New() ..() - circuit = new circuit() component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/stack/cable_coil(src) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact.dm b/code/modules/research/xenoarchaeology/artifact/artifact.dm deleted file mode 100644 index 71819efc651..00000000000 --- a/code/modules/research/xenoarchaeology/artifact/artifact.dm +++ /dev/null @@ -1,123 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Large finds - (Potentially) active alien machinery from the dawn of time - -/datum/artifact_find - var/artifact_id - var/artifact_find_type - var/artifact_detect_range - -/datum/artifact_find/New() - artifact_detect_range = rand(5,300) - - artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]" - - artifact_find_type = pick(\ - 5;/obj/machinery/power/supermatter,\ - 5;/obj/structure/constructshell,\ - 5;/obj/machinery/syndicate_beacon,\ - 25;/obj/machinery/power/supermatter/shard,\ - 50;/obj/structure/cult/pylon,\ - 100;/obj/machinery/auto_cloner,\ - 100;/obj/machinery/giga_drill,\ - 100;/obj/machinery/replicator,\ - 150;/obj/structure/crystal,\ - 1000;/obj/machinery/artifact) - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Boulders - sometimes turn up after excavating turf - excavate further to try and find large xenoarch finds - -/obj/structure/boulder - name = "rocky debris" - desc = "Leftover rock from an excavation, it's been partially dug out already but there's still a lot to go." - icon = 'icons/obj/mining.dmi' - icon_state = "boulder1" - density = 1 - opacity = 1 - anchored = 1 - var/excavation_level = 0 - var/datum/geosample/geological_data - var/datum/artifact_find/artifact_find - var/last_act = 0 - -/obj/structure/boulder/New() - icon_state = "boulder[rand(1,4)]" - excavation_level = rand(5,50) - -/obj/structure/boulder/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/device/core_sampler)) - src.geological_data.artifact_distance = rand(-100,100) / 100 - src.geological_data.artifact_id = artifact_find.artifact_id - - var/obj/item/device/core_sampler/C = W - C.sample_item(src, user) - return - - if (istype(W, /obj/item/device/depth_scanner)) - var/obj/item/device/depth_scanner/C = W - C.scan_atom(user, src) - return - - if (istype(W, /obj/item/device/measuring_tape)) - var/obj/item/device/measuring_tape/P = W - user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].") - if(do_after(user,40)) - user << "\blue \icon[P] [src] has been excavated to a depth of [2*src.excavation_level]cm." - return - - if (istype(W, /obj/item/weapon/pickaxe)) - var/obj/item/weapon/pickaxe/P = W - - if(last_act + P.digspeed > world.time)//prevents message spam - return - last_act = world.time - - user << "\red You start [P.drill_verb] [src]." - - - - if(!do_after(user,P.digspeed)) - return - - user << "\blue You finish [P.drill_verb] [src]." - excavation_level += P.excavation_amount - - if(excavation_level > 100) - //failure - user.visible_message("[src] suddenly crumbles away.",\ - "\red [src] has disintegrated under your onslaught, any secrets it was holding are long gone.") - qdel(src) - return - - if(prob(excavation_level)) - //success - if(artifact_find) - var/spawn_type = artifact_find.artifact_find_type - var/obj/O = new spawn_type(get_turf(src)) - if(istype(O,/obj/machinery/artifact)) - var/obj/machinery/artifact/X = O - if(X.my_effect) - X.my_effect.artifact_id = artifact_find.artifact_id - src.visible_message("[src] suddenly crumbles away.") - else - user.visible_message("[src] suddenly crumbles away.",\ - "\blue [src] has been whittled away under your careful excavation, but there was nothing of interest inside.") - qdel(src) - -/obj/structure/boulder/Bumped(AM) - . = ..() - if(istype(AM,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = AM - var/obj/item/weapon/pickaxe/P = H.get_inactive_hand() - if(istype(P)) - src.attackby(P, H) - - else if(istype(AM,/mob/living/silicon/robot)) - var/mob/living/silicon/robot/R = AM - if(istype(R.module_active,/obj/item/weapon/pickaxe)) - attackby(R.module_active,R) - - else if(istype(AM,/obj/mecha)) - var/obj/mecha/M = AM - if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill)) - M.selected.action(src) diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm deleted file mode 100644 index 7556369b11e..00000000000 --- a/code/modules/research/xenoarchaeology/chemistry.dm +++ /dev/null @@ -1,90 +0,0 @@ - -//chemistry stuff here so that it can be easily viewed/modified - -/obj/item/weapon/reagent_containers/glass/solution_tray - name = "solution tray" - desc = "A small, open-topped glass container for delicate research samples. It sports a re-useable strip for labelling with a pen." - icon = 'icons/obj/device.dmi' - icon_state = "solution_tray" - matter = list("glass" = 5) - w_class = 2.0 - amount_per_transfer_from_this = 1 - possible_transfer_amounts = list(1, 2) - volume = 2 - flags = OPENCONTAINER - -obj/item/weapon/reagent_containers/glass/solution_tray/attackby(obj/item/weapon/W as obj, mob/living/user as mob) - if(istype(W, /obj/item/weapon/pen)) - var/new_label = sanitizeSafe(input("What should the new label be?","Label solution tray"), MAX_NAME_LEN) - if(new_label) - name = "solution tray ([new_label])" - user << "\blue You write on the label of the solution tray." - else - ..(W, user) - -/obj/item/weapon/storage/box/solution_trays - name = "solution tray box" - icon_state = "solution_trays" - - New() - ..() - new /obj/item/weapon/reagent_containers/glass/solution_tray( src ) - new /obj/item/weapon/reagent_containers/glass/solution_tray( src ) - new /obj/item/weapon/reagent_containers/glass/solution_tray( src ) - new /obj/item/weapon/reagent_containers/glass/solution_tray( src ) - new /obj/item/weapon/reagent_containers/glass/solution_tray( src ) - new /obj/item/weapon/reagent_containers/glass/solution_tray( src ) - new /obj/item/weapon/reagent_containers/glass/solution_tray( src ) - -/obj/item/weapon/reagent_containers/glass/beaker/tungsten - name = "beaker 'tungsten'" - New() - ..() - reagents.add_reagent("tungsten",50) - update_icon() - -/obj/item/weapon/reagent_containers/glass/beaker/oxygen - name = "beaker 'oxygen'" - New() - ..() - reagents.add_reagent("oxygen",50) - update_icon() - -/obj/item/weapon/reagent_containers/glass/beaker/sodium - name = "beaker 'sodium'" - New() - ..() - reagents.add_reagent("sodium",50) - update_icon() - -/obj/item/weapon/reagent_containers/glass/beaker/lithium - name = "beaker 'lithium'" - - New() - ..() - reagents.add_reagent("lithium",50) - update_icon() - -/obj/item/weapon/reagent_containers/glass/beaker/water - name = "beaker 'water'" - - New() - ..() - reagents.add_reagent("water",50) - update_icon() - -/obj/item/weapon/reagent_containers/glass/beaker/water - name = "beaker 'water'" - - New() - ..() - reagents.add_reagent("water",50) - update_icon() - -/obj/item/weapon/reagent_containers/glass/beaker/fuel - name = "beaker 'fuel'" - - New() - ..() - reagents.add_reagent("fuel",50) - update_icon() diff --git a/code/modules/research/xenoarchaeology/finds/finds_defines.dm b/code/modules/research/xenoarchaeology/finds/finds_defines.dm deleted file mode 100644 index 4026cc0a03a..00000000000 --- a/code/modules/research/xenoarchaeology/finds/finds_defines.dm +++ /dev/null @@ -1,281 +0,0 @@ - -#define ARCHAEO_BOWL 1 -#define ARCHAEO_URN 2 -#define ARCHAEO_CUTLERY 3 -#define ARCHAEO_STATUETTE 4 -#define ARCHAEO_INSTRUMENT 5 -#define ARCHAEO_KNIFE 6 -#define ARCHAEO_COIN 7 -#define ARCHAEO_HANDCUFFS 8 -#define ARCHAEO_BEARTRAP 9 -#define ARCHAEO_LIGHTER 10 -#define ARCHAEO_BOX 11 -#define ARCHAEO_GASTANK 12 -#define ARCHAEO_TOOL 13 -#define ARCHAEO_METAL 14 -#define ARCHAEO_PEN 15 -#define ARCHAEO_CRYSTAL 16 -#define ARCHAEO_CULTBLADE 17 -#define ARCHAEO_TELEBEACON 18 -#define ARCHAEO_CLAYMORE 19 -#define ARCHAEO_CULTROBES 20 -#define ARCHAEO_SOULSTONE 21 -#define ARCHAEO_SHARD 22 -#define ARCHAEO_RODS 23 -#define ARCHAEO_STOCKPARTS 24 -#define ARCHAEO_KATANA 25 -#define ARCHAEO_LASER 26 -#define ARCHAEO_GUN 27 -#define ARCHAEO_UNKNOWN 28 -#define ARCHAEO_FOSSIL 29 -#define ARCHAEO_SHELL 30 -#define ARCHAEO_PLANT 31 -#define ARCHAEO_REMAINS_HUMANOID 32 -#define ARCHAEO_REMAINS_ROBOT 33 -#define ARCHAEO_REMAINS_XENO 34 -#define ARCHAEO_GASMASK 35 -#define MAX_ARCHAEO 35 -//eggs -//droppings -//footprints -//alien clothing - -//DNA sampling from fossils, or a new archaeo type specifically for it? - -//descending order of likeliness to spawn -#define DIGSITE_GARDEN 1 -#define DIGSITE_ANIMAL 2 -#define DIGSITE_HOUSE 3 -#define DIGSITE_TECHNICAL 4 -#define DIGSITE_TEMPLE 5 -#define DIGSITE_WAR 6 - -/proc/get_responsive_reagent(var/find_type) - switch(find_type) - if(ARCHAEO_BOWL) - return "mercury" - if(ARCHAEO_URN) - return "mercury" - if(ARCHAEO_CUTLERY) - return "mercury" - if(ARCHAEO_STATUETTE) - return "mercury" - if(ARCHAEO_INSTRUMENT) - return "mercury" - if(ARCHAEO_COIN) - return "iron" - if(ARCHAEO_KNIFE) - return "iron" - if(ARCHAEO_HANDCUFFS) - return "mercury" - if(ARCHAEO_BEARTRAP) - return "mercury" - if(ARCHAEO_LIGHTER) - return "mercury" - if(ARCHAEO_BOX) - return "mercury" - if(ARCHAEO_GASTANK) - return "mercury" - if(ARCHAEO_TOOL) - return "iron" - if(ARCHAEO_METAL) - return "iron" - if(ARCHAEO_PEN) - return "mercury" - if(ARCHAEO_CRYSTAL) - return "nitrogen" - if(ARCHAEO_CULTBLADE) - return "potassium" - if(ARCHAEO_TELEBEACON) - return "potassium" - if(ARCHAEO_CLAYMORE) - return "iron" - if(ARCHAEO_CULTROBES) - return "potassium" - if(ARCHAEO_SOULSTONE) - return "nitrogen" - if(ARCHAEO_SHARD) - return "nitrogen" - if(ARCHAEO_RODS) - return "iron" - if(ARCHAEO_STOCKPARTS) - return "potassium" - if(ARCHAEO_KATANA) - return "iron" - if(ARCHAEO_LASER) - return "iron" - if(ARCHAEO_GUN) - return "iron" - if(ARCHAEO_UNKNOWN) - return "mercury" - if(ARCHAEO_FOSSIL) - return "carbon" - if(ARCHAEO_SHELL) - return "carbon" - if(ARCHAEO_PLANT) - return "carbon" - if(ARCHAEO_REMAINS_HUMANOID) - return "carbon" - if(ARCHAEO_REMAINS_ROBOT) - return "carbon" - if(ARCHAEO_REMAINS_XENO) - return "carbon" - if(ARCHAEO_GASMASK) - return "carbon" - return "phoron" - -//see /turf/simulated/mineral/New() in code/modules/mining/mine_turfs.dm -/proc/get_random_digsite_type() - return pick(100;DIGSITE_GARDEN,95;DIGSITE_ANIMAL,90;DIGSITE_HOUSE,85;DIGSITE_TECHNICAL,80;DIGSITE_TEMPLE,75;DIGSITE_WAR) - -/proc/get_random_find_type(var/digsite) - - var/find_type = 0 - switch(digsite) - if(DIGSITE_GARDEN) - find_type = pick(\ - 100;ARCHAEO_PLANT,\ - 25;ARCHAEO_SHELL,\ - 25;ARCHAEO_FOSSIL,\ - 5;ARCHAEO_BEARTRAP\ - ) - if(DIGSITE_ANIMAL) - find_type = pick(\ - 100;ARCHAEO_FOSSIL,\ - 50;ARCHAEO_SHELL,\ - 50;ARCHAEO_PLANT,\ - 25;ARCHAEO_BEARTRAP\ - ) - if(DIGSITE_HOUSE) - find_type = pick(\ - 100;ARCHAEO_BOWL,\ - 100;ARCHAEO_URN,\ - 100;ARCHAEO_CUTLERY,\ - 100;ARCHAEO_STATUETTE,\ - 100;ARCHAEO_INSTRUMENT,\ - 100;ARCHAEO_PEN,\ - 100;ARCHAEO_LIGHTER,\ - 100;ARCHAEO_BOX,\ - 75;ARCHAEO_GASMASK,\ - 75;ARCHAEO_COIN,\ - 75;ARCHAEO_UNKNOWN,\ - 50;ARCHAEO_SHARD,\ - 50;ARCHAEO_RODS,\ - 25;ARCHAEO_METAL\ - ) - if(DIGSITE_TECHNICAL) - find_type = pick(\ - 125;ARCHAEO_GASMASK,\ - 100;ARCHAEO_METAL,\ - 100;ARCHAEO_GASTANK,\ - 100;ARCHAEO_TELEBEACON,\ - 100;ARCHAEO_TOOL,\ - 100;ARCHAEO_STOCKPARTS,\ - 75;ARCHAEO_SHARD,\ - 75;ARCHAEO_RODS,\ - 75;ARCHAEO_UNKNOWN,\ - 50;ARCHAEO_HANDCUFFS,\ - 50;ARCHAEO_BEARTRAP,\ - ) - if(DIGSITE_TEMPLE) - find_type = pick(\ - 200;ARCHAEO_CULTROBES,\ - 200;ARCHAEO_STATUETTE,\ - 100;ARCHAEO_URN,\ - 100;ARCHAEO_BOWL,\ - 100;ARCHAEO_KNIFE,\ - 100;ARCHAEO_CRYSTAL,\ - 75;ARCHAEO_CULTBLADE,\ - 50;ARCHAEO_SOULSTONE,\ - 50;ARCHAEO_UNKNOWN,\ - 25;ARCHAEO_HANDCUFFS,\ - 25;ARCHAEO_BEARTRAP,\ - 10;ARCHAEO_KATANA,\ - 10;ARCHAEO_CLAYMORE,\ - 10;ARCHAEO_SHARD,\ - 10;ARCHAEO_RODS,\ - 10;ARCHAEO_METAL,\ - 10;ARCHAEO_GASMASK,\ - ) - if(DIGSITE_WAR) - find_type = pick(\ - 100;ARCHAEO_GUN,\ - 100;ARCHAEO_KNIFE,\ - 75;ARCHAEO_LASER,\ - 75;ARCHAEO_KATANA,\ - 75;ARCHAEO_CLAYMORE,\ - 50;ARCHAEO_UNKNOWN,\ - 50;ARCHAEO_CULTROBES,\ - 50;ARCHAEO_CULTBLADE,\ - 50;ARCHAEO_GASMASK,\ - 25;ARCHAEO_HANDCUFFS,\ - 25;ARCHAEO_BEARTRAP,\ - 25;ARCHAEO_TOOL\ - ) - return find_type - -var/list/responsive_carriers = list( \ - "carbon", \ - "potassium", \ - "hydrogen", \ - "nitrogen", \ - "mercury", \ - "iron", \ - "chlorine", \ - "phosphorus", \ - "phoron") - -var/list/finds_as_strings = list( \ - "Trace organic cells", \ - "Long exposure particles", \ - "Trace water particles", \ - "Crystalline structures", \ - "Metallic derivative", \ - "Metallic composite", \ - "Metamorphic/igneous rock composite", \ - "Metamorphic/sedimentary rock composite", \ - "Anomalous material" ) - -#undef ARCHAEO_BOWL -#undef ARCHAEO_URN -#undef ARCHAEO_CUTLERY -#undef ARCHAEO_STATUETTE -#undef ARCHAEO_INSTRUMENT -#undef ARCHAEO_KNIFE -#undef ARCHAEO_COIN -#undef ARCHAEO_HANDCUFFS -#undef ARCHAEO_BEARTRAP -#undef ARCHAEO_LIGHTER -#undef ARCHAEO_BOX -#undef ARCHAEO_GASTANK -#undef ARCHAEO_TOOL -#undef ARCHAEO_METAL -#undef ARCHAEO_PEN -#undef ARCHAEO_CRYSTAL -#undef ARCHAEO_CULTBLADE -#undef ARCHAEO_TELEBEACON -#undef ARCHAEO_CLAYMORE -#undef ARCHAEO_CULTROBES -#undef ARCHAEO_SOULSTONE -#undef ARCHAEO_SHARD -#undef ARCHAEO_RODS -#undef ARCHAEO_STOCKPARTS -#undef ARCHAEO_KATANA -#undef ARCHAEO_LASER -#undef ARCHAEO_GUN -#undef ARCHAEO_UNKNOWN -#undef ARCHAEO_FOSSIL -#undef ARCHAEO_SHELL -#undef ARCHAEO_PLANT -#undef ARCHAEO_REMAINS_HUMANOID -#undef ARCHAEO_REMAINS_ROBOT -#undef ARCHAEO_REMAINS_XENO -#undef ARCHAEO_GASMASK -#undef MAX_ARCHAEO - -#undef DIGSITE_GARDEN -#undef DIGSITE_ANIMAL -#undef DIGSITE_HOUSE -#undef DIGSITE_TECHNICAL -#undef DIGSITE_TEMPLE -#undef DIGSITE_WAR diff --git a/code/modules/research/xenoarchaeology/geosample.dm b/code/modules/research/xenoarchaeology/geosample.dm deleted file mode 100644 index 535a0b4f073..00000000000 --- a/code/modules/research/xenoarchaeology/geosample.dm +++ /dev/null @@ -1,129 +0,0 @@ -/* -#define FIND_PLANT 1 -#define FIND_BIO 2 -#define FIND_METEORIC 3 -#define FIND_ICE 4 -#define FIND_CRYSTALLINE 5 -#define FIND_METALLIC 6 -#define FIND_IGNEOUS 7 -#define FIND_METAMORPHIC 8 -#define FIND_SEDIMENTARY 9 -#define FIND_NOTHING 10 -*/ - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Rock sliver - -/obj/item/weapon/rocksliver - name = "rock sliver" - desc = "It looks extremely delicate." - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "sliver1" //0-4 - w_class = 1 - sharp = 1 - //item_state = "electronic" - var/source_rock = "/turf/simulated/mineral/" - var/datum/geosample/geological_data - -/obj/item/weapon/rocksliver/New() - icon_state = "sliver[rand(1,3)]" - pixel_x = rand(0,16)-8 - pixel_y = rand(0,8)-8 - create_reagents(50) - reagents.add_reagent("ground_rock",50) - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Geosample datum - -/datum/geosample - var/age = 0 //age can correspond to different archaeological finds - var/age_thousand = 0 - var/age_million = 0 - var/age_billion = 0 - var/artifact_id = "" //id of a nearby artifact, if there is one - var/artifact_distance = -1 //proportional to distance - var/source_mineral = "chlorine" //machines will pop up a warning telling players that the sample may be confused - // - //var/source_mineral - //all potential finds are initialised to null, so nullcheck before you access them - var/list/find_presence = list() - -/datum/geosample/New(var/turf/simulated/mineral/container) - - UpdateTurf(container) - -//this should only need to be called once -/datum/geosample/proc/UpdateTurf(var/turf/simulated/mineral/container) - set background = 1 - if(!container || !istype(container)) - return - - age = rand(1,999) - - if(container.mineral) - if(islist(container.mineral.xarch_ages)) - var/list/ages = container.mineral.xarch_ages - if(ages["thousand"]) - age_thousand = rand(1,ages["thousand"]) - if(ages["million"]) - age_million = rand(1,ages["million"]) - if(ages["billion"]) - if(ages["billion_lower"]) - age_billion = rand(ages["billion_lower"],ages["billion"]) - else - age_billion = rand(1,ages["billion"]) - if(container.mineral.xarch_source_mineral) - source_mineral = container.mineral.xarch_source_mineral - - if(prob(75)) - find_presence["phosphorus"] = rand(1,500) / 100 - if(prob(25)) - find_presence["mercury"] = rand(1,500) / 100 - find_presence["chlorine"] = rand(500,2500) / 100 - - //loop over finds, grab any relevant stuff - for(var/datum/find/F in container.finds) - var/responsive_reagent = get_responsive_reagent(F.find_type) - find_presence[responsive_reagent] = F.dissonance_spread - - //loop over again to reset values to percentages - var/total_presence = 0 - for(var/carrier in find_presence) - total_presence += find_presence[carrier] - for(var/carrier in find_presence) - find_presence[carrier] = find_presence[carrier] / total_presence - - /*for(var/entry in find_presence) - total_spread += find_presence[entry]*/ - -//have this separate from UpdateTurf() so that we dont have a billion turfs being updated (redundantly) every time an artifact spawns -/datum/geosample/proc/UpdateNearbyArtifactInfo(var/turf/simulated/mineral/container) - if(!container || !istype(container)) - return - - if(container.artifact_find) - artifact_distance = rand() - artifact_id = container.artifact_find.artifact_id - else - if(master_controller) //Sanity check due to runtimes ~Z - for(var/turf/simulated/mineral/T in master_controller.artifact_spawning_turfs) - if(T.artifact_find) - var/cur_dist = get_dist(container, T) * 2 - if( (artifact_distance < 0 || cur_dist < artifact_distance) && cur_dist <= T.artifact_find.artifact_detect_range ) - artifact_distance = cur_dist + rand() * 2 - 1 - artifact_id = T.artifact_find.artifact_id - else - master_controller.artifact_spawning_turfs.Remove(T) - -/* -#undef FIND_PLANT -#undef FIND_BIO -#undef FIND_METEORIC -#undef FIND_ICE -#undef FIND_CRYSTALLINE -#undef FIND_METALLIC -#undef FIND_IGNEOUS -#undef FIND_METAMORPHIC -#undef FIND_SEDIMENTARY -#undef FIND_NOTHING -*/ diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm b/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm deleted file mode 100644 index ebab6fac765..00000000000 --- a/code/modules/research/xenoarchaeology/machinery/artifact_analyser.dm +++ /dev/null @@ -1,249 +0,0 @@ - -/obj/machinery/artifact_analyser - name = "Anomaly Analyser" - desc = "Studies the emissions of anomalous materials to discover their uses." - icon = 'icons/obj/virology.dmi' - icon_state = "isolator" - anchored = 1 - density = 1 - var/scan_in_progress = 0 - var/scan_num = 0 - var/obj/scanned_obj - var/obj/machinery/artifact_scanpad/owned_scanner = null - var/scan_completion_time = 0 - var/scan_duration = 120 - var/obj/scanned_object - var/report_num = 0 - -/obj/machinery/artifact_analyser/New() - ..() - reconnect_scanner() - -/obj/machinery/artifact_analyser/proc/reconnect_scanner() - //connect to a nearby scanner pad - owned_scanner = locate(/obj/machinery/artifact_scanpad) in get_step(src, dir) - if(!owned_scanner) - owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src) - -/obj/machinery/artifact_analyser/attack_hand(var/mob/user as mob) - src.add_fingerprint(user) - interact(user) - -/obj/machinery/artifact_analyser/interact(mob/user) - if(stat & (NOPOWER|BROKEN) || get_dist(src, user) > 1) - user.unset_machine(src) - return - - var/dat = "Anomalous material analyser
    " - dat += "
    " - if(!owned_scanner) - owned_scanner = locate() in orange(1, src) - - if(!owned_scanner) - dat += "Unable to locate analysis pad.
    " - else if(scan_in_progress) - dat += "Please wait. Analysis in progress.
    " - dat += "Halt scanning.
    " - else - dat += "Scanner is ready.
    " - dat += "Begin scanning.
    " - - dat += "
    " - dat += "
    " - dat += "Refresh Close" - user << browse(dat, "window=artanalyser;size=450x500") - user.set_machine(src) - onclose(user, "artanalyser") - -/obj/machinery/artifact_analyser/process() - if(scan_in_progress && world.time > scan_completion_time) - //finish scanning - scan_in_progress = 0 - updateDialog() - - //print results - var/results = "" - if(!owned_scanner) - reconnect_scanner() - if(!owned_scanner) - results = "Error communicating with scanner." - else if(!scanned_object || scanned_object.loc != owned_scanner.loc) - results = "Unable to locate scanned object. Ensure it was not moved in the process." - else - results = get_scan_info(scanned_object) - - src.visible_message("[name] states, \"Scanning complete.\"") - var/obj/item/weapon/paper/P = new(src.loc) - P.name = "[src] report #[++report_num]" - P.info = "[src] analysis report #[report_num]
    " - P.info += "
    " - P.info += "\icon[scanned_object] [results]" - P.stamped = list(/obj/item/weapon/stamp) - P.overlays = list("paper_stamped") - - if(scanned_object && istype(scanned_object, /obj/machinery/artifact)) - var/obj/machinery/artifact/A = scanned_object - A.anchored = 0 - A.being_used = 0 - scanned_object = null - -/obj/machinery/artifact_analyser/Topic(href, href_list) - if(href_list["begin_scan"]) - if(!owned_scanner) - reconnect_scanner() - if(owned_scanner) - var/artifact_in_use = 0 - for(var/obj/O in owned_scanner.loc) - if(O == owned_scanner) - continue - if(O.invisibility) - continue - if(istype(O, /obj/machinery/artifact)) - var/obj/machinery/artifact/A = O - if(A.being_used) - artifact_in_use = 1 - else - A.anchored = 1 - A.being_used = 1 - - if(artifact_in_use) - src.visible_message("[name] states, \"Cannot harvest. Too much interference.\"") - else - scanned_object = O - scan_in_progress = 1 - scan_completion_time = world.time + scan_duration - src.visible_message("[name] states, \"Scanning begun.\"") - break - if(!scanned_object) - src.visible_message("[name] states, \"Unable to isolate scan target.\"") - if(href_list["halt_scan"]) - scan_in_progress = 0 - src.visible_message("[name] states, \"Scanning halted.\"") - - if(href_list["close"]) - usr.unset_machine(src) - usr << browse(null, "window=artanalyser") - - ..() - updateDialog() - -//hardcoded responses, oh well -/obj/machinery/artifact_analyser/proc/get_scan_info(var/obj/scanned_obj) - switch(scanned_obj.type) - if(/obj/machinery/auto_cloner) - return "Automated cloning pod - appears to rely on organic nanomachines with a self perpetuating \ - ecosystem involving self cannibalism and a symbiotic relationship with the contained liquid.

    \ - Structure is composed of a carbo-titanium alloy with interlaced reinforcing energy fields, and the contained liquid \ - resembles proto-plasmic residue supportive of single cellular developmental conditions." - if(/obj/machinery/power/supermatter) - return "Super dense phoron clump - Appears to have been shaped or hewn, structure is composed of matter 2000% denser than ordinary carbon matter residue.\ - Potential application as unrefined phoron source." - if(/obj/machinery/power/supermatter) - return "Super dense phoron clump - Appears to have been shaped or hewn, structure is composed of matter 2000% denser than ordinary carbon matter residue.\ - Potential application as unrefined phoron source." - if(/obj/structure/constructshell) - return "Tribal idol - Item resembles statues/emblems built by superstitious pre-warp civilisations to honour their gods. Material appears to be a \ - rock/plastcrete composite." - if(/obj/machinery/giga_drill) - return "Automated mining drill - structure composed of titanium-carbide alloy, with tip and drill lines edged in an alloy of diamond and phoron." - if(/obj/structure/cult/pylon) - return "Tribal pylon - Item resembles statues/emblems built by cargo cult civilisations to honour energy systems from post-warp civilisations." - if(/obj/machinery/replicator) - return "Automated construction unit - Item appears to be able to synthesize synthetic items, some with simple internal circuitry. Method unknown, \ - phasing suggested?" - if(/obj/structure/crystal) - return "Crystal formation - Pseudo organic crystalline matrix, unlikely to have formed naturally. No known technology exists to synthesize this exact composition." - if(/obj/machinery/artifact) - //the fun one - var/obj/machinery/artifact/A = scanned_obj - var/out = "Anomalous alien device - Composed of an unknown alloy, " - - //primary effect - if(A.my_effect) - //what kind of effect the artifact has - switch(A.my_effect.effect_type) - if(1) - out += "concentrated energy emissions" - if(2) - out += "intermittent psionic wavefront" - if(3) - out += "electromagnetic energy" - if(4) - out += "high frequency particles" - if(5) - out += "organically reactive exotic particles" - if(6) - out += "interdimensional/bluespace? phasing" - if(7) - out += "atomic synthesis" - else - out += "low level energy emissions" - out += " have been detected " - - //how the artifact does it's effect - switch(A.my_effect.effect) - if(1) - out += " emitting in an ambient energy field." - if(2) - out += " emitting in periodic bursts." - else - out += " interspersed throughout substructure and shell." - - if(A.my_effect.trigger >= 0 && A.my_effect.trigger <= 4) - out += " Activation index involves physical interaction with artifact surface." - else if(A.my_effect.trigger >= 5 && A.my_effect.trigger <= 8) - out += " Activation index involves energetic interaction with artifact surface." - else if(A.my_effect.trigger >= 9 && A.my_effect.trigger <= 12) - out += " Activation index involves precise local atmospheric conditions." - else - out += " Unable to determine any data about activation trigger." - - //secondary: - if(A.secondary_effect && A.secondary_effect.activated) - //sciencey words go! - out += "

    Warning, internal scans indicate ongoing [pick("subluminous","subcutaneous","superstructural")] activity operating \ - independantly from primary systems. Auxiliary activity involves " - - //what kind of effect the artifact has - switch(A.secondary_effect.effect_type) - if(1) - out += "concentrated energy emissions" - if(2) - out += "intermittent psionic wavefront" - if(3) - out += "electromagnetic energy" - if(4) - out += "high frequency particles" - if(5) - out += "organically reactive exotic particles" - if(6) - out += "interdimensional/bluespace? phasing" - if(7) - out += "atomic synthesis" - else - out += "low level radiation" - - //how the artifact does it's effect - switch(A.secondary_effect.effect) - if(1) - out += " emitting in an ambient energy field." - if(2) - out += " emitting in periodic bursts." - else - out += " interspersed throughout substructure and shell." - - if(A.secondary_effect.trigger >= 0 && A.secondary_effect.trigger <= 4) - out += " Activation index involves physical interaction with artifact surface, but subsystems indicate \ - anomalous interference with standard attempts at triggering." - else if(A.secondary_effect.trigger >= 5 && A.secondary_effect.trigger <= 8) - out += " Activation index involves energetic interaction with artifact surface, but subsystems indicate \ - anomalous interference with standard attempts at triggering." - else if(A.secondary_effect.trigger >= 9 && A.secondary_effect.trigger <= 12) - out += " Activation index involves precise local atmospheric conditions, but subsystems indicate \ - anomalous interference with standard attempts at triggering." - else - out += " Unable to determine any data about activation trigger." - return out - else - //it was an ordinary item - return "[scanned_obj.name] - Mundane application, composed of carbo-ferritic alloy composite." diff --git a/code/modules/research/xenoarchaeology/readme.dm b/code/modules/research/xenoarchaeology/readme.dm deleted file mode 100644 index 2eecadc690a..00000000000 --- a/code/modules/research/xenoarchaeology/readme.dm +++ /dev/null @@ -1,5 +0,0 @@ - -//coming soon -//there'll probably be some stuff on the wiki at some point - -//original code from alfie275 / lunacode, artifacts are from isaidno \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/tools/gearbelt.dm b/code/modules/research/xenoarchaeology/tools/gearbelt.dm deleted file mode 100644 index fa92fa16241..00000000000 --- a/code/modules/research/xenoarchaeology/tools/gearbelt.dm +++ /dev/null @@ -1,29 +0,0 @@ - -/obj/item/weapon/storage/belt/archaeology - name = "excavation gear-belt" - desc = "Can hold various excavation gear." - icon_state = "gearbelt" - can_hold = list( - /obj/item/weapon/storage/box/samplebags, - /obj/item/device/core_sampler, - /obj/item/device/beacon_locator, - /obj/item/device/radio/beacon, - /obj/item/device/gps, - /obj/item/device/measuring_tape, - /obj/item/device/flashlight, - /obj/item/weapon/pickaxe, - /obj/item/device/depth_scanner, - /obj/item/device/camera, - /obj/item/weapon/paper, - /obj/item/weapon/photo, - /obj/item/weapon/folder, - /obj/item/weapon/pen, - /obj/item/weapon/folder, - /obj/item/weapon/clipboard, - /obj/item/weapon/anodevice, - /obj/item/clothing/glasses, - /obj/item/weapon/wrench, - /obj/item/weapon/storage/box/excavation, - /obj/item/weapon/anobattery, - /obj/item/device/ano_scanner - ) diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm deleted file mode 100644 index bf320f0cd39..00000000000 --- a/code/modules/research/xenoarchaeology/tools/tools.dm +++ /dev/null @@ -1,35 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Miscellaneous xenoarchaeology tools - -/obj/item/device/gps - name = "relay positioning device" - desc = "Triangulates the approximate co-ordinates using a nearby satellite network." - icon = 'icons/obj/device.dmi' - icon_state = "locator" - item_state = "analyzer" - w_class = 2 - -/obj/item/device/gps/attack_self(var/mob/user as mob) - var/turf/T = get_turf(src) - user << "\blue \icon[src] [src] flashes [T.x].[rand(0,9)]:[T.y].[rand(0,9)]:[T.z].[rand(0,9)]." - -/obj/item/device/measuring_tape - name = "measuring tape" - desc = "A coiled metallic tape used to check dimensions and lengths." - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "measuring" - w_class = 2 - -//todo: dig site tape - -/obj/item/weapon/storage/bag/fossils - name = "Fossil Satchel" - desc = "Transports delicate fossils in suspension so they don't break during transit." - icon = 'icons/obj/mining.dmi' - icon_state = "satchel" - slot_flags = SLOT_BELT | SLOT_POCKET - w_class = 3 - max_storage_space = 100 - max_w_class = 3 - can_hold = list(/obj/item/weapon/fossil) diff --git a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm deleted file mode 100644 index 6f79f8d8ba8..00000000000 --- a/code/modules/research/xenoarchaeology/tools/tools_anoscanner.dm +++ /dev/null @@ -1,51 +0,0 @@ - -/obj/item/device/ano_scanner - name = "Alden-Saraspova counter" - desc = "Aids in triangulation of exotic particles." - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "flashgun" - item_state = "lampgreen" - w_class = 2.0 - slot_flags = SLOT_BELT - var/nearest_artifact_id = "unknown" - var/nearest_artifact_distance = -1 - var/last_scan_time = 0 - var/scan_delay = 25 - -/obj/item/device/ano_scanner/initialize() - scan() - -/obj/item/device/ano_scanner/attack_self(var/mob/user as mob) - return src.interact(user) - -/obj/item/device/ano_scanner/interact(var/mob/user as mob) - if(world.time - last_scan_time >= scan_delay) - spawn(0) - scan() - - if(!user) return - - if(nearest_artifact_distance >= 0) - user << "Exotic energy detected on wavelength '[nearest_artifact_id]' in a radius of [nearest_artifact_distance]m" - else - user << "Background radiation levels detected." - else - user << "Scanning array is recharging." - -/obj/item/device/ano_scanner/proc/scan() - set background = 1 - - last_scan_time = world.time - nearest_artifact_distance = -1 - var/turf/cur_turf = get_turf(src) - if(master_controller) //Sanity check due to runtimes ~Z - for(var/turf/simulated/mineral/T in master_controller.artifact_spawning_turfs) - if(T.artifact_find) - if(T.z == cur_turf.z) - var/cur_dist = get_dist(cur_turf, T) * 2 - if( (nearest_artifact_distance < 0 || cur_dist < nearest_artifact_distance) && cur_dist <= T.artifact_find.artifact_detect_range ) - nearest_artifact_distance = cur_dist + rand() * 2 - 1 - nearest_artifact_id = T.artifact_find.artifact_id - else - master_controller.artifact_spawning_turfs.Remove(T) - cur_turf.visible_message("[src] clicks.") diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm deleted file mode 100644 index 0ed24ad2489..00000000000 --- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm +++ /dev/null @@ -1,95 +0,0 @@ -//device to take core samples from mineral turfs - used for various types of analysis - -/obj/item/weapon/storage/box/samplebags - name = "sample bag box" - desc = "A box claiming to contain sample bags." - New() - for(var/i=0, i<7, i++) - var/obj/item/weapon/evidencebag/S = new(src) - S.name = "sample bag" - S.desc = "a bag for holding research samples." - ..() - return - -////////////////////////////////////////////////////////////////// - -/obj/item/device/core_sampler - name = "core sampler" - desc = "Used to extract geological core samples." - icon = 'icons/obj/device.dmi' - icon_state = "sampler0" - item_state = "screwdriver_brown" - w_class = 1.0 - //slot_flags = SLOT_BELT - var/sampled_turf = "" - var/num_stored_bags = 10 - var/obj/item/weapon/evidencebag/filled_bag - -/obj/item/device/core_sampler/examine(mob/user) - if(..(user, 2)) - user << "\blue Used to extract geological core samples - this one is [sampled_turf ? "full" : "empty"], and has [num_stored_bags] bag[num_stored_bags != 1 ? "s" : ""] remaining." - -/obj/item/device/core_sampler/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/weapon/evidencebag)) - if(num_stored_bags < 10) - qdel(W) - num_stored_bags += 1 - user << "\blue You insert the [W] into the core sampler." - else - user << "\red The core sampler can not fit any more bags!" - else - return ..() - -/obj/item/device/core_sampler/proc/sample_item(var/item_to_sample, var/mob/user as mob) - var/datum/geosample/geo_data - if(istype(item_to_sample, /turf/simulated/mineral)) - var/turf/simulated/mineral/T = item_to_sample - T.geologic_data.UpdateNearbyArtifactInfo(T) - geo_data = T.geologic_data - else if(istype(item_to_sample, /obj/item/weapon/ore)) - var/obj/item/weapon/ore/O = item_to_sample - geo_data = O.geologic_data - - if(geo_data) - if(filled_bag) - user << "\red The core sampler is full!" - else if(num_stored_bags < 1) - user << "\red The core sampler is out of sample bags!" - else - //create a new sample bag which we'll fill with rock samples - filled_bag = new /obj/item/weapon/evidencebag(src) - filled_bag.name = "sample bag" - filled_bag.desc = "a bag for holding research samples." - - icon_state = "sampler1" - num_stored_bags-- - - //put in a rock sliver - var/obj/item/weapon/rocksliver/R = new() - R.geological_data = geo_data - R.loc = filled_bag - - //update the sample bag - filled_bag.icon_state = "evidence" - var/image/I = image("icon"=R, "layer"=FLOAT_LAYER) - filled_bag.overlays += I - filled_bag.overlays += "evidence" - filled_bag.w_class = 1 - - user << "\blue You take a core sample of the [item_to_sample]." - else - user << "\red You are unable to take a sample of [item_to_sample]." - -/obj/item/device/core_sampler/attack_self() - if(filled_bag) - usr << "\blue You eject the full sample bag." - var/success = 0 - if(istype(src.loc, /mob)) - var/mob/M = src.loc - success = M.put_in_inactive_hand(filled_bag) - if(!success) - filled_bag.loc = get_turf(src) - filled_bag = null - icon_state = "sampler0" - else - usr << "\red The core sampler is empty." diff --git a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm b/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm deleted file mode 100644 index e242838a1e1..00000000000 --- a/code/modules/research/xenoarchaeology/tools/tools_depthscanner.dm +++ /dev/null @@ -1,130 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Depth scanner - scans rock turfs / boulders and tells players if there is anything interesting inside, logs all finds + coordinates + times - -//also known as the x-ray diffractor -/obj/item/device/depth_scanner - name = "depth analysis scanner" - desc = "Used to check spatial depth and density of rock outcroppings." - icon = 'icons/obj/pda.dmi' - icon_state = "crap" - item_state = "analyzer" - w_class = 2.0 - slot_flags = SLOT_BELT - var/list/positive_locations = list() - var/datum/depth_scan/current - -/datum/depth_scan - var/time = "" - var/coords = "" - var/depth = 0 - var/clearance = 0 - var/record_index = 1 - var/dissonance_spread = 1 - var/material = "unknown" - -/obj/item/device/depth_scanner/proc/scan_atom(var/mob/user, var/atom/A) - user.visible_message("\blue [user] scans [A], the air around them humming gently.") - if(istype(A,/turf/simulated/mineral)) - var/turf/simulated/mineral/M = A - if((M.finds && M.finds.len) || M.artifact_find) - - //create a new scanlog entry - var/datum/depth_scan/D = new() - D.coords = "[M.x].[rand(0,9)]:[M.y].[rand(0,9)]:[10 * M.z].[rand(0,9)]" - D.time = worldtime2text() - D.record_index = positive_locations.len + 1 - D.material = M.mineral ? M.mineral.display_name : "Rock" - - //find the first artifact and store it - if(M.finds.len) - var/datum/find/F = M.finds[1] - D.depth = F.excavation_required * 2 //0-100% and 0-200cm - D.clearance = F.clearance_range * 2 - D.material = get_responsive_reagent(F.find_type) - - positive_locations.Add(D) - - for(var/mob/L in range(src, 1)) - L << "\blue \icon[src] [src] pings." - - else if(istype(A,/obj/structure/boulder)) - var/obj/structure/boulder/B = A - if(B.artifact_find) - //create a new scanlog entry - var/datum/depth_scan/D = new() - D.coords = "[10 * B.x].[rand(0,9)]:[10 * B.y].[rand(0,9)]:[10 * B.z].[rand(0,9)]" - D.time = worldtime2text() - D.record_index = positive_locations.len + 1 - - //these values are arbitrary - D.depth = rand(75,100) - D.clearance = rand(5,25) - D.dissonance_spread = rand(750,2500) / 100 - - positive_locations.Add(D) - - for(var/mob/L in range(src, 1)) - L << "\blue \icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!" - -/obj/item/device/depth_scanner/attack_self(var/mob/user as mob) - return src.interact(user) - -/obj/item/device/depth_scanner/interact(var/mob/user as mob) - var/dat = "Co-ordinates with positive matches
    " - dat += "== Clear all ==
    " - if(current) - dat += "Time: [current.time]
    " - dat += "Coords: [current.coords]
    " - dat += "Anomaly depth: [current.depth] cm
    " - dat += "Clearance above anomaly depth: [current.clearance] cm
    " - dat += "Dissonance spread: [current.dissonance_spread]
    " - var/index = responsive_carriers.Find(current.material) - if(index > 0 && index <= finds_as_strings.len) - dat += "Anomaly material: [finds_as_strings[index]]
    " - else - dat += "Anomaly material: Unknown
    " - dat += "clear entry
    " - else - dat += "Select an entry from the list
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - if(positive_locations.len) - for(var/index=1, index<=positive_locations.len, index++) - var/datum/depth_scan/D = positive_locations[index] - dat += "[D.time], coords: [D.coords]
    " - else - dat += "No entries recorded." - dat += "
    " - dat += "Refresh
    " - dat += "Close
    " - user << browse(dat,"window=depth_scanner;size=300x500") - onclose(user, "depth_scanner") - -/obj/item/device/depth_scanner/Topic(href, href_list) - ..() - usr.set_machine(src) - - if(href_list["select"]) - var/index = text2num(href_list["select"]) - if(index && index <= positive_locations.len) - current = positive_locations[index] - else if(href_list["clear"]) - var/index = text2num(href_list["clear"]) - if(index) - if(index <= positive_locations.len) - var/datum/depth_scan/D = positive_locations[index] - positive_locations.Remove(D) - qdel(D) - else - //GC will hopefully pick them up before too long - positive_locations = list() - qdel(current) - else if(href_list["close"]) - usr.unset_machine() - usr << browse(null, "window=depth_scanner") - - updateSelfDialog() diff --git a/code/modules/research/xenoarchaeology/tools/tools_locater.dm b/code/modules/research/xenoarchaeology/tools/tools_locater.dm deleted file mode 100644 index fb6adf795ac..00000000000 --- a/code/modules/research/xenoarchaeology/tools/tools_locater.dm +++ /dev/null @@ -1,97 +0,0 @@ - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// GPS Locater - locks into a radio frequency and tracks it - -/obj/item/device/beacon_locator - name = "locater device" - desc = "Used to scan and locate signals on a particular frequency according ." - icon = 'icons/obj/device.dmi' - icon_state = "pinoff" //pinonfar, pinonmedium, pinonclose, pinondirect, pinonnull - item_state = "electronic" - var/frequency = PUB_FREQ - var/scan_ticks = 0 - var/obj/item/device/radio/target_radio - -/obj/item/device/beacon_locator/New() - ..() - processing_objects.Add(src) - -/obj/item/device/beacon_locator/Destroy() - processing_objects.Remove(src) - ..() - -/obj/item/device/beacon_locator/process() - if(target_radio) - set_dir(get_dir(src,target_radio)) - switch(get_dist(src,target_radio)) - if(0 to 3) - icon_state = "pinondirect" - if(4 to 10) - icon_state = "pinonclose" - if(11 to 30) - icon_state = "pinonmedium" - if(31 to INFINITY) - icon_state = "pinonfar" - else - if(scan_ticks) - icon_state = "pinonnull" - scan_ticks++ - if(prob(scan_ticks * 10)) - spawn(0) - set background = 1 - if(processing_objects.Find(src)) - //scan radios in the world to try and find one - var/cur_dist = 999 - for(var/obj/item/device/radio/beacon/R in world) - if(R.z == src.z && R.frequency == src.frequency) - var/check_dist = get_dist(src,R) - if(check_dist < cur_dist) - cur_dist = check_dist - target_radio = R - - scan_ticks = 0 - var/turf/T = get_turf(src) - if(target_radio) - T.visible_message("\icon[src] [src] [pick("chirps","chirrups","cheeps")] happily.") - else - T.visible_message("\icon[src] [src] [pick("chirps","chirrups","cheeps")] sadly.") - else - icon_state = "pinoff" - -/obj/item/device/beacon_locator/attack_self(var/mob/user as mob) - return src.interact(user) - -/obj/item/device/beacon_locator/interact(var/mob/user as mob) - var/dat = "Radio frequency tracker
    " - dat += {" - Reset tracker
    - Frequency: - - - - - [format_frequency(frequency)] - + - +
    - "} - - dat += "Close
    " - user << browse(dat,"window=locater;size=300x150") - onclose(user, "locater") - -/obj/item/device/beacon_locator/Topic(href, href_list) - ..() - usr.set_machine(src) - - if(href_list["reset_tracking"]) - scan_ticks = 1 - target_radio = null - else if(href_list["freq"]) - var/new_frequency = (frequency + text2num(href_list["freq"])) - if (frequency < 1200 || frequency > 1600) - new_frequency = sanitize_frequency(new_frequency, 1499) - frequency = new_frequency - - else if(href_list["close"]) - usr.unset_machine() - usr << browse(null, "window=locater") - - updateSelfDialog() diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index b4301cf557a..7c9fea54da1 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -42,22 +42,25 @@ broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices if(istype(W, /obj/item/weapon/screwdriver)) - user << "You remove the faceplate from the [src]" - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "keycard" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.set_dir(dir) - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - A.state = 3 - A.icon_state = "keycard_3" - M.deconstruct(src) - qdel(src) - return + user << "You begin removing the faceplate from the [src]" + if(do_after(user, 10)) + user << "You remove the faceplate from the [src]" + var/obj/structure/frame/A = new /obj/structure/frame(loc) + var/obj/item/weapon/circuitboard/M = new circuit(A) + A.frame_type = M.board_type + A.need_circuit = 0 + A.pixel_x = pixel_x + A.pixel_y = pixel_y + A.set_dir(dir) + A.circuit = M + A.anchored = 1 + for (var/obj/C in src) + C.forceMove(loc) + A.state = 3 + A.update_icon() + M.deconstruct(src) + qdel(src) + return /obj/machinery/keycard_auth/power_change() ..() @@ -195,4 +198,4 @@ var/global/maint_all_access = 0 /obj/machinery/door/airlock/allowed(mob/M) if(maint_all_access && src.check_access_list(list(access_maint_tunnels))) return 1 - return ..(M) + return ..(M) \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm similarity index 80% rename from code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm rename to code/modules/xenoarcheaology/artifacts/artifact.dm index 2f6cc45e75a..a8472245a29 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_unknown.dm +++ b/code/modules/xenoarcheaology/artifacts/artifact.dm @@ -1,366 +1,300 @@ - -#define EFFECT_TOUCH 0 -#define EFFECT_AURA 1 -#define EFFECT_PULSE 2 -#define MAX_EFFECT 2 - -#define TRIGGER_TOUCH 0 -#define TRIGGER_WATER 1 -#define TRIGGER_ACID 2 -#define TRIGGER_VOLATILE 3 -#define TRIGGER_TOXIN 4 -#define TRIGGER_FORCE 5 -#define TRIGGER_ENERGY 6 -#define TRIGGER_HEAT 7 -#define TRIGGER_COLD 8 -#define TRIGGER_PHORON 9 -#define TRIGGER_OXY 10 -#define TRIGGER_CO2 11 -#define TRIGGER_NITRO 12 -#define MAX_TRIGGER 12 -/* -//sleeping gas appears to be bugged, currently -var/list/valid_primary_effect_types = list(\ - /datum/artifact_effect/cellcharge,\ - /datum/artifact_effect/celldrain,\ - /datum/artifact_effect/forcefield,\ - /datum/artifact_effect/gasoxy,\ - /datum/artifact_effect/gasplasma,\ -// /datum/artifact_effect/gassleeping,\ - /datum/artifact_effect/heal,\ - /datum/artifact_effect/hurt,\ - /datum/artifact_effect/emp,\ - /datum/artifact_effect/teleport,\ - /datum/artifact_effect/robohurt,\ - /datum/artifact_effect/roboheal) - -var/list/valid_secondary_effect_types = list(\ - /datum/artifact_effect/cold,\ - /datum/artifact_effect/badfeeling,\ - /datum/artifact_effect/cellcharge,\ - /datum/artifact_effect/celldrain,\ - /datum/artifact_effect/dnaswitch,\ - /datum/artifact_effect/emp,\ - /datum/artifact_effect/gasco2,\ - /datum/artifact_effect/gasnitro,\ - /datum/artifact_effect/gasoxy,\ - /datum/artifact_effect/gasphoron,\ -// /datum/artifact_effect/gassleeping,\ - /datum/artifact_effect/goodfeeling,\ - /datum/artifact_effect/heal,\ - /datum/artifact_effect/hurt,\ - /datum/artifact_effect/radiate,\ - /datum/artifact_effect/roboheal,\ - /datum/artifact_effect/robohurt,\ - /datum/artifact_effect/sleepy,\ - /datum/artifact_effect/stun,\ - /datum/artifact_effect/teleport) - */ - -/obj/machinery/artifact - name = "alien artifact" - desc = "A large alien device." - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "ano00" - var/icon_num = 0 - density = 1 - var/datum/artifact_effect/my_effect - var/datum/artifact_effect/secondary_effect - var/being_used = 0 - -/obj/machinery/artifact/New() - ..() - - //setup primary effect - these are the main ones (mixed) - var/effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect) - my_effect = new effecttype(src) - - //75% chance to have a secondary stealthy (and mostly bad) effect - if(prob(75)) - effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect) - secondary_effect = new effecttype(src) - if(prob(75)) - secondary_effect.ToggleActivate(0) - - icon_num = rand(0,11) - icon_state = "ano[icon_num]0" - if(icon_num == 7 || icon_num == 8) - name = "large crystal" - desc = pick("It shines faintly as it catches the light.",\ - "It appears to have a faint inner glow.",\ - "It seems to draw you inward as you look it at.",\ - "Something twinkles faintly as you look at it.",\ - "It's mesmerizing to behold.") - if(prob(50)) - my_effect.trigger = TRIGGER_ENERGY - else if(icon_num == 9) - name = "alien computer" - desc = "It is covered in strange markings." - if(prob(75)) - my_effect.trigger = TRIGGER_TOUCH - else if(icon_num == 10) - desc = "A large alien device, there appear to be some kind of vents in the side." - if(prob(50)) - my_effect.trigger = rand(6,12) - else if(icon_num == 11) - name = "sealed alien pod" - desc = "A strange alien device." - if(prob(25)) - my_effect.trigger = rand(1,4) - -#define TRIGGER_PHORON 9 -#define TRIGGER_OXY 10 -#define TRIGGER_CO2 11 -#define TRIGGER_NITRO 12 - -/obj/machinery/artifact/process() - - var/turf/L = loc - if(isnull(L) || !istype(L)) // We're inside a container or on null turf, either way stop processing effects - return - - if(my_effect) - my_effect.process() - if(secondary_effect) - secondary_effect.process() - - if(pulledby) - Bumped(pulledby) - - //if either of our effects rely on environmental factors, work that out - var/trigger_cold = 0 - var/trigger_hot = 0 - var/trigger_phoron = 0 - var/trigger_oxy = 0 - var/trigger_co2 = 0 - var/trigger_nitro = 0 - if( (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) || (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) ) - var/turf/T = get_turf(src) - var/datum/gas_mixture/env = T.return_air() - if(env) - if(env.temperature < 225) - trigger_cold = 1 - else if(env.temperature > 375) - trigger_hot = 1 - - if(env.gas["phoron"] >= 10) - trigger_phoron = 1 - if(env.gas["oxygen"] >= 10) - trigger_oxy = 1 - if(env.gas["carbon_dioxide"] >= 10) - trigger_co2 = 1 - if(env.gas["nitrogen"] >= 10) - trigger_nitro = 1 - - //COLD ACTIVATION - if(trigger_cold) - if(my_effect.trigger == TRIGGER_COLD && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_COLD && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - - //HEAT ACTIVATION - if(trigger_hot) - if(my_effect.trigger == TRIGGER_HEAT && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_HEAT && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - - //PHORON GAS ACTIVATION - if(trigger_phoron) - if(my_effect.trigger == TRIGGER_PHORON && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_PHORON && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - - //OXYGEN GAS ACTIVATION - if(trigger_oxy) - if(my_effect.trigger == TRIGGER_OXY && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_OXY && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - - //CO2 GAS ACTIVATION - if(trigger_co2) - if(my_effect.trigger == TRIGGER_CO2 && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_CO2 && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - - //NITROGEN GAS ACTIVATION - if(trigger_nitro) - if(my_effect.trigger == TRIGGER_NITRO && !my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - else - if(my_effect.trigger == TRIGGER_NITRO && my_effect.activated) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) - secondary_effect.ToggleActivate(0) - -/obj/machinery/artifact/attack_hand(var/mob/user as mob) - if (get_dist(user, src) > 1) - user << "\red You can't reach [src] from here." - return - if(ishuman(user) && user:gloves) - user << "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")]." - return - - src.add_fingerprint(user) - - if(my_effect.trigger == TRIGGER_TOUCH) - user << "You touch [src]." - my_effect.ToggleActivate() - else - user << "You touch [src], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")]." - - if(prob(25) && secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH) - secondary_effect.ToggleActivate(0) - - if (my_effect.effect == EFFECT_TOUCH) - my_effect.DoEffectTouch(user) - - if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated) - secondary_effect.DoEffectTouch(user) - -/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob) - - if (istype(W, /obj/item/weapon/reagent_containers/)) - if(W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1)) - if(my_effect.trigger == TRIGGER_WATER) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_WATER && prob(25)) - secondary_effect.ToggleActivate(0) - else if(W.reagents.has_reagent("sacid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1)) - if(my_effect.trigger == TRIGGER_ACID) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_ACID && prob(25)) - secondary_effect.ToggleActivate(0) - else if(W.reagents.has_reagent("phoron", 1) || W.reagents.has_reagent("thermite", 1)) - if(my_effect.trigger == TRIGGER_VOLATILE) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_VOLATILE && prob(25)) - secondary_effect.ToggleActivate(0) - else if(W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amanitin", 1) || W.reagents.has_reagent("neurotoxin", 1)) - if(my_effect.trigger == TRIGGER_TOXIN) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_TOXIN && prob(25)) - secondary_effect.ToggleActivate(0) - else if(istype(W,/obj/item/weapon/melee/baton) && W:status ||\ - istype(W,/obj/item/weapon/melee/energy) ||\ - istype(W,/obj/item/weapon/melee/cultblade) ||\ - istype(W,/obj/item/weapon/card/emag) ||\ - istype(W,/obj/item/device/multitool)) - if (my_effect.trigger == TRIGGER_ENERGY) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25)) - secondary_effect.ToggleActivate(0) - - else if (istype(W,/obj/item/weapon/flame) && W:lit ||\ - istype(W,/obj/item/weapon/weldingtool) && W:welding) - if(my_effect.trigger == TRIGGER_HEAT) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && prob(25)) - secondary_effect.ToggleActivate(0) - else - ..() - if (my_effect.trigger == TRIGGER_FORCE && W.force >= 10) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) - secondary_effect.ToggleActivate(0) - -/obj/machinery/artifact/Bumped(M as mob|obj) - ..() - if(istype(M,/obj)) - if(M:throwforce >= 10) - if(my_effect.trigger == TRIGGER_FORCE) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) - secondary_effect.ToggleActivate(0) - else if(ishuman(M) && !istype(M:gloves,/obj/item/clothing/gloves)) - var/warn = 0 - - if (my_effect.trigger == TRIGGER_TOUCH && prob(50)) - my_effect.ToggleActivate() - warn = 1 - if(secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH && prob(25)) - secondary_effect.ToggleActivate(0) - warn = 1 - - if (my_effect.effect == EFFECT_TOUCH && prob(50)) - my_effect.DoEffectTouch(M) - warn = 1 - if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated && prob(50)) - secondary_effect.DoEffectTouch(M) - warn = 1 - - if(warn) - M << "You accidentally touch [src]." - ..() - -/obj/machinery/artifact/bullet_act(var/obj/item/projectile/P) - if(istype(P,/obj/item/projectile/bullet) ||\ - istype(P,/obj/item/projectile/hivebotbullet)) - if(my_effect.trigger == TRIGGER_FORCE) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) - secondary_effect.ToggleActivate(0) - - else if(istype(P,/obj/item/projectile/beam) ||\ - istype(P,/obj/item/projectile/ion) ||\ - istype(P,/obj/item/projectile/energy)) - if(my_effect.trigger == TRIGGER_ENERGY) - my_effect.ToggleActivate() - if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25)) - secondary_effect.ToggleActivate(0) - -/obj/machinery/artifact/ex_act(severity) - switch(severity) - if(1.0) qdel(src) - if(2.0) - if (prob(50)) - qdel(src) - else - if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT) - my_effect.ToggleActivate() - if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25)) - secondary_effect.ToggleActivate(0) - if(3.0) - if (my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT) - my_effect.ToggleActivate() - if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25)) - secondary_effect.ToggleActivate(0) - return - -/obj/machinery/artifact/Move() - ..() - if(my_effect) - my_effect.UpdateMove() - if(secondary_effect) - secondary_effect.UpdateMove() +/obj/machinery/artifact + name = "alien artifact" + desc = "A large alien device." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "ano00" + var/icon_num = 0 + density = 1 + var/datum/artifact_effect/my_effect + var/datum/artifact_effect/secondary_effect + var/being_used = 0 + +/obj/machinery/artifact/New() + ..() + + var/effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect) + my_effect = new effecttype(src) + + if(prob(75)) + effecttype = pick(typesof(/datum/artifact_effect) - /datum/artifact_effect) + secondary_effect = new effecttype(src) + if(prob(75)) + secondary_effect.ToggleActivate(0) + + icon_num = rand(0, 11) + + icon_state = "ano[icon_num]0" + if(icon_num == 7 || icon_num == 8) + name = "large crystal" + desc = pick("It shines faintly as it catches the light.", + "It appears to have a faint inner glow.", + "It seems to draw you inward as you look it at.", + "Something twinkles faintly as you look at it.", + "It's mesmerizing to behold.") + if(prob(50)) + my_effect.trigger = TRIGGER_ENERGY + else if(icon_num == 9) + name = "alien computer" + desc = "It is covered in strange markings." + if(prob(75)) + my_effect.trigger = TRIGGER_TOUCH + else if(icon_num == 10) + desc = "A large alien device, there appear to be some kind of vents in the side." + if(prob(50)) + my_effect.trigger = pick(TRIGGER_ENERGY, TRIGGER_HEAT, TRIGGER_COLD, TRIGGER_PHORON, TRIGGER_OXY, TRIGGER_CO2, TRIGGER_NITRO) + else if(icon_num == 11) + name = "sealed alien pod" + desc = "A strange alien device." + if(prob(25)) + my_effect.trigger = pick(TRIGGER_WATER, TRIGGER_ACID, TRIGGER_VOLATILE, TRIGGER_TOXIN) + +/obj/machinery/artifact/process() + var/turf/L = loc + if(!istype(L)) // We're inside a container or on null turf, either way stop processing effects + return + + if(my_effect) + my_effect.process() + if(secondary_effect) + secondary_effect.process() + + if(pulledby) + Bumped(pulledby) + + //if either of our effects rely on environmental factors, work that out + var/trigger_cold = 0 + var/trigger_hot = 0 + var/trigger_phoron = 0 + var/trigger_oxy = 0 + var/trigger_co2 = 0 + var/trigger_nitro = 0 + if( (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) || (my_effect.trigger >= TRIGGER_HEAT && my_effect.trigger <= TRIGGER_NITRO) ) + var/turf/T = get_turf(src) + var/datum/gas_mixture/env = T.return_air() + if(env) + if(env.temperature < 225) + trigger_cold = 1 + else if(env.temperature > 375) + trigger_hot = 1 + + if(env.gas["phoron"] >= 10) + trigger_phoron = 1 + if(env.gas["oxygen"] >= 10) + trigger_oxy = 1 + if(env.gas["carbon_dioxide"] >= 10) + trigger_co2 = 1 + if(env.gas["nitrogen"] >= 10) + trigger_nitro = 1 + + //COLD ACTIVATION + if(trigger_cold) + if(my_effect.trigger == TRIGGER_COLD && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_COLD && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_COLD && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + + //HEAT ACTIVATION + if(trigger_hot) + if(my_effect.trigger == TRIGGER_HEAT && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_HEAT && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + + //PHORON GAS ACTIVATION + if(trigger_phoron) + if(my_effect.trigger == TRIGGER_PHORON && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_PHORON && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_PHORON && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + + //OXYGEN GAS ACTIVATION + if(trigger_oxy) + if(my_effect.trigger == TRIGGER_OXY && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_OXY && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_OXY && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + + //CO2 GAS ACTIVATION + if(trigger_co2) + if(my_effect.trigger == TRIGGER_CO2 && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_CO2 && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_CO2 && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + + //NITROGEN GAS ACTIVATION + if(trigger_nitro) + if(my_effect.trigger == TRIGGER_NITRO && !my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + else + if(my_effect.trigger == TRIGGER_NITRO && my_effect.activated) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_NITRO && !secondary_effect.activated) + secondary_effect.ToggleActivate(0) + +/obj/machinery/artifact/attack_hand(var/mob/user as mob) + if (get_dist(user, src) > 1) + user << "\red You can't reach [src] from here." + return + if(ishuman(user) && user:gloves) + user << "You touch [src] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")]." + return + + src.add_fingerprint(user) + + if(my_effect.trigger == TRIGGER_TOUCH) + user << "You touch [src]." + my_effect.ToggleActivate() + else + user << "You touch [src], [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")]." + + if(prob(25) && secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH) + secondary_effect.ToggleActivate(0) + + if (my_effect.effect == EFFECT_TOUCH) + my_effect.DoEffectTouch(user) + + if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated) + secondary_effect.DoEffectTouch(user) + +/obj/machinery/artifact/attackby(obj/item/weapon/W as obj, mob/living/user as mob) + + if (istype(W, /obj/item/weapon/reagent_containers/)) + if(W.reagents.has_reagent("hydrogen", 1) || W.reagents.has_reagent("water", 1)) + if(my_effect.trigger == TRIGGER_WATER) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_WATER && prob(25)) + secondary_effect.ToggleActivate(0) + else if(W.reagents.has_reagent("sacid", 1) || W.reagents.has_reagent("pacid", 1) || W.reagents.has_reagent("diethylamine", 1)) + if(my_effect.trigger == TRIGGER_ACID) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_ACID && prob(25)) + secondary_effect.ToggleActivate(0) + else if(W.reagents.has_reagent("phoron", 1) || W.reagents.has_reagent("thermite", 1)) + if(my_effect.trigger == TRIGGER_VOLATILE) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_VOLATILE && prob(25)) + secondary_effect.ToggleActivate(0) + else if(W.reagents.has_reagent("toxin", 1) || W.reagents.has_reagent("cyanide", 1) || W.reagents.has_reagent("amatoxin", 1) || W.reagents.has_reagent("neurotoxin", 1)) + if(my_effect.trigger == TRIGGER_TOXIN) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_TOXIN && prob(25)) + secondary_effect.ToggleActivate(0) + else if(istype(W,/obj/item/weapon/melee/baton) && W:status ||\ + istype(W,/obj/item/weapon/melee/energy) ||\ + istype(W,/obj/item/weapon/melee/cultblade) ||\ + istype(W,/obj/item/weapon/card/emag) ||\ + istype(W,/obj/item/device/multitool)) + if (my_effect.trigger == TRIGGER_ENERGY) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25)) + secondary_effect.ToggleActivate(0) + + else if (istype(W,/obj/item/weapon/flame) && W:lit ||\ + istype(W,/obj/item/weapon/weldingtool) && W:welding) + if(my_effect.trigger == TRIGGER_HEAT) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_HEAT && prob(25)) + secondary_effect.ToggleActivate(0) + else + ..() + if (my_effect.trigger == TRIGGER_FORCE && W.force >= 10) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) + secondary_effect.ToggleActivate(0) + +/obj/machinery/artifact/Bumped(M as mob|obj) + ..() + if(istype(M,/obj)) + if(M:throwforce >= 10) + if(my_effect.trigger == TRIGGER_FORCE) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) + secondary_effect.ToggleActivate(0) + else if(ishuman(M) && !istype(M:gloves,/obj/item/clothing/gloves)) + var/warn = 0 + + if (my_effect.trigger == TRIGGER_TOUCH && prob(50)) + my_effect.ToggleActivate() + warn = 1 + if(secondary_effect && secondary_effect.trigger == TRIGGER_TOUCH && prob(25)) + secondary_effect.ToggleActivate(0) + warn = 1 + + if (my_effect.effect == EFFECT_TOUCH && prob(50)) + my_effect.DoEffectTouch(M) + warn = 1 + if(secondary_effect && secondary_effect.effect == EFFECT_TOUCH && secondary_effect.activated && prob(50)) + secondary_effect.DoEffectTouch(M) + warn = 1 + + if(warn) + M << "You accidentally touch [src]." + ..() + +/obj/machinery/artifact/bullet_act(var/obj/item/projectile/P) + if(istype(P,/obj/item/projectile/bullet) ||\ + istype(P,/obj/item/projectile/hivebotbullet)) + if(my_effect.trigger == TRIGGER_FORCE) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_FORCE && prob(25)) + secondary_effect.ToggleActivate(0) + + else if(istype(P,/obj/item/projectile/beam) ||\ + istype(P,/obj/item/projectile/ion) ||\ + istype(P,/obj/item/projectile/energy)) + if(my_effect.trigger == TRIGGER_ENERGY) + my_effect.ToggleActivate() + if(secondary_effect && secondary_effect.trigger == TRIGGER_ENERGY && prob(25)) + secondary_effect.ToggleActivate(0) + +/obj/machinery/artifact/ex_act(severity) + switch(severity) + if(1.0) qdel(src) + if(2.0) + if (prob(50)) + qdel(src) + else + if(my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT) + my_effect.ToggleActivate() + if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25)) + secondary_effect.ToggleActivate(0) + if(3.0) + if (my_effect.trigger == TRIGGER_FORCE || my_effect.trigger == TRIGGER_HEAT) + my_effect.ToggleActivate() + if(secondary_effect && (secondary_effect.trigger == TRIGGER_FORCE || secondary_effect.trigger == TRIGGER_HEAT) && prob(25)) + secondary_effect.ToggleActivate(0) + return + +/obj/machinery/artifact/Move() + ..() + if(my_effect) + my_effect.UpdateMove() + if(secondary_effect) + secondary_effect.UpdateMove() diff --git a/code/modules/xenoarcheaology/artifacts/artifact_find.dm b/code/modules/xenoarcheaology/artifacts/artifact_find.dm new file mode 100644 index 00000000000..7cead982374 --- /dev/null +++ b/code/modules/xenoarcheaology/artifacts/artifact_find.dm @@ -0,0 +1,19 @@ +/datum/artifact_find + var/artifact_id + var/artifact_find_type + +/datum/artifact_find/New() + + artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]" + + artifact_find_type = pick( + 5;/obj/machinery/power/supermatter, + 5;/obj/structure/constructshell, + 5;/obj/machinery/syndicate_beacon, + 25;/obj/machinery/power/supermatter/shard, + 50;/obj/structure/cult/pylon, + 100;/obj/machinery/auto_cloner, + 100;/obj/machinery/giga_drill, + 100;/obj/machinery/replicator, + 150;/obj/structure/crystal, +1000;/obj/machinery/artifact) \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/xenoarcheaology/artifacts/autocloner.dm similarity index 64% rename from code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm rename to code/modules/xenoarcheaology/artifacts/autocloner.dm index 4daf56e0566..89c653516f9 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm +++ b/code/modules/xenoarcheaology/artifacts/autocloner.dm @@ -1,4 +1,3 @@ - /obj/machinery/auto_cloner name = "mysterious pod" desc = "It's full of a viscous liquid, but appears dark and silent." @@ -22,25 +21,23 @@ //33% chance to spawn nasties if(prob(33)) - spawn_type = pick(\ - /mob/living/simple_animal/hostile/giant_spider/nurse,\ - /mob/living/simple_animal/hostile/alien,\ - /mob/living/simple_animal/hostile/bear,\ - /mob/living/simple_animal/hostile/creature\ - ) + spawn_type = pick( + /mob/living/simple_animal/hostile/giant_spider/nurse, + /mob/living/simple_animal/hostile/alien, + /mob/living/simple_animal/hostile/bear, + /mob/living/simple_animal/hostile/creature) else spawn_type = pick(\ - /mob/living/simple_animal/cat,\ - /mob/living/simple_animal/corgi,\ - /mob/living/simple_animal/corgi/puppy,\ - /mob/living/simple_animal/chicken,\ - /mob/living/simple_animal/cow,\ - /mob/living/simple_animal/parrot,\ - /mob/living/simple_animal/slime,\ - /mob/living/simple_animal/crab,\ - /mob/living/simple_animal/mouse,\ - /mob/living/simple_animal/hostile/retaliate/goat\ - ) + /mob/living/simple_animal/cat, + /mob/living/simple_animal/corgi, + /mob/living/simple_animal/corgi/puppy, + /mob/living/simple_animal/chicken, + /mob/living/simple_animal/cow, + /mob/living/simple_animal/parrot, + /mob/living/simple_animal/slime, + /mob/living/simple_animal/crab, + /mob/living/simple_animal/mouse, + /mob/living/simple_animal/hostile/retaliate/goat) //todo: how the hell is the asteroid permanently powered? /obj/machinery/auto_cloner/process() @@ -48,17 +45,17 @@ if(!previous_power_state) previous_power_state = 1 icon_state = "cellold1" - src.visible_message("\blue \icon[src] [src] suddenly comes to life!") + src.visible_message("\icon[src] [src] suddenly comes to life!") //slowly grow a mob if(prob(5)) - src.visible_message("\blue \icon[src] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")].") + src.visible_message("\icon[src] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")].") //if we've finished growing... if(time_spent_spawning >= time_per_spawn) time_spent_spawning = 0 use_power = 1 - src.visible_message("\blue \icon[src] [src] pings!") + src.visible_message("\icon[src] [src] pings!") icon_state = "cellold1" desc = "It's full of a bubbling viscous liquid, and is lit by a mysterious glow." if(spawn_type) @@ -79,7 +76,7 @@ if(previous_power_state) previous_power_state = 0 icon_state = "cellold0" - src.visible_message("\blue \icon[src] [src] suddenly shuts down.") + src.visible_message("\icon[src] [src] suddenly shuts down.") //cloned mob slowly breaks down time_spent_spawning = max(time_spent_spawning + last_process - world.time, 0) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm b/code/modules/xenoarcheaology/artifacts/crystal.dm similarity index 74% rename from code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm rename to code/modules/xenoarcheaology/artifacts/crystal.dm index 081683b0443..1f922c64bab 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm +++ b/code/modules/xenoarcheaology/artifacts/crystal.dm @@ -1,36 +1,35 @@ - -/obj/structure/crystal - name = "large crystal" - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "crystal" - density = 1 - -/obj/structure/crystal/New() - ..() - - icon_state = pick("ano70","ano80") - - desc = pick(\ - "It shines faintly as it catches the light.",\ - "It appears to have a faint inner glow.",\ - "It seems to draw you inward as you look it at.",\ - "Something twinkles faintly as you look at it.",\ - "It's mesmerizing to behold.") - -/obj/structure/crystal/Destroy() - src.visible_message("\red[src] shatters!") - if(prob(75)) - new /obj/item/weapon/material/shard/phoron(src.loc) - if(prob(50)) - new /obj/item/weapon/material/shard/phoron(src.loc) - if(prob(25)) - new /obj/item/weapon/material/shard/phoron(src.loc) - if(prob(75)) - new /obj/item/weapon/material/shard(src.loc) - if(prob(50)) - new /obj/item/weapon/material/shard(src.loc) - if(prob(25)) - new /obj/item/weapon/material/shard(src.loc) - ..() - -//todo: laser_act +/obj/structure/crystal + name = "large crystal" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "crystal" + density = 1 + +/obj/structure/crystal/New() + ..() + + icon_state = pick("ano70","ano80") + + desc = pick( + "It shines faintly as it catches the light.", + "It appears to have a faint inner glow.", + "It seems to draw you inward as you look it at.", + "Something twinkles faintly as you look at it.", + "It's mesmerizing to behold.") + +/obj/structure/crystal/Destroy() + src.visible_message("\red[src] shatters!") + if(prob(75)) + new /obj/item/weapon/material/shard/phoron(src.loc) + if(prob(50)) + new /obj/item/weapon/material/shard/phoron(src.loc) + if(prob(25)) + new /obj/item/weapon/material/shard/phoron(src.loc) + if(prob(75)) + new /obj/item/weapon/material/shard(src.loc) + if(prob(50)) + new /obj/item/weapon/material/shard(src.loc) + if(prob(25)) + new /obj/item/weapon/material/shard(src.loc) + ..() + +//todo: laser_act diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm b/code/modules/xenoarcheaology/artifacts/gigadrill.dm similarity index 73% rename from code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm rename to code/modules/xenoarcheaology/artifacts/gigadrill.dm index c9d14ce2379..42c7288d2d9 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_gigadrill.dm +++ b/code/modules/xenoarcheaology/artifacts/gigadrill.dm @@ -1,4 +1,3 @@ - /obj/machinery/giga_drill name = "alien drill" desc = "A giant, alien drill mounted on long treads." @@ -14,18 +13,18 @@ if(active) active = 0 icon_state = "gigadrill" - user << "\blue You press a button and [src] slowly spins down." + user << "You press a button and \the [src] slowly spins down." else active = 1 icon_state = "gigadrill_mov" - user << "\blue You press a button and [src] shudders to life." + user << "You press a button and \the [src] shudders to life." /obj/machinery/giga_drill/Bump(atom/A) if(active && !drilling_turf) if(istype(A,/turf/simulated/mineral)) var/turf/simulated/mineral/M = A drilling_turf = get_turf(src) - src.visible_message("\red [src] begins to drill into [M]!") + src.visible_message("\The [src] begins to drill into \the [M].") anchored = 1 spawn(drill_time) if(get_turf(src) == drilling_turf && active) diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm b/code/modules/xenoarcheaology/artifacts/replicator.dm similarity index 63% rename from code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm rename to code/modules/xenoarcheaology/artifacts/replicator.dm index 66b5f7dc7df..a3030b4bf6e 100644 --- a/code/modules/research/xenoarchaeology/artifact/artifact_replicator.dm +++ b/code/modules/xenoarcheaology/artifacts/replicator.dm @@ -1,4 +1,3 @@ - /obj/machinery/replicator name = "alien machine" desc = "It's some kind of pod with strange wires and gadgets all over it." @@ -23,51 +22,50 @@ /obj/machinery/replicator/New() ..() - var/list/viables = list(\ - /obj/item/roller,\ - /obj/structure/closet/crate,\ - /obj/structure/closet/acloset,\ - /mob/living/simple_animal/hostile/mimic,\ - /mob/living/simple_animal/hostile/viscerator,\ - /mob/living/simple_animal/hostile/hivebot,\ - /obj/item/device/analyzer,\ - /obj/item/device/camera,\ - /obj/item/device/flash,\ - /obj/item/device/flashlight,\ - /obj/item/device/healthanalyzer,\ - /obj/item/device/multitool,\ - /obj/item/device/paicard,\ - /obj/item/device/radio,\ - /obj/item/device/radio/headset,\ - /obj/item/device/radio/beacon,\ - /obj/item/weapon/autopsy_scanner,\ - /obj/item/weapon/bikehorn,\ - /obj/item/weapon/bonesetter,\ - /obj/item/weapon/material/knife/butch,\ - /obj/item/weapon/caution,\ - /obj/item/weapon/caution/cone,\ - /obj/item/weapon/crowbar,\ - /obj/item/weapon/clipboard,\ - /obj/item/weapon/cell,\ - /obj/item/weapon/circular_saw,\ - /obj/item/weapon/material/hatchet,\ - /obj/item/weapon/handcuffs,\ - /obj/item/weapon/hemostat,\ - /obj/item/weapon/material/knife,\ - /obj/item/weapon/flame/lighter,\ - /obj/item/weapon/light/bulb,\ - /obj/item/weapon/light/tube,\ - /obj/item/weapon/pickaxe,\ - /obj/item/weapon/shovel,\ - /obj/item/weapon/weldingtool,\ - /obj/item/weapon/wirecutters,\ - /obj/item/weapon/wrench,\ - /obj/item/weapon/screwdriver,\ - /obj/item/weapon/grenade/chem_grenade/cleaner,\ - /obj/item/weapon/grenade/chem_grenade/metalfoam\ - ) + var/list/viables = list( + /obj/item/roller, + /obj/structure/closet/crate, + /obj/structure/closet/acloset, + /mob/living/simple_animal/hostile/mimic, + /mob/living/simple_animal/hostile/viscerator, + /mob/living/simple_animal/hostile/hivebot, + /obj/item/device/analyzer, + /obj/item/device/camera, + /obj/item/device/flash, + /obj/item/device/flashlight, + /obj/item/device/healthanalyzer, + /obj/item/device/multitool, + /obj/item/device/paicard, + /obj/item/device/radio, + /obj/item/device/radio/headset, + /obj/item/device/radio/beacon, + /obj/item/weapon/autopsy_scanner, + /obj/item/weapon/bikehorn, + /obj/item/weapon/bonesetter, + /obj/item/weapon/material/knife/butch, + /obj/item/weapon/caution, + /obj/item/weapon/caution/cone, + /obj/item/weapon/crowbar, + /obj/item/weapon/clipboard, + /obj/item/weapon/cell, + /obj/item/weapon/circular_saw, + /obj/item/weapon/material/hatchet, + /obj/item/weapon/handcuffs, + /obj/item/weapon/hemostat, + /obj/item/weapon/material/knife, + /obj/item/weapon/flame/lighter, + /obj/item/weapon/light/bulb, + /obj/item/weapon/light/tube, + /obj/item/weapon/pickaxe, + /obj/item/weapon/shovel, + /obj/item/weapon/weldingtool, + /obj/item/weapon/wirecutters, + /obj/item/weapon/wrench, + /obj/item/weapon/screwdriver, + /obj/item/weapon/grenade/chem_grenade/cleaner, + /obj/item/weapon/grenade/chem_grenade/metalfoam) - var/quantity = rand(5,15) + var/quantity = rand(5, 15) for(var/i=0, i max_spawn_time) - src.visible_message("\blue \icon[src] [src] pings!") + src.visible_message("\icon[src] [src] pings!") var/obj/source_material = pop(stored_materials) var/spawn_type = pop(spawning_types) @@ -111,7 +109,7 @@ icon_state = "borgcharger0(old)" else if(prob(5)) - src.visible_message("\blue \icon[src] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].") + src.visible_message("\icon[src] [src] [pick("clicks","whizzes","whirrs","whooshes","clanks","clongs","clonks","bangs")].") last_process_time = world.time @@ -130,7 +128,7 @@ user.drop_item() W.loc = src stored_materials.Add(W) - src.visible_message("\blue [user] inserts [W] into [src].") + src.visible_message("\The [user] inserts \the [W] into \the [src].") /obj/machinery/replicator/Topic(href, href_list) @@ -139,9 +137,9 @@ if(index > 0 && index <= construction.len) if(stored_materials.len > spawning_types.len) if(spawning_types.len) - src.visible_message("\blue \icon[src] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].") + src.visible_message("\icon[src] a [pick("light","dial","display","meter","pad")] on [src]'s front [pick("blinks","flashes")] [pick("red","yellow","blue","orange","purple","green","white")].") else - src.visible_message("\blue \icon[src] [src]'s front compartment slides shut.") + src.visible_message("\icon[src] [src]'s front compartment slides shut.") spawning_types.Add(construction[construction[index]]) spawn_progress_time = 0 diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm new file mode 100644 index 00000000000..4c0bafd7071 --- /dev/null +++ b/code/modules/xenoarcheaology/boulder.dm @@ -0,0 +1,90 @@ +/obj/structure/boulder + name = "rocky debris" + desc = "Leftover rock from an excavation, it's been partially dug out already but there's still a lot to go." + icon = 'icons/obj/mining.dmi' + icon_state = "boulder1" + density = 1 + opacity = 1 + anchored = 1 + var/excavation_level = 0 + var/datum/geosample/geological_data + var/datum/artifact_find/artifact_find + var/last_act = 0 + +/obj/structure/boulder/New() + icon_state = "boulder[rand(1,4)]" + excavation_level = rand(5, 50) + +/obj/structure/boulder/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/device/core_sampler)) + src.geological_data.artifact_distance = rand(-100,100) / 100 + src.geological_data.artifact_id = artifact_find.artifact_id + + var/obj/item/device/core_sampler/C = I + C.sample_item(src, user) + return + + if(istype(I, /obj/item/device/depth_scanner)) + var/obj/item/device/depth_scanner/C = I + C.scan_atom(user, src) + return + + if(istype(I, /obj/item/device/measuring_tape)) + var/obj/item/device/measuring_tape/P = I + user.visible_message("\The [user] extends \the [P] towards \the [src].", "You extend \the [P] towards \the [src].") + if(do_after(user, 15)) + user << "\The [src] has been excavated to a depth of [2 * src.excavation_level]cm." + return + + if(istype(I, /obj/item/weapon/pickaxe)) + var/obj/item/weapon/pickaxe/P = I + + if(last_act + P.digspeed > world.time)//prevents message spam + return + last_act = world.time + + user << "You start [P.drill_verb] [src]." + + if(!do_after(user, P.digspeed)) + return + + user << "You finish [P.drill_verb] [src]." + excavation_level += P.excavation_amount + + if(excavation_level > 100) + //failure + user.visible_message("\The [src] suddenly crumbles away.", "\The [src] has disintegrated under your onslaught, any secrets it was holding are long gone.") + qdel(src) + return + + if(prob(excavation_level)) + //success + if(artifact_find) + var/spawn_type = artifact_find.artifact_find_type + var/obj/O = new spawn_type(get_turf(src)) + if(istype(O, /obj/machinery/artifact)) + var/obj/machinery/artifact/X = O + if(X.my_effect) + X.my_effect.artifact_id = artifact_find.artifact_id + src.visible_message("\The [src] suddenly crumbles away.") + else + user.visible_message("\The [src] suddenly crumbles away.", "\The [src] has been whittled away under your careful excavation, but there was nothing of interest inside.") + qdel(src) + +/obj/structure/boulder/Bumped(AM) + . = ..() + if(istype(AM,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = AM + var/obj/item/weapon/pickaxe/P = H.get_inactive_hand() + if(istype(P)) + src.attackby(P, H) + + else if(istype(AM,/mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = AM + if(istype(R.module_active,/obj/item/weapon/pickaxe)) + attackby(R.module_active,R) + + else if(istype(AM,/obj/mecha)) + var/obj/mecha/M = AM + if(istype(M.selected,/obj/item/mecha_parts/mecha_equipment/tool/drill)) + M.selected.action(src) \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/artifact/effect.dm b/code/modules/xenoarcheaology/effect.dm similarity index 66% rename from code/modules/research/xenoarchaeology/artifact/effect.dm rename to code/modules/xenoarcheaology/effect.dm index 23bb649ac78..eaf51f102b9 100644 --- a/code/modules/research/xenoarchaeology/artifact/effect.dm +++ b/code/modules/xenoarcheaology/effect.dm @@ -1,7 +1,5 @@ - -//override procs in children as necessary /datum/artifact_effect - var/effecttype = "unknown" //purely used for admin checks ingame, not needed any more + var/name = "unknown" var/effect = EFFECT_TOUCH var/effectrange = 4 var/trigger = TRIGGER_TOUCH @@ -12,20 +10,11 @@ var/artifact_id = "" var/effect_type = 0 -//0 = Unknown / none detectable -//1 = Concentrated energy -//2 = Intermittent psionic wavefront -//3 = Electromagnetic energy -//4 = Particle field -//5 = Organically reactive exotic particles -//6 = Interdimensional/bluespace? phasing -//7 = Atomic synthesis - /datum/artifact_effect/New(var/atom/location) ..() holder = location - effect = rand(0,MAX_EFFECT) - trigger = rand(0,MAX_TRIGGER) + effect = rand(0, MAX_EFFECT) + trigger = rand(0, MAX_TRIGGER) //this will be replaced by the excavation code later, but it's here just in case artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]" @@ -82,9 +71,53 @@ chargelevel = 0 DoEffectPulse() +/datum/artifact_effect/proc/getDescription() + . = "" + switch(effect_type) + if(EFFECT_ENERGY) + . += "Concentrated energy emissions" + if(EFFECT_PSIONIC) + . += "Intermittent psionic wavefront" + if(EFFECT_ELECTRO) + . += "Electromagnetic energy" + if(EFFECT_PARTICLE) + . += "High frequency particles" + if(EFFECT_ORGANIC) + . += "Organically reactive exotic particles" + if(EFFECT_BLUESPACE) + . += "Interdimensional/bluespace? phasing" + if(EFFECT_SYNTH) + . += "Atomic synthesis" + else + . += "Low level energy emissions" + + . += " have been detected " + + switch(effect) + if(EFFECT_TOUCH) + . += "interspersed throughout substructure and shell." + if(EFFECT_AURA) + . += "emitting in an ambient energy field." + if(EFFECT_PULSE) + . += "emitting in periodic bursts." + else + . += "emitting in an unknown way." + + . += "" + + switch(trigger) + if(TRIGGER_TOUCH, TRIGGER_WATER, TRIGGER_ACID, TRIGGER_VOLATILE, TRIGGER_TOXIN) + . += " Activation index involves physical interaction with artifact surface." + if(TRIGGER_FORCE, TRIGGER_ENERGY, TRIGGER_HEAT, TRIGGER_COLD) + . += " Activation index involves energetic interaction with artifact surface." + if(TRIGGER_PHORON, TRIGGER_OXY, TRIGGER_CO2, TRIGGER_NITRO) + . += " Activation index involves precise local atmospheric conditions." + else + . += " Unable to determine any data about activation trigger." + //returns 0..1, with 1 being no protection and 0 being fully protected -proc/GetAnomalySusceptibility(var/mob/living/carbon/human/H) - if(!H || !istype(H)) +/proc/GetAnomalySusceptibility(var/mob/living/carbon/human/H) + if(!istype(H)) return 1 var/protected = 0 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm b/code/modules/xenoarcheaology/effects/badfeeling.dm similarity index 62% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm rename to code/modules/xenoarcheaology/effects/badfeeling.dm index 0d6bd0eb63e..60386531d96 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_badfeeling.dm +++ b/code/modules/xenoarcheaology/effects/badfeeling.dm @@ -1,70 +1,69 @@ - -/datum/artifact_effect/badfeeling - effecttype = "badfeeling" - effect_type = 2 - var/list/messages = list("You feel worried.",\ - "Something doesn't feel right.",\ - "You get a strange feeling in your gut.",\ - "Your instincts are trying to warn you about something.",\ - "Someone just walked over your grave.",\ - "There's a strange feeling in the air.",\ - "There's a strange smell in the air.",\ - "The tips of your fingers feel tingly.",\ - "You feel witchy.",\ - "You have a terrible sense of foreboding.",\ - "You've got a bad feeling about this.",\ - "Your scalp prickles.",\ - "The light seems to flicker.",\ - "The shadows seem to lengthen.",\ - "The walls are getting closer.",\ - "Something is wrong") - - var/list/drastic_messages = list("You've got to get out of here!",\ - "Someone's trying to kill you!",\ - "There's something out there!",\ - "What's happening to you?",\ - "OH GOD!",\ - "HELP ME!") - -/datum/artifact_effect/badfeeling/DoEffectTouch(var/mob/user) - if(user) - if (istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - if(prob(50)) - if(prob(75)) - H << "[pick(drastic_messages)]" - else - H << "[pick(messages)]" - - if(prob(50)) - H.dizziness += rand(3,5) - -/datum/artifact_effect/badfeeling/DoEffectAura() - if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(src.effectrange,T)) - if(prob(5)) - if(prob(75)) - H << "[pick(messages)]" - else - H << "[pick(drastic_messages)]" - - if(prob(10)) - H.dizziness += rand(3,5) - return 1 - -/datum/artifact_effect/badfeeling/DoEffectPulse() - if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(src.effectrange,T)) - if(prob(50)) - if(prob(95)) - H << "[pick(drastic_messages)]" - else - H << "[pick(messages)]" - - if(prob(50)) - H.dizziness += rand(3,5) - else if(prob(25)) - H.dizziness += rand(5,15) - return 1 +/datum/artifact_effect/badfeeling + name = "badfeeling" + effect_type = EFFECT_PSIONIC + var/list/messages = list("You feel worried.", + "Something doesn't feel right.", + "You get a strange feeling in your gut.", + "Your instincts are trying to warn you about something.", + "Someone just walked over your grave.", + "There's a strange feeling in the air.", + "There's a strange smell in the air.", + "The tips of your fingers feel tingly.", + "You feel witchy.", + "You have a terrible sense of foreboding.", + "You've got a bad feeling about this.", + "Your scalp prickles.", + "The light seems to flicker.", + "The shadows seem to lengthen.", + "The walls are getting closer.", + "Something is wrong") + + var/list/drastic_messages = list("You've got to get out of here!", + "Someone's trying to kill you!", + "There's something out there!", + "What's happening to you?", + "OH GOD!", + "HELP ME!") + +/datum/artifact_effect/badfeeling/DoEffectTouch(var/mob/user) + if(user) + if (istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + if(prob(50)) + if(prob(75)) + H << "[pick(drastic_messages)]" + else + H << "[pick(messages)]" + + if(prob(50)) + H.dizziness += rand(3,5) + +/datum/artifact_effect/badfeeling/DoEffectAura() + if(holder) + var/turf/T = get_turf(holder) + for (var/mob/living/carbon/human/H in range(src.effectrange,T)) + if(prob(5)) + if(prob(75)) + H << "[pick(messages)]" + else + H << "[pick(drastic_messages)]" + + if(prob(10)) + H.dizziness += rand(3,5) + return 1 + +/datum/artifact_effect/badfeeling/DoEffectPulse() + if(holder) + var/turf/T = get_turf(holder) + for (var/mob/living/carbon/human/H in range(src.effectrange,T)) + if(prob(50)) + if(prob(95)) + H << "[pick(drastic_messages)]" + else + H << "[pick(messages)]" + + if(prob(50)) + H.dizziness += rand(3,5) + else if(prob(25)) + H.dizziness += rand(5,15) + return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm b/code/modules/xenoarcheaology/effects/cellcharge.dm similarity index 96% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm rename to code/modules/xenoarcheaology/effects/cellcharge.dm index b6f165ec241..3a30c0646fb 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_cellcharge.dm +++ b/code/modules/xenoarcheaology/effects/cellcharge.dm @@ -1,8 +1,7 @@ - //todo /datum/artifact_effect/cellcharge - effecttype = "cellcharge" - effect_type = 3 + name = "cell charge" + effect_type = EFFECT_ELECTRO var/last_message /datum/artifact_effect/cellcharge/DoEffectTouch(var/mob/user) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm b/code/modules/xenoarcheaology/effects/celldrain.dm similarity index 96% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm rename to code/modules/xenoarcheaology/effects/celldrain.dm index fe94dbe1553..f988fdf20ea 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_celldrain.dm +++ b/code/modules/xenoarcheaology/effects/celldrain.dm @@ -1,8 +1,7 @@ - //todo /datum/artifact_effect/celldrain - effecttype = "celldrain" - effect_type = 3 + name = "cell drain" + effect_type = EFFECT_ELECTRO var/last_message /datum/artifact_effect/celldrain/DoEffectTouch(var/mob/user) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm b/code/modules/xenoarcheaology/effects/cold.dm similarity index 88% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm rename to code/modules/xenoarcheaology/effects/cold.dm index f8dad2c4d36..b4f7025afb1 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_affect_cold.dm +++ b/code/modules/xenoarcheaology/effects/cold.dm @@ -1,14 +1,13 @@ - //inverse of /datum/artifact_effect/heat, the two effects split up for neatness' sake /datum/artifact_effect/cold - effecttype = "cold" + name = "cold" var/target_temp /datum/artifact_effect/cold/New() ..() target_temp = rand(0, 250) effect = pick(EFFECT_TOUCH, EFFECT_AURA) - effect_type = pick(5,6,7) + effect_type = pick(EFFECT_ORGANIC, EFFECT_BLUESPACE, EFFECT_SYNTH) /datum/artifact_effect/cold/DoEffectTouch(var/mob/user) if(holder) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm b/code/modules/xenoarcheaology/effects/dnaswitch.dm similarity index 59% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm rename to code/modules/xenoarcheaology/effects/dnaswitch.dm index b74ab88a9a1..82165f6ad82 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_dnaswitch.dm +++ b/code/modules/xenoarcheaology/effects/dnaswitch.dm @@ -1,8 +1,7 @@ - //todo /datum/artifact_effect/dnaswitch - effecttype = "dnaswitch" - effect_type = 5 + name = "dnaswitch" + effect_type = EFFECT_ORGANIC var/severity /datum/artifact_effect/dnaswitch/New() @@ -15,12 +14,12 @@ /datum/artifact_effect/dnaswitch/DoEffectTouch(var/mob/toucher) var/weakness = GetAnomalySusceptibility(toucher) if(ishuman(toucher) && prob(weakness * 100)) - toucher << pick("\green You feel a little different.",\ - "\green You feel very strange.",\ - "\green Your stomach churns.",\ - "\green Your skin feels loose.",\ - "\green You feel a stabbing pain in your head.",\ - "\green You feel a tingling sensation in your chest.",\ + toucher << pick("\green You feel a little different.", + "\green You feel very strange.", + "\green Your stomach churns.", + "\green Your skin feels loose.", + "\green You feel a stabbing pain in your head.", + "\green You feel a tingling sensation in your chest.", "\green Your entire body vibrates.") if(prob(75)) scramble(1, toucher, weakness * severity) @@ -35,12 +34,12 @@ var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) if(prob(30)) - H << pick("\green You feel a little different.",\ - "\green You feel very strange.",\ - "\green Your stomach churns.",\ - "\green Your skin feels loose.",\ - "\green You feel a stabbing pain in your head.",\ - "\green You feel a tingling sensation in your chest.",\ + H << pick("\green You feel a little different.", + "\green You feel very strange.", + "\green Your stomach churns.", + "\green Your skin feels loose.", + "\green You feel a stabbing pain in your head.", + "\green You feel a tingling sensation in your chest.", "\green Your entire body vibrates.") if(prob(50)) scramble(1, H, weakness * severity) @@ -54,12 +53,12 @@ var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) if(prob(75)) - H << pick("\green You feel a little different.",\ - "\green You feel very strange.",\ - "\green Your stomach churns.",\ - "\green Your skin feels loose.",\ - "\green You feel a stabbing pain in your head.",\ - "\green You feel a tingling sensation in your chest.",\ + H << pick("\green You feel a little different.", + "\green You feel very strange.", + "\green Your stomach churns.", + "\green Your skin feels loose.", + "\green You feel a stabbing pain in your head.", + "\green You feel a tingling sensation in your chest.", "\green Your entire body vibrates.") if(prob(25)) if(prob(75)) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_emp.dm b/code/modules/xenoarcheaology/effects/emp.dm similarity index 83% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_emp.dm rename to code/modules/xenoarcheaology/effects/emp.dm index 18165cf0d41..d6d402efe4e 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_emp.dm +++ b/code/modules/xenoarcheaology/effects/emp.dm @@ -1,7 +1,6 @@ - /datum/artifact_effect/emp - effecttype = "emp" - effect_type = 3 + name = "emp" + effect_type = EFFECT_ELECTRO /datum/artifact_effect/emp/New() ..() diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm b/code/modules/xenoarcheaology/effects/forcefield.dm similarity index 94% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm rename to code/modules/xenoarcheaology/effects/forcefield.dm index 0139ea935fb..6a48620b406 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_forcefield.dm +++ b/code/modules/xenoarcheaology/effects/forcefield.dm @@ -1,80 +1,79 @@ - -/datum/artifact_effect/forcefield - effecttype = "forcefield" - var/list/created_field = list() - effect_type = 4 - -/datum/artifact_effect/forcefield/New() - ..() - trigger = TRIGGER_TOUCH - -/datum/artifact_effect/forcefield/ToggleActivate() - ..() - if(created_field.len) - for(var/obj/effect/energy_field/F in created_field) - created_field.Remove(F) - qdel(F) - else if(holder) - var/turf/T = get_turf(holder) - while(created_field.len < 16) - var/obj/effect/energy_field/E = new (locate(T.x,T.y,T.z)) - created_field.Add(E) - E.strength = 1 - E.density = 1 - E.anchored = 1 - E.invisibility = 0 - spawn(10) - UpdateMove() - return 1 - -/datum/artifact_effect/forcefield/process() - ..() - for(var/obj/effect/energy_field/E in created_field) - if(E.strength < 1) - E.Strengthen(0.15) - else if(E.strength < 5) - E.Strengthen(0.25) - -/datum/artifact_effect/forcefield/UpdateMove() - if(created_field.len && holder) - var/turf/T = get_turf(holder) - while(created_field.len < 16) - //for now, just instantly respawn the fields when they get destroyed - var/obj/effect/energy_field/E = new (locate(T.x,T.y,T)) - created_field.Add(E) - E.anchored = 1 - E.density = 1 - E.invisibility = 0 - - var/obj/effect/energy_field/E = created_field[1] - E.loc = locate(T.x + 2,T.y + 2,T.z) - E = created_field[2] - E.loc = locate(T.x + 2,T.y + 1,T.z) - E = created_field[3] - E.loc = locate(T.x + 2,T.y,T.z) - E = created_field[4] - E.loc = locate(T.x + 2,T.y - 1,T.z) - E = created_field[5] - E.loc = locate(T.x + 2,T.y - 2,T.z) - E = created_field[6] - E.loc = locate(T.x + 1,T.y + 2,T.z) - E = created_field[7] - E.loc = locate(T.x + 1,T.y - 2,T.z) - E = created_field[8] - E.loc = locate(T.x,T.y + 2,T.z) - E = created_field[9] - E.loc = locate(T.x,T.y - 2,T.z) - E = created_field[10] - E.loc = locate(T.x - 1,T.y + 2,T.z) - E = created_field[11] - E.loc = locate(T.x - 1,T.y - 2,T.z) - E = created_field[12] - E.loc = locate(T.x - 2,T.y + 2,T.z) - E = created_field[13] - E.loc = locate(T.x - 2,T.y + 1,T.z) - E = created_field[14] - E.loc = locate(T.x - 2,T.y,T.z) - E = created_field[15] - E.loc = locate(T.x - 2,T.y - 1,T.z) - E = created_field[16] - E.loc = locate(T.x - 2,T.y - 2,T.z) +/datum/artifact_effect/forcefield + name = "force field" + var/list/created_field = list() + effect_type = EFFECT_PARTICLE + +/datum/artifact_effect/forcefield/New() + ..() + trigger = TRIGGER_TOUCH + +/datum/artifact_effect/forcefield/ToggleActivate() + ..() + if(created_field.len) + for(var/obj/effect/energy_field/F in created_field) + created_field.Remove(F) + qdel(F) + else if(holder) + var/turf/T = get_turf(holder) + while(created_field.len < 16) + var/obj/effect/energy_field/E = new (locate(T.x,T.y,T.z)) + created_field.Add(E) + E.strength = 1 + E.density = 1 + E.anchored = 1 + E.invisibility = 0 + spawn(10) + UpdateMove() + return 1 + +/datum/artifact_effect/forcefield/process() + ..() + for(var/obj/effect/energy_field/E in created_field) + if(E.strength < 1) + E.Strengthen(0.15) + else if(E.strength < 5) + E.Strengthen(0.25) + +/datum/artifact_effect/forcefield/UpdateMove() + if(created_field.len && holder) + var/turf/T = get_turf(holder) + while(created_field.len < 16) + //for now, just instantly respawn the fields when they get destroyed + var/obj/effect/energy_field/E = new (locate(T.x,T.y,T)) + created_field.Add(E) + E.anchored = 1 + E.density = 1 + E.invisibility = 0 + + var/obj/effect/energy_field/E = created_field[1] + E.loc = locate(T.x + 2,T.y + 2,T.z) + E = created_field[2] + E.loc = locate(T.x + 2,T.y + 1,T.z) + E = created_field[3] + E.loc = locate(T.x + 2,T.y,T.z) + E = created_field[4] + E.loc = locate(T.x + 2,T.y - 1,T.z) + E = created_field[5] + E.loc = locate(T.x + 2,T.y - 2,T.z) + E = created_field[6] + E.loc = locate(T.x + 1,T.y + 2,T.z) + E = created_field[7] + E.loc = locate(T.x + 1,T.y - 2,T.z) + E = created_field[8] + E.loc = locate(T.x,T.y + 2,T.z) + E = created_field[9] + E.loc = locate(T.x,T.y - 2,T.z) + E = created_field[10] + E.loc = locate(T.x - 1,T.y + 2,T.z) + E = created_field[11] + E.loc = locate(T.x - 1,T.y - 2,T.z) + E = created_field[12] + E.loc = locate(T.x - 2,T.y + 2,T.z) + E = created_field[13] + E.loc = locate(T.x - 2,T.y + 1,T.z) + E = created_field[14] + E.loc = locate(T.x - 2,T.y,T.z) + E = created_field[15] + E.loc = locate(T.x - 2,T.y - 1,T.z) + E = created_field[16] + E.loc = locate(T.x - 2,T.y - 2,T.z) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasco2.dm b/code/modules/xenoarcheaology/effects/gasco2.dm similarity index 72% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasco2.dm rename to code/modules/xenoarcheaology/effects/gasco2.dm index c486959afd9..264dca7352c 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasco2.dm +++ b/code/modules/xenoarcheaology/effects/gasco2.dm @@ -1,26 +1,19 @@ - -/datum/artifact_effect/gasco2 - effecttype = "gasco2" - var/max_pressure - var/target_percentage - -/datum/artifact_effect/heat/New() - ..() - effect_type = pick(6,7) - -/datum/artifact_effect/gasco2/New() - ..() - effect = pick(EFFECT_TOUCH, EFFECT_AURA) - max_pressure = rand(115,1000) - -/datum/artifact_effect/gasco2/DoEffectTouch(var/mob/user) - if(holder) - var/turf/holder_loc = holder.loc - if(istype(holder_loc)) - holder_loc.assume_gas("carbon_dioxide", rand(2, 15)) - -/datum/artifact_effect/gasco2/DoEffectAura() - if(holder) - var/turf/holder_loc = holder.loc - if(istype(holder_loc)) - holder_loc.assume_gas("carbon_dioxide", pick(0, 0, 0.1, rand())) +/datum/artifact_effect/gasco2 + name = "CO2 creation" + +/datum/artifact_effect/gasco2/New() + ..() + effect = pick(EFFECT_TOUCH, EFFECT_AURA) + effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH) + +/datum/artifact_effect/gasco2/DoEffectTouch(var/mob/user) + if(holder) + var/turf/holder_loc = holder.loc + if(istype(holder_loc)) + holder_loc.assume_gas("carbon_dioxide", rand(2, 15)) + +/datum/artifact_effect/gasco2/DoEffectAura() + if(holder) + var/turf/holder_loc = holder.loc + if(istype(holder_loc)) + holder_loc.assume_gas("carbon_dioxide", pick(0, 0, 0.1, rand())) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasnitro.dm b/code/modules/xenoarcheaology/effects/gasnitro.dm similarity index 76% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasnitro.dm rename to code/modules/xenoarcheaology/effects/gasnitro.dm index 6954ab3c77a..42b440fc1cb 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasnitro.dm +++ b/code/modules/xenoarcheaology/effects/gasnitro.dm @@ -1,23 +1,19 @@ - -/datum/artifact_effect/gasnitro - effecttype = "gasnitro" - var/max_pressure - var/target_percentage - -/datum/artifact_effect/gasnitro/New() - ..() - effect = pick(EFFECT_TOUCH, EFFECT_AURA) - effect_type = pick(6,7) - max_pressure = rand(115,1000) - -/datum/artifact_effect/gasnitro/DoEffectTouch(var/mob/user) - if(holder) - var/turf/holder_loc = holder.loc - if(istype(holder_loc)) - holder_loc.assume_gas("nitrogen", rand(2, 15)) - -/datum/artifact_effect/gasnitro/DoEffectAura() - if(holder) - var/turf/holder_loc = holder.loc - if(istype(holder_loc)) - holder_loc.assume_gas("nitrogen", pick(0, 0, 0.1, rand())) +/datum/artifact_effect/gasnitro + name = "N2 creation" + +/datum/artifact_effect/gasnitro/New() + ..() + effect = pick(EFFECT_TOUCH, EFFECT_AURA) + effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH) + +/datum/artifact_effect/gasnitro/DoEffectTouch(var/mob/user) + if(holder) + var/turf/holder_loc = holder.loc + if(istype(holder_loc)) + holder_loc.assume_gas("nitrogen", rand(2, 15)) + +/datum/artifact_effect/gasnitro/DoEffectAura() + if(holder) + var/turf/holder_loc = holder.loc + if(istype(holder_loc)) + holder_loc.assume_gas("nitrogen", pick(0, 0, 0.1, rand())) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasoxy.dm b/code/modules/xenoarcheaology/effects/gasoxy.dm similarity index 79% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasoxy.dm rename to code/modules/xenoarcheaology/effects/gasoxy.dm index ae8d253652d..bb159509dc8 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasoxy.dm +++ b/code/modules/xenoarcheaology/effects/gasoxy.dm @@ -1,23 +1,19 @@ - -/datum/artifact_effect/gasoxy - effecttype = "gasoxy" - var/max_pressure - -/datum/artifact_effect/gasoxy/New() - ..() - effect = pick(EFFECT_TOUCH, EFFECT_AURA) - max_pressure = rand(115,1000) - effect_type = pick(6,7) - - -/datum/artifact_effect/gasoxy/DoEffectTouch(var/mob/user) - if(holder) - var/turf/holder_loc = holder.loc - if(istype(holder_loc)) - holder_loc.assume_gas("oxygen", rand(2, 15)) - -/datum/artifact_effect/gasoxy/DoEffectAura() - if(holder) - var/turf/holder_loc = holder.loc - if(istype(holder_loc)) - holder_loc.assume_gas("oxygen", pick(0, 0, 0.1, rand())) +/datum/artifact_effect/gasoxy + name = "O2 creation" + +/datum/artifact_effect/gasoxy/New() + ..() + effect = pick(EFFECT_TOUCH, EFFECT_AURA) + effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH) + +/datum/artifact_effect/gasoxy/DoEffectTouch(var/mob/user) + if(holder) + var/turf/holder_loc = holder.loc + if(istype(holder_loc)) + holder_loc.assume_gas("oxygen", rand(2, 15)) + +/datum/artifact_effect/gasoxy/DoEffectAura() + if(holder) + var/turf/holder_loc = holder.loc + if(istype(holder_loc)) + holder_loc.assume_gas("oxygen", pick(0, 0, 0.1, rand())) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasplasma.dm b/code/modules/xenoarcheaology/effects/gasphoron.dm similarity index 71% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasplasma.dm rename to code/modules/xenoarcheaology/effects/gasphoron.dm index d470a462b1b..b84296fbb8a 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gasplasma.dm +++ b/code/modules/xenoarcheaology/effects/gasphoron.dm @@ -1,20 +1,16 @@ - /datum/artifact_effect/gasphoron - effecttype = "gasphoron" - var/max_pressure - var/target_percentage + name = "phoron creation" /datum/artifact_effect/gasphoron/New() ..() effect = pick(EFFECT_TOUCH, EFFECT_AURA) - max_pressure = rand(115,1000) - effect_type = pick(6,7) + effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH) /datum/artifact_effect/gasphoron/DoEffectTouch(var/mob/user) if(holder) var/turf/holder_loc = holder.loc if(istype(holder_loc)) - holder_loc.assume_gas("oxygen", rand(2, 15)) + holder_loc.assume_gas("phoron", rand(2, 15)) /datum/artifact_effect/gasphoron/DoEffectAura() if(holder) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gassleeping.dm b/code/modules/xenoarcheaology/effects/gassleeping.dm similarity index 77% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gassleeping.dm rename to code/modules/xenoarcheaology/effects/gassleeping.dm index afa1d0704c4..8537880438e 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_gassleeping.dm +++ b/code/modules/xenoarcheaology/effects/gassleeping.dm @@ -1,23 +1,19 @@ - -/datum/artifact_effect/gassleeping - effecttype = "gassleeping" - var/max_pressure - var/target_percentage - -/datum/artifact_effect/gassleeping/New() - ..() - effect = pick(EFFECT_TOUCH, EFFECT_AURA) - max_pressure = rand(115,1000) - effect_type = pick(6,7) - -/datum/artifact_effect/gassleeping/DoEffectTouch(var/mob/user) - if(holder) - var/turf/holder_loc = holder.loc - if(istype(holder_loc)) - holder_loc.assume_gas("sleeping_agent", rand(2, 15)) - -/datum/artifact_effect/gassleeping/DoEffectAura() - if(holder) - var/turf/holder_loc = holder.loc - if(istype(holder_loc)) - holder_loc.assume_gas("sleeping_agent", pick(0, 0, 0.1, rand())) +/datum/artifact_effect/gassleeping + name = "N2O creation" + +/datum/artifact_effect/gassleeping/New() + ..() + effect = pick(EFFECT_TOUCH, EFFECT_AURA) + effect_type = pick(EFFECT_BLUESPACE, EFFECT_SYNTH) + +/datum/artifact_effect/gassleeping/DoEffectTouch(var/mob/user) + if(holder) + var/turf/holder_loc = holder.loc + if(istype(holder_loc)) + holder_loc.assume_gas("sleeping_agent", rand(2, 15)) + +/datum/artifact_effect/gassleeping/DoEffectAura() + if(holder) + var/turf/holder_loc = holder.loc + if(istype(holder_loc)) + holder_loc.assume_gas("sleeping_agent", pick(0, 0, 0.1, rand())) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm b/code/modules/xenoarcheaology/effects/goodfeeling.dm similarity index 70% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm rename to code/modules/xenoarcheaology/effects/goodfeeling.dm index 61719bc9161..8086d0e6737 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_goodfeeling.dm +++ b/code/modules/xenoarcheaology/effects/goodfeeling.dm @@ -1,68 +1,67 @@ - -/datum/artifact_effect/goodfeeling - effecttype = "goodfeeling" - effect_type = 2 - var/list/messages = list("You feel good.",\ - "Everything seems to be going alright",\ - "You've got a good feeling about this",\ - "Your instincts tell you everything is going to be getting better.",\ - "There's a good feeling in the air.",\ - "Something smells... good.",\ - "The tips of your fingers feel tingly.",\ - "You've got a good feeling about this.",\ - "You feel happy.",\ - "You fight the urge to smile.",\ - "Your scalp prickles.",\ - "All the colours seem a bit more vibrant.",\ - "Everything seems a little lighter.",\ - "The troubles of the world seem to fade away.") - - var/list/drastic_messages = list("You want to hug everyone you meet!",\ - "Everything is going so well!",\ - "You feel euphoric.",\ - "You feel giddy.",\ - "You're so happy suddenly, you almost want to dance and sing.",\ - "You feel like the world is out to help you.") - -/datum/artifact_effect/goodfeeling/DoEffectTouch(var/mob/user) - if(user) - if (istype(user, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = user - if(prob(50)) - if(prob(75)) - H << "[pick(drastic_messages)]" - else - H << "[pick(messages)]" - - if(prob(50)) - H.dizziness += rand(3,5) - -/datum/artifact_effect/goodfeeling/DoEffectAura() - if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(src.effectrange,T)) - if(prob(5)) - if(prob(75)) - H << "[pick(messages)]" - else - H << "[pick(drastic_messages)]" - - if(prob(5)) - H.dizziness += rand(3,5) - return 1 - -/datum/artifact_effect/goodfeeling/DoEffectPulse() - if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/carbon/human/H in range(src.effectrange,T)) - if(prob(50)) - if(prob(95)) - H << "[pick(drastic_messages)]" - else - H << "[pick(messages)]" - - if(prob(50)) - H.dizziness += rand(3,5) - else if(prob(25)) - H.dizziness += rand(5,15) - return 1 +/datum/artifact_effect/goodfeeling + name = "good feeling" + effect_type = EFFECT_PSIONIC + var/list/messages = list("You feel good.", + "Everything seems to be going alright", + "You've got a good feeling about this", + "Your instincts tell you everything is going to be getting better.", + "There's a good feeling in the air.", + "Something smells... good.", + "The tips of your fingers feel tingly.", + "You've got a good feeling about this.", + "You feel happy.", + "You fight the urge to smile.", + "Your scalp prickles.", + "All the colours seem a bit more vibrant.", + "Everything seems a little lighter.", + "The troubles of the world seem to fade away.") + + var/list/drastic_messages = list("You want to hug everyone you meet!", + "Everything is going so well!", + "You feel euphoric.", + "You feel giddy.", + "You're so happy suddenly, you almost want to dance and sing.", + "You feel like the world is out to help you.") + +/datum/artifact_effect/goodfeeling/DoEffectTouch(var/mob/user) + if(user) + if (istype(user, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = user + if(prob(50)) + if(prob(75)) + H << "[pick(drastic_messages)]" + else + H << "[pick(messages)]" + + if(prob(50)) + H.dizziness += rand(3,5) + +/datum/artifact_effect/goodfeeling/DoEffectAura() + if(holder) + var/turf/T = get_turf(holder) + for (var/mob/living/carbon/human/H in range(src.effectrange,T)) + if(prob(5)) + if(prob(75)) + H << "[pick(messages)]" + else + H << "[pick(drastic_messages)]" + + if(prob(5)) + H.dizziness += rand(3,5) + return 1 + +/datum/artifact_effect/goodfeeling/DoEffectPulse() + if(holder) + var/turf/T = get_turf(holder) + for (var/mob/living/carbon/human/H in range(src.effectrange,T)) + if(prob(50)) + if(prob(95)) + H << "[pick(drastic_messages)]" + else + H << "[pick(messages)]" + + if(prob(50)) + H.dizziness += rand(3,5) + else if(prob(25)) + H.dizziness += rand(5,15) + return 1 diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm b/code/modules/xenoarcheaology/effects/heal.dm similarity index 97% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm rename to code/modules/xenoarcheaology/effects/heal.dm index 5a6e8a46dbd..275f25e3d36 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heal.dm +++ b/code/modules/xenoarcheaology/effects/heal.dm @@ -1,7 +1,6 @@ - /datum/artifact_effect/heal - effecttype = "heal" - effect_type = 5 + name = "heal" + effect_type = EFFECT_ORGANIC /datum/artifact_effect/heal/DoEffectTouch(var/mob/toucher) //todo: check over this properly diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm b/code/modules/xenoarcheaology/effects/heat.dm similarity index 84% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm rename to code/modules/xenoarcheaology/effects/heat.dm index 21304df4082..00d57ff40a9 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_heat.dm +++ b/code/modules/xenoarcheaology/effects/heat.dm @@ -1,17 +1,13 @@ - //inverse of /datum/artifact_effect/cold, the two effects split up for neatness' sake /datum/artifact_effect/heat - effecttype = "heat" + name = "heat" var/target_temp /datum/artifact_effect/heat/New() ..() - effect_type = pick(5,6,7) - -/datum/artifact_effect/heat/New() - ..() - target_temp = rand(300,600) effect = pick(EFFECT_TOUCH, EFFECT_AURA) + effect_type = pick(EFFECT_ORGANIC, EFFECT_BLUESPACE, EFFECT_SYNTH) + target_temp = rand(300, 600) /datum/artifact_effect/heat/DoEffectTouch(var/mob/user) if(holder) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm b/code/modules/xenoarcheaology/effects/hurt.dm similarity index 95% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm rename to code/modules/xenoarcheaology/effects/hurt.dm index 5bdb39a87c4..db8732294d8 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_hurt.dm +++ b/code/modules/xenoarcheaology/effects/hurt.dm @@ -1,49 +1,48 @@ - -/datum/artifact_effect/hurt - effecttype = I_HURT - effect_type = 5 - -/datum/artifact_effect/hurt/DoEffectTouch(var/mob/toucher) - if(toucher) - var/weakness = GetAnomalySusceptibility(toucher) - if(iscarbon(toucher) && prob(weakness * 100)) - var/mob/living/carbon/C = toucher - C << "A painful discharge of energy strikes you!" - C.adjustOxyLoss(rand(5,25) * weakness) - C.adjustToxLoss(rand(5,25) * weakness) - C.adjustBruteLoss(rand(5,25) * weakness) - C.adjustFireLoss(rand(5,25) * weakness) - C.adjustBrainLoss(rand(1,5) * weakness) - C.apply_effect(25 * weakness, IRRADIATE) - C.nutrition -= min(50 * weakness, C.nutrition) - C.make_dizzy(6 * weakness) - C.weakened += 6 * weakness - -/datum/artifact_effect/hurt/DoEffectAura() - if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(src.effectrange,T)) - var/weakness = GetAnomalySusceptibility(C) - if(prob(weakness * 100)) - if(prob(10)) - C << "You feel a painful force radiating from something nearby." - C.adjustBruteLoss(1 * weakness) - C.adjustFireLoss(1 * weakness) - C.adjustToxLoss(1 * weakness) - C.adjustOxyLoss(1 * weakness) - C.adjustBrainLoss(0.1 * weakness) - C.updatehealth() - -/datum/artifact_effect/hurt/DoEffectPulse() - if(holder) - var/turf/T = get_turf(holder) - for (var/mob/living/carbon/C in range(effectrange, T)) - var/weakness = GetAnomalySusceptibility(C) - if(prob(weakness * 100)) - C << "A wave of painful energy strikes you!" - C.adjustBruteLoss(3 * weakness) - C.adjustFireLoss(3 * weakness) - C.adjustToxLoss(3 * weakness) - C.adjustOxyLoss(3 * weakness) - C.adjustBrainLoss(0.1 * weakness) - C.updatehealth() +/datum/artifact_effect/hurt + name = "hurt" + effect_type = EFFECT_ORGANIC + +/datum/artifact_effect/hurt/DoEffectTouch(var/mob/toucher) + if(toucher) + var/weakness = GetAnomalySusceptibility(toucher) + if(iscarbon(toucher) && prob(weakness * 100)) + var/mob/living/carbon/C = toucher + C << "A painful discharge of energy strikes you!" + C.adjustOxyLoss(rand(5,25) * weakness) + C.adjustToxLoss(rand(5,25) * weakness) + C.adjustBruteLoss(rand(5,25) * weakness) + C.adjustFireLoss(rand(5,25) * weakness) + C.adjustBrainLoss(rand(1,5) * weakness) + C.apply_effect(25 * weakness, IRRADIATE) + C.nutrition -= min(50 * weakness, C.nutrition) + C.make_dizzy(6 * weakness) + C.weakened += 6 * weakness + +/datum/artifact_effect/hurt/DoEffectAura() + if(holder) + var/turf/T = get_turf(holder) + for (var/mob/living/carbon/C in range(src.effectrange,T)) + var/weakness = GetAnomalySusceptibility(C) + if(prob(weakness * 100)) + if(prob(10)) + C << "You feel a painful force radiating from something nearby." + C.adjustBruteLoss(1 * weakness) + C.adjustFireLoss(1 * weakness) + C.adjustToxLoss(1 * weakness) + C.adjustOxyLoss(1 * weakness) + C.adjustBrainLoss(0.1 * weakness) + C.updatehealth() + +/datum/artifact_effect/hurt/DoEffectPulse() + if(holder) + var/turf/T = get_turf(holder) + for (var/mob/living/carbon/C in range(effectrange, T)) + var/weakness = GetAnomalySusceptibility(C) + if(prob(weakness * 100)) + C << "A wave of painful energy strikes you!" + C.adjustBruteLoss(3 * weakness) + C.adjustFireLoss(3 * weakness) + C.adjustToxLoss(3 * weakness) + C.adjustOxyLoss(3 * weakness) + C.adjustBrainLoss(0.1 * weakness) + C.updatehealth() diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm b/code/modules/xenoarcheaology/effects/radiate.dm similarity index 91% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm rename to code/modules/xenoarcheaology/effects/radiate.dm index 4310ffb2e71..78164097573 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_radiate.dm +++ b/code/modules/xenoarcheaology/effects/radiate.dm @@ -1,12 +1,11 @@ - /datum/artifact_effect/radiate - effecttype = "radiate" + name = "radiation" var/radiation_amount /datum/artifact_effect/radiate/New() ..() radiation_amount = rand(1, 10) - effect_type = pick(4,5) + effect_type = pick(EFFECT_PARTICLE, EFFECT_ORGANIC) /datum/artifact_effect/radiate/DoEffectTouch(var/mob/living/user) if(user) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm b/code/modules/xenoarcheaology/effects/roboheal.dm similarity index 93% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm rename to code/modules/xenoarcheaology/effects/roboheal.dm index 96e20fd3d11..4f852869a4a 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_roboheal.dm +++ b/code/modules/xenoarcheaology/effects/roboheal.dm @@ -1,11 +1,10 @@ - /datum/artifact_effect/roboheal - effecttype = "roboheal" + name = "robotic healing" var/last_message /datum/artifact_effect/roboheal/New() ..() - effect_type = pick(3,4) + effect_type = pick(EFFECT_ELECTRO, EFFECT_PARTICLE) /datum/artifact_effect/roboheal/DoEffectTouch(var/mob/user) if(user) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm b/code/modules/xenoarcheaology/effects/robohurt.dm similarity index 93% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm rename to code/modules/xenoarcheaology/effects/robohurt.dm index aab220cff72..3487bf7a4eb 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_robohurt.dm +++ b/code/modules/xenoarcheaology/effects/robohurt.dm @@ -1,11 +1,10 @@ - /datum/artifact_effect/robohurt - effecttype = "robohurt" + name = "robotic harm" var/last_message /datum/artifact_effect/robohurt/New() ..() - effect_type = pick(3,4) + effect_type = pick(EFFECT_ELECTRO, EFFECT_PARTICLE) /datum/artifact_effect/robohurt/DoEffectTouch(var/mob/user) if(user) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm b/code/modules/xenoarcheaology/effects/sleepy.dm similarity index 96% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm rename to code/modules/xenoarcheaology/effects/sleepy.dm index 61979c5f69d..bcdd736ebc7 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_sleepy.dm +++ b/code/modules/xenoarcheaology/effects/sleepy.dm @@ -1,11 +1,10 @@ - //todo /datum/artifact_effect/sleepy - effecttype = "sleepy" + name = "sleepy" /datum/artifact_effect/sleepy/New() ..() - effect_type = pick(5,2) + effect_type = pick(EFFECT_PSIONIC, EFFECT_ORGANIC) /datum/artifact_effect/sleepy/DoEffectTouch(var/mob/toucher) if(toucher) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm b/code/modules/xenoarcheaology/effects/stun.dm similarity index 95% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm rename to code/modules/xenoarcheaology/effects/stun.dm index b7b2864de41..adecc650869 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_stun.dm +++ b/code/modules/xenoarcheaology/effects/stun.dm @@ -1,10 +1,9 @@ - /datum/artifact_effect/stun - effecttype = "stun" + name = "stun" /datum/artifact_effect/stun/New() ..() - effect_type = pick(2,5) + effect_type = pick(EFFECT_PSIONIC, EFFECT_ORGANIC) /datum/artifact_effect/stun/DoEffectTouch(var/mob/toucher) if(toucher && iscarbon(toucher)) diff --git a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm b/code/modules/xenoarcheaology/effects/teleport.dm similarity index 97% rename from code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm rename to code/modules/xenoarcheaology/effects/teleport.dm index 5df1a33f66d..a050d6c249a 100644 --- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm +++ b/code/modules/xenoarcheaology/effects/teleport.dm @@ -1,7 +1,6 @@ - /datum/artifact_effect/teleport - effecttype = "teleport" - effect_type = 6 + name = "teleport" + effect_type = EFFECT_BLUESPACE /datum/artifact_effect/teleport/DoEffectTouch(var/mob/user) var/weakness = GetAnomalySusceptibility(user) diff --git a/code/modules/research/xenoarchaeology/finds/finds_eguns.dm b/code/modules/xenoarcheaology/finds/eguns.dm similarity index 100% rename from code/modules/research/xenoarchaeology/finds/finds_eguns.dm rename to code/modules/xenoarcheaology/finds/eguns.dm diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm similarity index 84% rename from code/modules/research/xenoarchaeology/finds/finds.dm rename to code/modules/xenoarcheaology/finds/find_spawning.dm index 33cb2d52ff4..3be0dfbca22 100644 --- a/code/modules/research/xenoarchaeology/finds/finds.dm +++ b/code/modules/xenoarcheaology/finds/find_spawning.dm @@ -1,83 +1,3 @@ -//original code and idea from Alfie275 (luna era) and ISaidNo (goonservers) - with thanks - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Xenoarchaeological finds - -/datum/find - var/find_type = 0 //random according to the digsite type - var/excavation_required = 0 //random 5-95% - var/view_range = 20 //how close excavation has to come to show an overlay on the turf - var/clearance_range = 3 //how close excavation has to come to extract the item - //if excavation hits var/excavation_required exactly, it's contained find is extracted cleanly without the ore - var/prob_delicate = 90 //probability it requires an active suspension field to not insta-crumble - var/dissonance_spread = 1 //proportion of the tile that is affected by this find - //used in conjunction with analysis machines to determine correct suspension field type - -/datum/find/New(var/digsite, var/exc_req) - excavation_required = exc_req - find_type = get_random_find_type(digsite) - clearance_range = rand(2,6) - dissonance_spread = rand(1500,2500) / 100 - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Strange rocks - -//have all strange rocks be cleared away using welders for now -/obj/item/weapon/ore/strangerock - name = "Strange rock" - desc = "Seems to have some unusal strata evident throughout it." - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "strange" - var/obj/item/weapon/inside - var/method = 0// 0 = fire, 1 = brush, 2 = pick - origin_tech = list(TECH_MATERIAL = 5) - -/obj/item/weapon/ore/strangerock/New(loc, var/inside_item_type = 0) - ..(loc) - - //method = rand(0,2) - if(inside_item_type) - inside = new/obj/item/weapon/archaeological_find(src, new_item_type = inside_item_type) - if(!inside) - inside = locate() in contents - -/*/obj/item/weapon/ore/strangerock/ex_act(var/severity) - if(severity && prob(30)) - src.visible_message("The [src] crumbles away, leaving some dust and gravel behind.")*/ - -/obj/item/weapon/ore/strangerock/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(istype(W,/obj/item/weapon/weldingtool/)) - var/obj/item/weapon/weldingtool/w = W - if(w.isOn()) - if(w.get_fuel() >= 4 && !src.method) - if(inside) - inside.loc = get_turf(src) - for(var/mob/M in viewers(world.view, user)) - M.show_message("[src] burns away revealing [inside].",1) - else - for(var/mob/M in viewers(world.view, user)) - M.show_message("[src] burns away into nothing.",1) - qdel(src) - w.remove_fuel(4) - else - for(var/mob/M in viewers(world.view, user)) - M.show_message("A few sparks fly off [src], but nothing else happens.",1) - w.remove_fuel(1) - return - - else if(istype(W,/obj/item/device/core_sampler/)) - var/obj/item/device/core_sampler/S = W - S.sample_item(src, user) - return - - ..() - if(prob(33)) - src.visible_message("[src] crumbles away, leaving some dust and gravel behind.") - qdel(src) - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Archaeological finds - /obj/item/weapon/archaeological_find name = "object" icon = 'icons/obj/xenoarchaeology.dmi' @@ -88,7 +8,7 @@ if(new_item_type) find_type = new_item_type else - find_type = rand(1,34) //update this when you add new find types + find_type = rand(1, MAX_ARCHAEO) var/item_type = "object" icon_state = "unknown[rand(1,4)]" @@ -99,6 +19,7 @@ var/apply_image_decorations = 0 var/material_descriptor = "" var/apply_prefix = 1 + if(prob(40)) material_descriptor = pick("rusted ","dusty ","archaic ","fragile ") source_material = pick("cordite","quadrinium",DEFAULT_WALL_MATERIAL,"titanium","aluminium","ferritic-alloy","plasteel","duranium") diff --git a/code/modules/xenoarcheaology/finds/finds.dm b/code/modules/xenoarcheaology/finds/finds.dm new file mode 100644 index 00000000000..ab5d00e7861 --- /dev/null +++ b/code/modules/xenoarcheaology/finds/finds.dm @@ -0,0 +1,67 @@ +/datum/find + var/find_type = 0 //random according to the digsite type + var/excavation_required = 0 //random 10 - 190 + var/view_range = 40 //how close excavation has to come to show an overlay on the turf + var/clearance_range = 3 //how close excavation has to come to extract the item + //if excavation hits var/excavation_required exactly, it's contained find is extracted cleanly without the ore + var/prob_delicate = 90 //probability it requires an active suspension field to not insta-crumble + var/dissonance_spread = 1 //proportion of the tile that is affected by this find + //used in conjunction with analysis machines to determine correct suspension field type + +/datum/find/New(var/digsite, var/exc_req) + excavation_required = exc_req + find_type = get_random_find_type(digsite) + clearance_range = rand(4, 12) + dissonance_spread = rand(1500, 2500) / 100 + +/obj/item/weapon/ore/strangerock + name = "Strange rock" + desc = "Seems to have some unusal strata evident throughout it." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "strange" + origin_tech = list(TECH_MATERIAL = 5) + +/obj/item/weapon/ore/strangerock/New(loc, var/inside_item_type = 0) + ..(loc) + + if(inside_item_type) + new /obj/item/weapon/archaeological_find(src, new_item_type = inside_item_type) + +/obj/item/weapon/ore/strangerock/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/weapon/pickaxe/brush)) + var/obj/item/inside = locate() in src + if(inside) + inside.loc = get_turf(src) + visible_message("\The [src] is brushed away, revealing \the [inside].") + else + visible_message("\The [src] is brushed away into nothing.") + qdel(src) + return + + if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/W = I + if(W.isOn()) + if(W.get_fuel() >= 2) + var/obj/item/inside = locate() in src + if(inside) + inside.loc = get_turf(src) + visible_message("\The [src] burns away revealing \the [inside].") + else + visible_message("\The [src] burns away into nothing.") + qdel(src) + W.remove_fuel(2) + else + visible_message("A few sparks fly off \the [src], but nothing else happens.") + W.remove_fuel(1) + return + + else if(istype(I, /obj/item/device/core_sampler)) + var/obj/item/device/core_sampler/S = I + S.sample_item(src, user) + return + + ..() + + if(prob(33)) + src.visible_message("[src] crumbles away, leaving some dust and gravel behind.") + qdel(src) diff --git a/code/modules/xenoarcheaology/finds/finds_defines.dm b/code/modules/xenoarcheaology/finds/finds_defines.dm new file mode 100644 index 00000000000..060119c7ce7 --- /dev/null +++ b/code/modules/xenoarcheaology/finds/finds_defines.dm @@ -0,0 +1,116 @@ +var/global/list/responsive_carriers = list( + "carbon", + "potassium", + "hydrogen", + "nitrogen", + "mercury", + "iron", + "chlorine", + "phosphorus", + "phoron") + +var/global/list/finds_as_strings = list( + "Trace organic cells", + "Long exposure particles", + "Trace water particles", + "Crystalline structures", + "Metallic derivative", + "Metallic composite", + "Metamorphic/igneous rock composite", + "Metamorphic/sedimentary rock composite", + "Anomalous material") + +/proc/get_responsive_reagent(var/find_type) + switch(find_type) + if(ARCHAEO_BOWL, ARCHAEO_URN, ARCHAEO_CUTLERY, ARCHAEO_STATUETTE, ARCHAEO_INSTRUMENT, ARCHAEO_HANDCUFFS, ARCHAEO_BEARTRAP, ARCHAEO_LIGHTER, ARCHAEO_BOX, ARCHAEO_GASTANK, ARCHAEO_PEN, ARCHAEO_UNKNOWN) + return "mercury" + if(ARCHAEO_COIN, ARCHAEO_KNIFE, ARCHAEO_TOOL, ARCHAEO_METAL, ARCHAEO_CLAYMORE, ARCHAEO_RODS, ARCHAEO_KATANA, ARCHAEO_LASER, ARCHAEO_GUN) + return "iron" + if(ARCHAEO_CRYSTAL, ARCHAEO_SHARD, ARCHAEO_SOULSTONE) + return "nitrogen" + if(ARCHAEO_CULTBLADE, ARCHAEO_TELEBEACON, ARCHAEO_CULTROBES, ARCHAEO_STOCKPARTS) + return "potassium" + if(ARCHAEO_FOSSIL, ARCHAEO_SHELL, ARCHAEO_PLANT, ARCHAEO_REMAINS_HUMANOID, ARCHAEO_REMAINS_ROBOT, ARCHAEO_REMAINS_XENO, ARCHAEO_GASMASK) + return "carbon" + return "phoron" + +/proc/get_random_digsite_type() + return pick(100;DIGSITE_GARDEN, 95;DIGSITE_ANIMAL, 90;DIGSITE_HOUSE, 85;DIGSITE_TECHNICAL, 80;DIGSITE_TEMPLE, 75;DIGSITE_WAR) + +/proc/get_random_find_type(var/digsite) + . = 0 + switch(digsite) + if(DIGSITE_GARDEN) + . = pick( + 100;ARCHAEO_PLANT, + 25;ARCHAEO_SHELL, + 25;ARCHAEO_FOSSIL, + 5;ARCHAEO_BEARTRAP) + if(DIGSITE_ANIMAL) + . = pick( + 100;ARCHAEO_FOSSIL, + 50;ARCHAEO_SHELL, + 50;ARCHAEO_PLANT, + 25;ARCHAEO_BEARTRAP) + if(DIGSITE_HOUSE) + . = pick( + 100;ARCHAEO_BOWL, + 100;ARCHAEO_URN, + 100;ARCHAEO_CUTLERY, + 100;ARCHAEO_STATUETTE, + 100;ARCHAEO_INSTRUMENT, + 100;ARCHAEO_PEN, + 100;ARCHAEO_LIGHTER, + 100;ARCHAEO_BOX, + 75;ARCHAEO_GASMASK, + 75;ARCHAEO_COIN, + 75;ARCHAEO_UNKNOWN, + 50;ARCHAEO_SHARD, + 50;ARCHAEO_RODS, + 25;ARCHAEO_METAL) + if(DIGSITE_TECHNICAL) + . = pick( + 125;ARCHAEO_GASMASK, + 100;ARCHAEO_METAL, + 100;ARCHAEO_GASTANK, + 100;ARCHAEO_TELEBEACON, + 100;ARCHAEO_TOOL, + 100;ARCHAEO_STOCKPARTS, + 75;ARCHAEO_SHARD, + 75;ARCHAEO_RODS, + 75;ARCHAEO_UNKNOWN, + 50;ARCHAEO_HANDCUFFS, + 50;ARCHAEO_BEARTRAP) + if(DIGSITE_TEMPLE) + . = pick( + 200;ARCHAEO_CULTROBES, + 200;ARCHAEO_STATUETTE, + 100;ARCHAEO_URN, + 100;ARCHAEO_BOWL, + 100;ARCHAEO_KNIFE, + 100;ARCHAEO_CRYSTAL, + 75;ARCHAEO_CULTBLADE, + 50;ARCHAEO_SOULSTONE, + 50;ARCHAEO_UNKNOWN, + 25;ARCHAEO_HANDCUFFS, + 25;ARCHAEO_BEARTRAP, + 10;ARCHAEO_KATANA, + 10;ARCHAEO_CLAYMORE, + 10;ARCHAEO_SHARD, + 10;ARCHAEO_RODS, + 10;ARCHAEO_METAL, + 10;ARCHAEO_GASMASK) + if(DIGSITE_WAR) + . = pick( + 100;ARCHAEO_GUN, + 100;ARCHAEO_KNIFE, + 75;ARCHAEO_LASER, + 75;ARCHAEO_KATANA, + 75;ARCHAEO_CLAYMORE, + 50;ARCHAEO_UNKNOWN, + 50;ARCHAEO_CULTROBES, + 50;ARCHAEO_CULTBLADE, + 50;ARCHAEO_GASMASK, + 25;ARCHAEO_HANDCUFFS, + 25;ARCHAEO_BEARTRAP, + 25;ARCHAEO_TOOL) diff --git a/code/modules/research/xenoarchaeology/finds/finds_fossils.dm b/code/modules/xenoarcheaology/finds/fossils.dm similarity index 100% rename from code/modules/research/xenoarchaeology/finds/finds_fossils.dm rename to code/modules/xenoarcheaology/finds/fossils.dm diff --git a/code/modules/research/xenoarchaeology/finds/finds_misc.dm b/code/modules/xenoarcheaology/finds/misc.dm similarity index 97% rename from code/modules/research/xenoarchaeology/finds/finds_misc.dm rename to code/modules/xenoarcheaology/finds/misc.dm index 90afe5a737d..4037de5176a 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_misc.dm +++ b/code/modules/xenoarcheaology/finds/misc.dm @@ -1,33 +1,33 @@ - -// Phoron shards have been moved to code/game/objects/items/weapons/shards.dm - -//legacy crystal -/obj/machinery/crystal - name = "Crystal" - icon = 'icons/obj/mining.dmi' - icon_state = "crystal" - -/obj/machinery/crystal/New() - if(prob(50)) - icon_state = "crystal2" - -//large finds - /* - obj/machinery/syndicate_beacon - obj/machinery/wish_granter - if(18) - item_type = "jagged green crystal" - additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.") - icon_state = "crystal" - apply_material_decorations = 0 - if(prob(10)) - apply_image_decorations = 1 - if(19) - item_type = "jagged pink crystal" - additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.") - icon_state = "crystal2" - apply_material_decorations = 0 - if(prob(10)) - apply_image_decorations = 1 - */ - //machinery type artifacts? + +// Phoron shards have been moved to code/game/objects/items/weapons/shards.dm + +//legacy crystal +/obj/machinery/crystal + name = "Crystal" + icon = 'icons/obj/mining.dmi' + icon_state = "crystal" + +/obj/machinery/crystal/New() + if(prob(50)) + icon_state = "crystal2" + +//large finds + /* + obj/machinery/syndicate_beacon + obj/machinery/wish_granter + if(18) + item_type = "jagged green crystal" + additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.") + icon_state = "crystal" + apply_material_decorations = 0 + if(prob(10)) + apply_image_decorations = 1 + if(19) + item_type = "jagged pink crystal" + additional_desc = pick("It shines faintly as it catches the light.","It appears to have a faint inner glow.","It seems to draw you inward as you look it at.","Something twinkles faintly as you look at it.","It's mesmerizing to behold.") + icon_state = "crystal2" + apply_material_decorations = 0 + if(prob(10)) + apply_image_decorations = 1 + */ + //machinery type artifacts? diff --git a/code/modules/research/xenoarchaeology/finds/finds_special.dm b/code/modules/xenoarcheaology/finds/special.dm similarity index 100% rename from code/modules/research/xenoarchaeology/finds/finds_special.dm rename to code/modules/xenoarcheaology/finds/special.dm diff --git a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm b/code/modules/xenoarcheaology/finds/talking.dm similarity index 86% rename from code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm rename to code/modules/xenoarcheaology/finds/talking.dm index 69aaac47c0d..0baa9586dd8 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm +++ b/code/modules/xenoarcheaology/finds/talking.dm @@ -1,10 +1,3 @@ - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Formerly talking crystals - these procs are now modular so that you can make any /obj/item/weapon 'parrot' player speech back to them -// This could be extended to atoms, but it's bad enough as is -// I genuinely tried to Add and Remove them from var and proc lists, but just couldn't get it working - -//for easy reference /obj/var/datum/talking_atom/talking_atom /datum/talking_atom diff --git a/code/modules/research/xenoarchaeology/manuals.dm b/code/modules/xenoarcheaology/manuals.dm similarity index 100% rename from code/modules/research/xenoarchaeology/manuals.dm rename to code/modules/xenoarcheaology/manuals.dm diff --git a/code/modules/research/xenoarchaeology/master_controller.dm b/code/modules/xenoarcheaology/master_controller.dm similarity index 58% rename from code/modules/research/xenoarchaeology/master_controller.dm rename to code/modules/xenoarcheaology/master_controller.dm index 65f4b9f1fc0..a6689e36b6f 100644 --- a/code/modules/research/xenoarchaeology/master_controller.dm +++ b/code/modules/xenoarcheaology/master_controller.dm @@ -1,85 +1,95 @@ - -/datum/controller/game_controller - var/list/artifact_spawning_turfs = list() - var/list/digsite_spawning_turfs = list() - -#define XENOARCH_SPAWN_CHANCE 0.5 -#define DIGSITESIZE_LOWER 4 -#define DIGSITESIZE_UPPER 12 -#define ARTIFACTSPAWNNUM_LOWER 6 -#define ARTIFACTSPAWNNUM_UPPER 12 - -/datum/controller/game_controller/proc/SetupXenoarch() - //create digsites - for(var/turf/simulated/mineral/M in block(locate(1,1,1), locate(world.maxx, world.maxy, world.maxz))) - if(!(M.density)) - continue - - if(isnull(M.geologic_data)) - M.geologic_data = new/datum/geosample(M) - - if(!prob(XENOARCH_SPAWN_CHANCE)) - continue - - digsite_spawning_turfs.Add(M) - var/digsite = get_random_digsite_type() - var/target_digsite_size = rand(DIGSITESIZE_LOWER, DIGSITESIZE_UPPER) - var/list/processed_turfs = list() - var/list/turfs_to_process = list(M) - while(turfs_to_process.len) - var/turf/simulated/mineral/archeo_turf = pop(turfs_to_process) - - if(target_digsite_size > 1) - var/list/viable_adjacent_turfs = orange(1, archeo_turf) - for(var/turf/simulated/mineral/T in orange(1, archeo_turf)) - if(T.finds) - continue - if(T in processed_turfs) - continue - viable_adjacent_turfs.Add(T) - - for(var/turf/simulated/mineral/T in viable_adjacent_turfs) - if(prob(target_digsite_size/viable_adjacent_turfs.len)) - turfs_to_process.Add(T) - target_digsite_size -= 1 - if(target_digsite_size <= 0) - break - - processed_turfs.Add(archeo_turf) - if(isnull(archeo_turf.finds)) - archeo_turf.finds = list() - if(prob(50)) - archeo_turf.finds.Add(new /datum/find(digsite, rand(5,95))) - else if(prob(75)) - archeo_turf.finds.Add(new /datum/find(digsite, rand(5,45))) - archeo_turf.finds.Add(new /datum/find(digsite, rand(55,95))) - else - archeo_turf.finds.Add(new /datum/find(digsite, rand(5,30))) - archeo_turf.finds.Add(new /datum/find(digsite, rand(35,75))) - archeo_turf.finds.Add(new /datum/find(digsite, rand(75,95))) - - //sometimes a find will be close enough to the surface to show - var/datum/find/F = archeo_turf.finds[1] - if(F.excavation_required <= F.view_range) - archeo_turf.archaeo_overlay = "overlay_archaeo[rand(1,3)]" - archeo_turf.overlays += archeo_turf.archaeo_overlay - - //have a chance for an artifact to spawn here, but not in animal or plant digsites - if(isnull(M.artifact_find) && digsite != 1 && digsite != 2) - artifact_spawning_turfs.Add(archeo_turf) - - //create artifact machinery - var/num_artifacts_spawn = rand(ARTIFACTSPAWNNUM_LOWER, ARTIFACTSPAWNNUM_UPPER) - while(artifact_spawning_turfs.len > num_artifacts_spawn) - pick_n_take(artifact_spawning_turfs) - - var/list/artifacts_spawnturf_temp = artifact_spawning_turfs.Copy() - while(artifacts_spawnturf_temp.len > 0) - var/turf/simulated/mineral/artifact_turf = pop(artifacts_spawnturf_temp) - artifact_turf.artifact_find = new() - -#undef XENOARCH_SPAWN_CHANCE -#undef DIGSITESIZE_LOWER -#undef DIGSITESIZE_UPPER -#undef ARTIFACTSPAWNNUM_LOWER -#undef ARTIFACTSPAWNNUM_UPPER +/datum/controller/game_controller + var/list/artifact_spawning_turfs = list() + var/list/digsite_spawning_turfs = list() + +#define XENOARCH_SPAWN_CHANCE 0.5 +#define DIGSITESIZE_LOWER 4 +#define DIGSITESIZE_UPPER 12 +#define ARTIFACTSPAWNNUM_LOWER 6 +#define ARTIFACTSPAWNNUM_UPPER 12 + +/datum/controller/game_controller/proc/SetupXenoarch() + for(var/turf/simulated/mineral/M in world) + if(!M.density) + continue + + if(isnull(M.geologic_data)) + M.geologic_data = new /datum/geosample(M) + + if(!prob(XENOARCH_SPAWN_CHANCE)) + continue + + var/farEnough = 1 + for(var/A in digsite_spawning_turfs) + var/turf/T = A + if(T in range(5, M)) + farEnough = 0 + break + if(!farEnough) + continue + + digsite_spawning_turfs.Add(M) + + var/digsite = get_random_digsite_type() + var/target_digsite_size = rand(DIGSITESIZE_LOWER, DIGSITESIZE_UPPER) + + var/list/processed_turfs = list() + var/list/turfs_to_process = list(M) + + var/list/viable_adjacent_turfs = list() + if(target_digsite_size > 1) + for(var/turf/simulated/mineral/T in orange(2, M)) + if(!T.density) + continue + if(T.finds) + continue + if(T in processed_turfs) + continue + viable_adjacent_turfs.Add(T) + + target_digsite_size = min(target_digsite_size, viable_adjacent_turfs.len) + + for(var/i = 1 to target_digsite_size) + turfs_to_process += pick_n_take(viable_adjacent_turfs) + + while(turfs_to_process.len) + var/turf/simulated/mineral/archeo_turf = pop(turfs_to_process) + + processed_turfs.Add(archeo_turf) + if(isnull(archeo_turf.finds)) + archeo_turf.finds = list() + if(prob(50)) + archeo_turf.finds.Add(new /datum/find(digsite, rand(10, 190))) + else if(prob(75)) + archeo_turf.finds.Add(new /datum/find(digsite, rand(10, 90))) + archeo_turf.finds.Add(new /datum/find(digsite, rand(110, 190))) + else + archeo_turf.finds.Add(new /datum/find(digsite, rand(10, 50))) + archeo_turf.finds.Add(new /datum/find(digsite, rand(60, 140))) + archeo_turf.finds.Add(new /datum/find(digsite, rand(150, 190))) + + //sometimes a find will be close enough to the surface to show + var/datum/find/F = archeo_turf.finds[1] + if(F.excavation_required <= F.view_range) + archeo_turf.archaeo_overlay = "overlay_archaeo[rand(1,3)]" + archeo_turf.update_icon() + + //have a chance for an artifact to spawn here, but not in animal or plant digsites + if(isnull(M.artifact_find) && digsite != DIGSITE_GARDEN && digsite != DIGSITE_ANIMAL) + artifact_spawning_turfs.Add(archeo_turf) + + //create artifact machinery + var/num_artifacts_spawn = rand(ARTIFACTSPAWNNUM_LOWER, ARTIFACTSPAWNNUM_UPPER) + while(artifact_spawning_turfs.len > num_artifacts_spawn) + pick_n_take(artifact_spawning_turfs) + + var/list/artifacts_spawnturf_temp = artifact_spawning_turfs.Copy() + while(artifacts_spawnturf_temp.len > 0) + var/turf/simulated/mineral/artifact_turf = pop(artifacts_spawnturf_temp) + artifact_turf.artifact_find = new() + +#undef XENOARCH_SPAWN_CHANCE +#undef DIGSITESIZE_LOWER +#undef DIGSITESIZE_UPPER +#undef ARTIFACTSPAWNNUM_LOWER +#undef ARTIFACTSPAWNNUM_UPPER diff --git a/code/modules/research/xenoarchaeology/misc.dm b/code/modules/xenoarcheaology/misc.dm similarity index 68% rename from code/modules/research/xenoarchaeology/misc.dm rename to code/modules/xenoarcheaology/misc.dm index b2d8cef42c8..c85c89ee492 100644 --- a/code/modules/research/xenoarchaeology/misc.dm +++ b/code/modules/xenoarcheaology/misc.dm @@ -1,12 +1,8 @@ - -//---- Noticeboard - /obj/structure/noticeboard/anomaly notices = 5 icon_state = "nboard05" /obj/structure/noticeboard/anomaly/New() - //add some memos var/obj/item/weapon/paper/P = new() P.name = "Memo RE: proper analysis procedure" P.info = "
    We keep test dummies in pens here for a reason, so standard procedure should be to activate newfound alien artifacts and place the two in close proximity. Promising items I might even approve monkey testing on." @@ -42,22 +38,18 @@ P.overlays = list("paper_stamped_rd") src.contents += P -//---- Bookcase - /obj/structure/bookcase/manuals/xenoarchaeology name = "Xenoarchaeology Manuals bookcase" - New() - ..() - new /obj/item/weapon/book/manual/excavation(src) - new /obj/item/weapon/book/manual/mass_spectrometry(src) - new /obj/item/weapon/book/manual/materials_chemistry_analysis(src) - new /obj/item/weapon/book/manual/anomaly_testing(src) - new /obj/item/weapon/book/manual/anomaly_spectroscopy(src) - new /obj/item/weapon/book/manual/stasis(src) - update_icon() - -//---- Lockers and closets +/obj/structure/bookcase/manuals/xenoarchaeology/New() + ..() + new /obj/item/weapon/book/manual/excavation(src) + new /obj/item/weapon/book/manual/mass_spectrometry(src) + new /obj/item/weapon/book/manual/materials_chemistry_analysis(src) + new /obj/item/weapon/book/manual/anomaly_testing(src) + new /obj/item/weapon/book/manual/anomaly_spectroscopy(src) + new /obj/item/weapon/book/manual/stasis(src) + update_icon() /obj/structure/closet/secure_closet/xenoarchaeologist name = "Xenoarchaeologist Locker" @@ -69,17 +61,15 @@ icon_broken = "secureresbroken" icon_off = "secureresoff" - New() - ..() - sleep(2) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/suit/storage/toggle/labcoat(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/glasses/science(src) - new /obj/item/device/radio/headset/headset_sci(src) - new /obj/item/weapon/storage/belt/archaeology(src) - new /obj/item/weapon/storage/box/excavation(src) - return +/obj/structure/closet/secure_closet/xenoarchaeologist/New() + ..() + new /obj/item/clothing/under/rank/scientist(src) + new /obj/item/clothing/suit/storage/toggle/labcoat(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/clothing/glasses/science(src) + new /obj/item/device/radio/headset/headset_sci(src) + new /obj/item/weapon/storage/belt/archaeology(src) + new /obj/item/weapon/storage/excavation(src) /obj/structure/closet/excavation name = "Excavation tools" @@ -87,27 +77,23 @@ icon_closed = "toolcloset" icon_opened = "toolclosetopen" - New() - ..() - sleep(2) - new /obj/item/weapon/storage/belt/archaeology(src) - new /obj/item/weapon/storage/box/excavation(src) - new /obj/item/device/flashlight/lantern(src) - new /obj/item/device/ano_scanner(src) - new /obj/item/device/depth_scanner(src) - new /obj/item/device/core_sampler(src) - new /obj/item/device/gps(src) - new /obj/item/device/beacon_locator(src) - new /obj/item/device/radio/beacon(src) - new /obj/item/clothing/glasses/meson(src) - new /obj/item/weapon/pickaxe(src) - new /obj/item/device/measuring_tape(src) - new /obj/item/weapon/pickaxe/hand(src) - new /obj/item/weapon/storage/bag/fossils(src) - new /obj/item/weapon/hand_labeler(src) - return - -//---- Isolation room air alarms +/obj/structure/closet/excavation/New() + ..() + new /obj/item/weapon/storage/belt/archaeology(src) + new /obj/item/weapon/storage/excavation(src) + new /obj/item/device/flashlight/lantern(src) + new /obj/item/device/ano_scanner(src) + new /obj/item/device/depth_scanner(src) + new /obj/item/device/core_sampler(src) + new /obj/item/device/gps(src) + new /obj/item/device/beacon_locator(src) + new /obj/item/device/radio/beacon(src) + new /obj/item/clothing/glasses/meson(src) + new /obj/item/weapon/pickaxe(src) + new /obj/item/device/measuring_tape(src) + new /obj/item/weapon/pickaxe/hand(src) + new /obj/item/weapon/storage/bag/fossils(src) + new /obj/item/weapon/hand_labeler(src) /obj/machinery/alarm/isolation req_one_access = list(access_research, access_atmospherics, access_engine_equip) diff --git a/code/modules/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm new file mode 100644 index 00000000000..fa0d54a9a77 --- /dev/null +++ b/code/modules/xenoarcheaology/sampling.dm @@ -0,0 +1,165 @@ +/obj/item/weapon/rocksliver + name = "rock sliver" + desc = "It looks extremely delicate." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "sliver1" + w_class = 1 + sharp = 1 + var/datum/geosample/geological_data + +/obj/item/weapon/rocksliver/New() + icon_state = "sliver[rand(1, 3)]" + pixel_x = rand(-8, 8) + pixel_y = rand(-8 ,0) + +/datum/geosample + var/age = 0 + var/age_thousand = 0 + var/age_million = 0 + var/age_billion = 0 + var/artifact_id = "" + var/artifact_distance = -1 + var/source_mineral = "chlorine" + var/list/find_presence = list() + +/datum/geosample/New(var/turf/simulated/mineral/container) + UpdateTurf(container) + +/datum/geosample/proc/UpdateTurf(var/turf/simulated/mineral/container) + if(!istype(container)) + return + + age = rand(1, 999) + + if(container.mineral) + if(islist(container.mineral.xarch_ages)) + var/list/ages = container.mineral.xarch_ages + if(ages["thousand"]) + age_thousand = rand(1, ages["thousand"]) + if(ages["million"]) + age_million = rand(1, ages["million"]) + if(ages["billion"]) + if(ages["billion_lower"]) + age_billion = rand(ages["billion_lower"], ages["billion"]) + else + age_billion = rand(1, ages["billion"]) + if(container.mineral.xarch_source_mineral) + source_mineral = container.mineral.xarch_source_mineral + + if(prob(75)) + find_presence["phosphorus"] = rand(1, 500) / 100 + if(prob(25)) + find_presence["mercury"] = rand(1, 500) / 100 + find_presence["chlorine"] = rand(500, 2500) / 100 + + for(var/datum/find/F in container.finds) + var/responsive_reagent = get_responsive_reagent(F.find_type) + find_presence[responsive_reagent] = F.dissonance_spread + + var/total_presence = 0 + for(var/carrier in find_presence) + total_presence += find_presence[carrier] + for(var/carrier in find_presence) + find_presence[carrier] = find_presence[carrier] / total_presence + +/datum/geosample/proc/UpdateNearbyArtifactInfo(var/turf/simulated/mineral/container) + if(!container || !istype(container)) + return + + if(container.artifact_find) + artifact_distance = rand() + artifact_id = container.artifact_find.artifact_id + else + if(master_controller) //Sanity check due to runtimes ~Z + for(var/turf/simulated/mineral/T in master_controller.artifact_spawning_turfs) + if(T.artifact_find) + var/cur_dist = get_dist(container, T) * 2 + if( (artifact_distance < 0 || cur_dist < artifact_distance)) + artifact_distance = cur_dist + rand() * 2 - 1 + artifact_id = T.artifact_find.artifact_id + else + master_controller.artifact_spawning_turfs.Remove(T) + +/obj/item/device/core_sampler + name = "core sampler" + desc = "Used to extract geological core samples." + icon = 'icons/obj/device.dmi' + icon_state = "sampler0" + item_state = "screwdriver_brown" + w_class = 1 + + var/sampled_turf = "" + var/num_stored_bags = 10 + var/obj/item/weapon/evidencebag/filled_bag + +/obj/item/device/core_sampler/examine(var/mob/user) + if(..(user, 2)) + user << "Used to extract geological core samples - this one is [sampled_turf ? "full" : "empty"], and has [num_stored_bags] bag[num_stored_bags != 1 ? "s" : ""] remaining." + +/obj/item/device/core_sampler/attackby(var/obj/item/I, var/mob/living/user) + if(istype(I, /obj/item/weapon/evidencebag)) + if(I.contents.len) + user << "\The [I] is full." + return + if(num_stored_bags < 10) + qdel(I) + num_stored_bags += 1 + user << "You insert \the [I] into \the [src]." + else + user << "\The [src] can not fit any more bags." + else + return ..() + +/obj/item/device/core_sampler/proc/sample_item(var/item_to_sample, var/mob/user) + var/datum/geosample/geo_data + + if(istype(item_to_sample, /turf/simulated/mineral)) + var/turf/simulated/mineral/T = item_to_sample + T.geologic_data.UpdateNearbyArtifactInfo(T) + geo_data = T.geologic_data + else if(istype(item_to_sample, /obj/item/weapon/ore)) + var/obj/item/weapon/ore/O = item_to_sample + geo_data = O.geologic_data + + if(geo_data) + if(filled_bag) + user << "The core sampler is full." + else if(num_stored_bags < 1) + user << "The core sampler is out of sample bags." + else + //create a new sample bag which we'll fill with rock samples + filled_bag = new /obj/item/weapon/evidencebag(src) + filled_bag.name = "sample bag" + filled_bag.desc = "a bag for holding research samples." + + icon_state = "sampler1" + --num_stored_bags + + //put in a rock sliver + var/obj/item/weapon/rocksliver/R = new(filled_bag) + R.geological_data = geo_data + + //update the sample bag + filled_bag.icon_state = "evidence" + var/image/I = image("icon"=R, "layer"=FLOAT_LAYER) + filled_bag.overlays += I + filled_bag.overlays += "evidence" + filled_bag.w_class = 1 + + user << "You take a core sample of the [item_to_sample]." + else + user << "You are unable to take a sample of [item_to_sample]." + +/obj/item/device/core_sampler/attack_self(var/mob/living/user) + if(filled_bag) + user << "You eject the full sample bag." + var/success = 0 + if(istype(src.loc, /mob)) + var/mob/M = src.loc + success = M.put_in_inactive_hand(filled_bag) + if(!success) + filled_bag.loc = get_turf(src) + filled_bag = null + icon_state = "sampler0" + else + user << "The core sampler is empty." diff --git a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm similarity index 98% rename from code/modules/research/xenoarchaeology/tools/ano_device_battery.dm rename to code/modules/xenoarcheaology/tools/ano_device_battery.dm index fc50c956e74..85376724ea1 100644 --- a/code/modules/research/xenoarchaeology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -1,4 +1,3 @@ - /obj/item/weapon/anobattery name = "Anomaly power battery" icon = 'icons/obj/xenoarchaeology.dmi' @@ -210,6 +209,6 @@ M.lastattacker = user if(inserted_battery.battery_effect) - user.attack_log += "\[[time_stamp()]\] Tapped [M.name] ([M.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])" - M.attack_log += "\[[time_stamp()]\] Tapped by [user.name] ([user.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])" - msg_admin_attack("[key_name(user)] tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.effecttype])" ) + user.attack_log += "\[[time_stamp()]\] Tapped [M.name] ([M.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.name])" + M.attack_log += "\[[time_stamp()]\] Tapped by [user.name] ([user.ckey]) with [name] (EFFECT: [inserted_battery.battery_effect.name])" + msg_admin_attack("[key_name(user)] tapped [key_name(M)] with [name] (EFFECT: [inserted_battery.battery_effect.name])" ) diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm new file mode 100644 index 00000000000..553b6674dff --- /dev/null +++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm @@ -0,0 +1,157 @@ +/obj/machinery/artifact_analyser + name = "Anomaly Analyser" + desc = "Studies the emissions of anomalous materials to discover their uses." + icon = 'icons/obj/virology.dmi' + icon_state = "isolator" + anchored = 1 + density = 1 + var/scan_in_progress = 0 + var/scan_num = 0 + var/obj/scanned_obj + var/obj/machinery/artifact_scanpad/owned_scanner = null + var/scan_completion_time = 0 + var/scan_duration = 50 + var/obj/scanned_object + var/report_num = 0 + +/obj/machinery/artifact_analyser/initialize() + ..() + reconnect_scanner() + +/obj/machinery/artifact_analyser/proc/reconnect_scanner() + //connect to a nearby scanner pad + owned_scanner = locate(/obj/machinery/artifact_scanpad) in get_step(src, dir) + if(!owned_scanner) + owned_scanner = locate(/obj/machinery/artifact_scanpad) in orange(1, src) + +/obj/machinery/artifact_analyser/attack_hand(var/mob/user as mob) + src.add_fingerprint(user) + interact(user) + +/obj/machinery/artifact_analyser/interact(mob/user) + if(stat & (NOPOWER|BROKEN) || get_dist(src, user) > 1) + user.unset_machine(src) + return + + var/dat = "Anomalous material analyser
    " + dat += "
    " + if(!owned_scanner) + reconnect_scanner() + + if(!owned_scanner) + dat += "Unable to locate analysis pad.
    " + else if(scan_in_progress) + dat += "Please wait. Analysis in progress.
    " + dat += "Halt scanning.
    " + else + dat += "Scanner is ready.
    " + dat += "Begin scanning.
    " + + dat += "
    " + dat += "
    " + dat += "Refresh Close" + user << browse(dat, "window=artanalyser;size=450x500") + user.set_machine(src) + onclose(user, "artanalyser") + +/obj/machinery/artifact_analyser/process() + if(scan_in_progress && world.time > scan_completion_time) + scan_in_progress = 0 + updateDialog() + + var/results = "" + if(!owned_scanner) + reconnect_scanner() + if(!owned_scanner) + results = "Error communicating with scanner." + else if(!scanned_object || scanned_object.loc != owned_scanner.loc) + results = "Unable to locate scanned object. Ensure it was not moved in the process." + else + results = get_scan_info(scanned_object) + + src.visible_message("[name] states, \"Scanning complete.\"") + var/obj/item/weapon/paper/P = new(src.loc) + P.name = "[src] report #[++report_num]" + P.info = "[src] analysis report #[report_num]
    " + P.info += "
    " + P.info += "\icon[scanned_object] [results]" + P.stamped = list(/obj/item/weapon/stamp) + P.overlays = list("paper_stamped") + + if(scanned_object && istype(scanned_object, /obj/machinery/artifact)) + var/obj/machinery/artifact/A = scanned_object + A.anchored = 0 + A.being_used = 0 + scanned_object = null + +/obj/machinery/artifact_analyser/Topic(href, href_list) + if(href_list["begin_scan"]) + if(!owned_scanner) + reconnect_scanner() + if(owned_scanner) + var/artifact_in_use = 0 + for(var/obj/O in owned_scanner.loc) + if(O == owned_scanner) + continue + if(O.invisibility) + continue + if(istype(O, /obj/machinery/artifact)) + var/obj/machinery/artifact/A = O + if(A.being_used) + artifact_in_use = 1 + else + A.anchored = 1 + A.being_used = 1 + + if(artifact_in_use) + src.visible_message("[name] states, \"Cannot scan. Too much interference.\"") + else + scanned_object = O + scan_in_progress = 1 + scan_completion_time = world.time + scan_duration + src.visible_message("[name] states, \"Scanning begun.\"") + break + if(!scanned_object) + src.visible_message("[name] states, \"Unable to isolate scan target.\"") + if(href_list["halt_scan"]) + scan_in_progress = 0 + src.visible_message("[name] states, \"Scanning halted.\"") + + if(href_list["close"]) + usr.unset_machine(src) + usr << browse(null, "window=artanalyser") + + ..() + updateDialog() + +//hardcoded responses, oh well +/obj/machinery/artifact_analyser/proc/get_scan_info(var/obj/scanned_obj) + switch(scanned_obj.type) + if(/obj/machinery/auto_cloner) + return "Automated cloning pod - appears to rely on an artificial ecosystem formed by semi-organic nanomachines and the contained liquid.
    The liquid resembles protoplasmic residue supportive of unicellular organism developmental conditions.
    The structure is composed of a titanium alloy." + if(/obj/machinery/power/supermatter) + return "Superdense phoron clump - appears to have been shaped or hewn, structure is composed of matter aproximately 20 times denser than ordinary refined phoron." + if(/obj/structure/constructshell) + return "Tribal idol - subject resembles statues/emblems built by superstitious pre-warp civilisations to honour their gods. Material appears to be a rock/plastcrete composite." + if(/obj/machinery/giga_drill) + return "Automated mining drill - structure composed of titanium-carbide alloy, with tip and drill lines edged in an alloy of diamond and phoron." + if(/obj/structure/cult/pylon) + return "Tribal pylon - subject resembles statues/emblems built by cargo cult civilisations to honour energy systems from post-warp civilisations." + if(/obj/machinery/replicator) + return "Automated construction unit - subject appears to be able to synthesize various objects given a material, some with simple internal circuitry. Method unknown." + if(/obj/structure/crystal) + return "Crystal formation - pseudo-organic crystalline matrix, unlikely to have formed naturally. No known technology exists to synthesize this exact composition." + if(/obj/machinery/artifact) + var/obj/machinery/artifact/A = scanned_obj + var/out = "Anomalous alien device - composed of an unknown alloy.

    " + + if(A.my_effect) + out += A.my_effect.getDescription() + + if(A.secondary_effect && A.secondary_effect.activated) + out += "

    Internal scans indicate ongoing secondary activity operating independently from primary systems.

    " + out += A.secondary_effect.getDescription() + + return out + else + return "[scanned_obj.name] - mundane application." diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm similarity index 99% rename from code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm rename to code/modules/xenoarcheaology/tools/artifact_harvester.dm index 912d0a062e4..23ff59799e1 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_harvester.dm +++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm @@ -1,4 +1,3 @@ - /obj/machinery/artifact_harvester name = "Exotic Particle Harvester" icon = 'icons/obj/virology.dmi' diff --git a/code/modules/research/xenoarchaeology/machinery/artifact_scanner.dm b/code/modules/xenoarcheaology/tools/artifact_scanner.dm similarity index 99% rename from code/modules/research/xenoarchaeology/machinery/artifact_scanner.dm rename to code/modules/xenoarcheaology/tools/artifact_scanner.dm index 3d440bf85ab..c5bdfe015ab 100644 --- a/code/modules/research/xenoarchaeology/machinery/artifact_scanner.dm +++ b/code/modules/xenoarcheaology/tools/artifact_scanner.dm @@ -1,4 +1,3 @@ - /obj/machinery/artifact_scanpad name = "Anomaly Scanner Pad" desc = "Place things here for scanning." diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/xenoarcheaology/tools/coolant_tank.dm similarity index 81% rename from code/modules/research/xenoarchaeology/machinery/coolant.dm rename to code/modules/xenoarcheaology/tools/coolant_tank.dm index ad44c7d2ced..1ee02211cff 100644 --- a/code/modules/research/xenoarchaeology/machinery/coolant.dm +++ b/code/modules/xenoarcheaology/tools/coolant_tank.dm @@ -1,16 +1,17 @@ /obj/structure/reagent_dispensers/coolanttank name = "coolant tank" - desc = "A tank of industrial coolant." + desc = "A tank of industrial coolant" icon = 'icons/obj/objects.dmi' icon_state = "coolanttank" amount_per_transfer_from_this = 10 - New() - ..() - reagents.add_reagent("coolant",1000) + +/obj/structure/reagent_dispensers/coolanttank/New() + ..() + reagents.add_reagent("coolant", 1000) /obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj) if(Proj.get_structure_damage()) - if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) + if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) // TODO: make this not terrible explode() /obj/structure/reagent_dispensers/coolanttank/ex_act() @@ -18,7 +19,6 @@ /obj/structure/reagent_dispensers/coolanttank/proc/explode() var/datum/effect/effect/system/smoke_spread/S = new /datum/effect/effect/system/smoke_spread - //S.attach(src) S.set_up(5, 0, src.loc) playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) diff --git a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm b/code/modules/xenoarcheaology/tools/equipment.dm similarity index 77% rename from code/modules/research/xenoarchaeology/tools/anomaly_suit.dm rename to code/modules/xenoarcheaology/tools/equipment.dm index f6bbeed769a..2913c1bbac1 100644 --- a/code/modules/research/xenoarchaeology/tools/anomaly_suit.dm +++ b/code/modules/xenoarcheaology/tools/equipment.dm @@ -1,21 +1,22 @@ - -//changes: rad protection up to 100 from 20/50 respectively /obj/item/clothing/suit/bio_suit/anomaly name = "Anomaly suit" desc = "A sealed bio suit capable of insulating against exotic alien energies." icon_state = "engspace_suit" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100) + item_state = "engspace_suit" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) /obj/item/clothing/head/bio_hood/anomaly name = "Anomaly hood" desc = "A sealed bio hood capable of insulating against exotic alien energies." icon_state = "engspace_helmet" - armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100) + item_state = "engspace_helmet" + armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 100, rad = 100) /obj/item/clothing/suit/space/anomaly name = "Excavation suit" desc = "A pressure resistant excavation suit partially capable of insulating against exotic alien energies." icon_state = "cespace_suit" + item_state = "cespace_suit" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit) @@ -23,4 +24,5 @@ name = "Excavation hood" desc = "A pressure resistant excavation hood partially capable of insulating against exotic alien energies." icon_state = "cespace_helmet" + item_state = "cespace_helmet" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 100) diff --git a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm similarity index 96% rename from code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm rename to code/modules/xenoarcheaology/tools/geosample_scanner.dm index ed23b965dfe..9d6450a839b 100644 --- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -1,4 +1,3 @@ - /obj/machinery/radiocarbon_spectrometer name = "radiocarbon spectrometer" desc = "A specialised, complex scanner for gleaning information on all manner of small things." @@ -76,19 +75,20 @@ scanner_seal_integrity = round(scanner_seal_integrity + amount_used * 10) return if(istype(I, /obj/item/weapon/reagent_containers/glass)) + var/obj/item/weapon/reagent_containers/glass/G = I + if(!G.is_open_container()) + return var/choice = alert("What do you want to do with the container?","Radiometric Scanner","Add coolant","Empty coolant","Scan container") if(choice == "Add coolant") - var/obj/item/weapon/reagent_containers/glass/G = I var/amount_transferred = min(src.reagents.maximum_volume - src.reagents.total_volume, G.reagents.total_volume) - G.reagents.trans_to(src, amount_transferred) - user << "You empty [amount_transferred]u of coolant into [src]." + var/trans = G.reagents.trans_to_obj(src, amount_transferred) + user << "You empty [trans ? trans : 0]u of coolant into [src]." update_coolant() return else if(choice == "Empty coolant") - var/obj/item/weapon/reagent_containers/glass/G = I var/amount_transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, src.reagents.total_volume) - src.reagents.trans_to(G, amount_transferred) - user << "You remove [amount_transferred]u of coolant from [src]." + var/trans = src.reagents.trans_to(G, amount_transferred) + user << "You remove [trans ? trans : 0]u of coolant from [src]." update_coolant() return if(scanned_item) @@ -148,15 +148,15 @@ data["radiation"] = round(radiation) data["t_left_radspike"] = round(t_left_radspike) data["rad_shield_on"] = rad_shield - + // update the ui if it exists, returns null if no ui is passed/found - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) 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, "geoscanner.tmpl", "High Res Radiocarbon Spectrometer", 900, 825) // when the ui is first opened this is the data it will use - ui.set_initial_data(data) + ui.set_initial_data(data) // open the new ui window ui.open() // auto update every Master Controller tick diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm similarity index 62% rename from code/modules/research/xenoarchaeology/tools/suspension_generator.dm rename to code/modules/xenoarcheaology/tools/suspension_generator.dm index 6b77e800eb3..c68d06a1ba6 100644 --- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm +++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm @@ -8,54 +8,34 @@ var/obj/item/weapon/cell/cell var/obj/item/weapon/card/id/auth_card var/locked = 1 - var/open = 0 - var/screwed = 1 - var/field_type = "" - var/power_use = 25 + var/power_use = 5 var/obj/effect/suspension_field/suspension_field - var/list/secured_mobs = list() /obj/machinery/suspension_gen/New() - src.cell = new/obj/item/weapon/cell/high(src) ..() + src.cell = new /obj/item/weapon/cell/high(src) /obj/machinery/suspension_gen/process() - set background = 1 - - if (suspension_field) + if(suspension_field) cell.charge -= power_use var/turf/T = get_turf(suspension_field) - if(field_type == "carbon") - for(var/mob/living/carbon/M in T) - M.weakened = max(M.weakened, 3) - cell.charge -= power_use - if(prob(5)) - M << "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]" - - if(field_type == "iron") - for(var/mob/living/silicon/M in T) - M.weakened = max(M.weakened, 3) - cell.charge -= power_use - if(prob(5)) - M << "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]" + for(var/mob/living/M in T) + M.weakened = max(M.weakened, 3) + cell.charge -= power_use + if(prob(5)) + M << "[pick("You feel tingly","You feel like floating","It is hard to speak","You can barely move")]." for(var/obj/item/I in T) if(!suspension_field.contents.len) suspension_field.icon_state = "energynet" suspension_field.overlays += "shield2" - I.loc = suspension_field - - for(var/mob/living/simple_animal/M in T) - M.weakened = max(M.weakened, 3) - cell.charge -= power_use - if(prob(5)) - M << "\blue [pick("You feel tingly.","You feel like floating.","It is hard to speak.","You can barely move.")]" + I.forceMove(suspension_field) if(cell.charge <= 0) deactivate() -/obj/machinery/suspension_gen/interact(mob/user as mob) +/obj/machinery/suspension_gen/interact(var/mob/user) var/dat = "Multi-phase mobile suspension field generator MK II \"Steadfast\"
    " if(cell) var/colour = "red" @@ -80,25 +60,6 @@ dat += "Enter your ID to begin.
    " dat += "
    " - if(!locked) - dat += "Select field mode
    " - dat += "[field_type=="carbon"?"":"" ]Diffracted carbon dioxide laser
    " - dat += "[field_type=="nitrogen"?"":"" ]Nitrogen tracer field
    " - dat += "[field_type=="potassium"?"":"" ]Potassium refrigerant cloud
    " - dat += "[field_type=="mercury"?"":"" ]Mercury dispersion wave
    " - dat += "[field_type=="iron"?"":"" ]Iron wafer conduction field
    " - dat += "[field_type=="calcium"?"":"" ]Calcium binary deoxidiser
    " - dat += "[field_type=="phoron"?"":"" ]Chlorine diffusion emissions
    " - dat += "[field_type=="phoron"?"":"" ]Phoron saturated field
    " - else - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " - dat += "
    " dat += "
    " dat += "Always wear safety gear and consult a field manual before operation.
    " if(!locked) @@ -123,8 +84,6 @@ usr << "You are unable to activate [src] until it is properly secured on the ground." else deactivate() - if(href_list["select_field"]) - field_type = href_list["select_field"] else if(href_list["insertcard"]) var/obj/item/I = usr.get_active_hand() if (istype(I, /obj/item/weapon/card)) @@ -153,8 +112,8 @@ updateUsrDialog() -/obj/machinery/suspension_gen/attack_hand(mob/user as mob) - if(!open) +/obj/machinery/suspension_gen/attack_hand(var/mob/user) + if(!panel_open) interact(user) else if(cell) cell.loc = loc @@ -166,29 +125,8 @@ user << "You remove the power cell" /obj/machinery/suspension_gen/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/screwdriver)) - if(!open) - if(screwed) - screwed = 0 - else - screwed = 1 - user << "You [screwed ? "screw" : "unscrew"] the battery panel." - else if (istype(W, /obj/item/weapon/crowbar)) - if(!locked) - if(!screwed) - if(!suspension_field) - if(open) - open = 0 - else - open = 1 - user << "You crowbar the battery panel [open ? "open" : "in place"]." - icon_state = "suspension[open ? (cell ? "1" : "0") : "2"]" - else - user << "[src]'s safety locks are engaged, shut it down first." - else - user << "Unscrew [src]'s battery panel first." - else - user << "[src]'s security locks are engaged." + if(!locked && !suspension_field && default_deconstruction_screwdriver(user, W)) + return else if (istype(W, /obj/item/weapon/wrench)) if(!suspension_field) if(anchored) @@ -203,7 +141,7 @@ else user << "You are unable to secure [src] while it is active!" else if (istype(W, /obj/item/weapon/cell)) - if(open) + if(panel_open) if(cell) user << "There is a power cell already installed." else @@ -223,7 +161,7 @@ user << "Remove [auth_card] first." /obj/machinery/suspension_gen/proc/attempt_unlock(var/obj/item/weapon/card/C, var/mob/user) - if(!open) + if(!panel_open) if(istype(C, /obj/item/weapon/card/emag)) C.resolve_attackby(src, user) else if(istype(C, /obj/item/weapon/card/id) && check_access(C)) @@ -238,50 +176,14 @@ //checks for whether the machine can be activated or not should already have occurred by this point /obj/machinery/suspension_gen/proc/activate() - //depending on the field type, we might pickup certain items var/turf/T = get_turf(get_step(src,dir)) - var/success = 0 var/collected = 0 - switch(field_type) - if("carbon") - success = 1 - for(var/mob/living/carbon/C in T) - C.weakened += 5 - C.visible_message("\blue \icon[C] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.") - if("nitrogen") - success = 1 - // - if("mercury") - success = 1 - // - if("chlorine") - success = 1 - // - if("potassium") - success = 1 - // - if("phoron") - success = 1 - // - if("calcium") - success = 1 - // - if("iron") - success = 1 - for(var/mob/living/silicon/R in T) - R.weakened += 5 - R.visible_message("\blue \icon[R] [R] begins to float in the air!","You feel tingly and light, but it is difficult to move.") - // - //in case we have a bad field type - if(!success) - return - for(var/mob/living/simple_animal/C in T) - C.visible_message("\blue \icon[C] [C] begins to float in the air!","You feel tingly and light, but it is difficult to move.") - C.weakened += 5 + for(var/mob/living/M in T) + M.weakened += 5 + M.visible_message("\blue \icon[M] [M] begins to float in the air!","You feel tingly and light, but it is difficult to move.") suspension_field = new(T) - suspension_field.field_type = field_type src.visible_message("\blue \icon[src] [src] activates with a low hum.") icon_state = "suspension3" @@ -303,16 +205,16 @@ //drop anything we picked up var/turf/T = get_turf(suspension_field) - for(var/mob/M in T) + for(var/mob/living/M in T) M << "You no longer feel like floating." M.weakened = min(M.weakened, 3) src.visible_message("\blue \icon[src] [src] deactivates with a gentle shudder.") qdel(suspension_field) + suspension_field = null icon_state = "suspension2" /obj/machinery/suspension_gen/Destroy() - //safety checks: clear the field and drop anything it's holding deactivate() ..() @@ -341,9 +243,8 @@ icon = 'icons/effects/effects.dmi' anchored = 1 density = 1 - var/field_type = "chlorine" /obj/effect/suspension_field/Destroy() - for(var/obj/I in src) + for(var/atom/movable/I in src) I.loc = src.loc ..() diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm new file mode 100644 index 00000000000..42b8e692ec3 --- /dev/null +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -0,0 +1,316 @@ +/obj/item/device/gps + name = "relay positioning device" + desc = "Triangulates the approximate co-ordinates using a nearby satellite network." + icon = 'icons/obj/device.dmi' + icon_state = "locator" + item_state = "locator" + w_class = 2 + +/obj/item/device/gps/attack_self(var/mob/user as mob) + var/turf/T = get_turf(src) + user << "\icon[src] \The [src] flashes [T.x]:[T.y]:[T.z]." + +/obj/item/device/measuring_tape + name = "measuring tape" + desc = "A coiled metallic tape used to check dimensions and lengths." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "measuring" + w_class = 2 + +/obj/item/weapon/storage/bag/fossils + name = "Fossil Satchel" + desc = "Transports delicate fossils in suspension so they don't break during transit." + icon = 'icons/obj/mining.dmi' + icon_state = "satchel" + slot_flags = SLOT_BELT | SLOT_POCKET + w_class = 3 + storage_slots = 50 + max_storage_space = 200 + max_w_class = 3 + can_hold = list(/obj/item/weapon/fossil) + +/obj/item/weapon/storage/box/samplebags + name = "sample bag box" + desc = "A box claiming to contain sample bags." + +/obj/item/weapon/storage/box/samplebags/New() + ..() + for(var/i = 1 to 7) + var/obj/item/weapon/evidencebag/S = new(src) + S.name = "sample bag" + S.desc = "a bag for holding research samples." + +/obj/item/device/ano_scanner + name = "Alden-Saraspova counter" + desc = "Aids in triangulation of exotic particles." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "flashgun" + item_state = "lampgreen" + w_class = 2.0 + slot_flags = SLOT_BELT + + var/last_scan_time = 0 + var/scan_delay = 25 + +/obj/item/device/ano_scanner/attack_self(var/mob/living/user) + interact(user) + +/obj/item/device/ano_scanner/interact(var/mob/living/user) + if(world.time - last_scan_time >= scan_delay) + last_scan_time = world.time + + var/nearestTargetDist = -1 + var/nearestTargetId + + var/nearestSimpleTargetDist = -1 + var/turf/cur_turf = get_turf(src) + + if(master_controller) //Sanity check due to runtimes ~Z + for(var/A in master_controller.artifact_spawning_turfs) + var/turf/simulated/mineral/T = A + if(T.density && T.artifact_find) + if(T.z == cur_turf.z) + var/cur_dist = get_dist(cur_turf, T) * 2 + if(nearestTargetDist < 0 || cur_dist < nearestTargetDist) + nearestTargetDist = cur_dist + rand() * 2 - 1 + nearestTargetId = T.artifact_find.artifact_id + else + master_controller.artifact_spawning_turfs.Remove(T) + + for(var/A in master_controller.digsite_spawning_turfs) + var/turf/simulated/mineral/T = A + if(T.density && T.finds && T.finds.len) + if(T.z == cur_turf.z) + var/cur_dist = get_dist(cur_turf, T) * 2 + if(nearestSimpleTargetDist < 0 || cur_dist < nearestSimpleTargetDist) + nearestSimpleTargetDist = cur_dist + rand() * 2 - 1 + else + master_controller.digsite_spawning_turfs.Remove(T) + + if(nearestTargetDist >= 0) + user << "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]" + else if(nearestSimpleTargetDist >= 0) + user << "Small anomaly detected in a radius of [nearestSimpleTargetDist]m." + else + user << "Background radiation levels detected." + else + user << "Scanning array is recharging." + +/obj/item/device/depth_scanner + name = "depth analysis scanner" + desc = "Used to check spatial depth and density of rock outcroppings." + icon = 'icons/obj/pda.dmi' + icon_state = "crap" + item_state = "analyzer" + w_class = 2 + slot_flags = SLOT_BELT + var/list/positive_locations = list() + var/datum/depth_scan/current + +/datum/depth_scan + var/time = "" + var/coords = "" + var/depth = "" + var/clearance = 0 + var/record_index = 1 + var/dissonance_spread = 1 + var/material = "unknown" + +/obj/item/device/depth_scanner/proc/scan_atom(var/mob/user, var/atom/A) + user.visible_message("\The [user] scans \the [A], the air around them humming gently.") + + if(istype(A, /turf/simulated/mineral)) + var/turf/simulated/mineral/M = A + if((M.finds && M.finds.len) || M.artifact_find) + + //create a new scanlog entry + var/datum/depth_scan/D = new() + D.coords = "[M.x]:[M.y]:[M.z]" + D.time = stationtime2text() + D.record_index = positive_locations.len + 1 + D.material = M.mineral ? M.mineral.display_name : "Rock" + + //find the first artifact and store it + if(M.finds.len) + var/datum/find/F = M.finds[1] + D.depth = "[F.excavation_required - F.clearance_range] - [F.excavation_required]" + D.clearance = F.clearance_range + D.material = get_responsive_reagent(F.find_type) + + positive_locations.Add(D) + + user << "\icon[src] [src] pings." + + else if(istype(A, /obj/structure/boulder)) + var/obj/structure/boulder/B = A + if(B.artifact_find) + //create a new scanlog entry + var/datum/depth_scan/D = new() + D.coords = "[B.x]:[B.y]:[B.z]" + D.time = stationtime2text() + D.record_index = positive_locations.len + 1 + + //these values are arbitrary + D.depth = rand(150, 200) + D.clearance = rand(10, 50) + D.dissonance_spread = rand(750, 2500) / 100 + + positive_locations.Add(D) + + user << "\icon[src] [src] pings [pick("madly","wildly","excitedly","crazily")]!" + +/obj/item/device/depth_scanner/attack_self(var/mob/living/user) + interact(user) + +/obj/item/device/depth_scanner/interact(var/mob/user as mob) + var/dat = "Coordinates with positive matches
    " + + dat += "== Clear all ==
    " + + if(current) + dat += "Time: [current.time]
    " + dat += "Coords: [current.coords]
    " + dat += "Anomaly depth: [current.depth] cm
    " + dat += "Anomaly size: [current.clearance] cm
    " + dat += "Dissonance spread: [current.dissonance_spread]
    " + var/index = responsive_carriers.Find(current.material) + if(index > 0 && index <= finds_as_strings.len) + dat += "Anomaly material: [finds_as_strings[index]]
    " + else + dat += "Anomaly material: Unknown
    " + dat += "clear entry
    " + else + dat += "Select an entry from the list
    " + dat += "



    " + dat += "
    " + if(positive_locations.len) + for(var/index = 1 to positive_locations.len) + var/datum/depth_scan/D = positive_locations[index] + dat += "[D.time], coords: [D.coords]
    " + else + dat += "No entries recorded." + + dat += "
    " + dat += "Refresh
    " + dat += "Close
    " + user << browse(dat,"window=depth_scanner;size=300x500") + onclose(user, "depth_scanner") + +/obj/item/device/depth_scanner/Topic(href, href_list) + ..() + usr.set_machine(src) + + if(href_list["select"]) + var/index = text2num(href_list["select"]) + if(index && index <= positive_locations.len) + current = positive_locations[index] + else if(href_list["clear"]) + var/index = text2num(href_list["clear"]) + if(index) + if(index <= positive_locations.len) + var/datum/depth_scan/D = positive_locations[index] + positive_locations.Remove(D) + qdel(D) + else + //GC will hopefully pick them up before too long + positive_locations = list() + qdel(current) + else if(href_list["close"]) + usr.unset_machine() + usr << browse(null, "window=depth_scanner") + + updateSelfDialog() + +/obj/item/device/beacon_locator + name = "locater device" + desc = "Used to scan and locate signals on a particular frequency." + icon = 'icons/obj/device.dmi' + icon_state = "pinoff" //pinonfar, pinonmedium, pinonclose, pinondirect, pinonnull + item_state = "electronic" + var/frequency = PUB_FREQ + var/scan_ticks = 0 + var/obj/item/device/radio/target_radio + +/obj/item/device/beacon_locator/New() + ..() + processing_objects.Add(src) + +/obj/item/device/beacon_locator/Destroy() + processing_objects.Remove(src) + ..() + +/obj/item/device/beacon_locator/process() + if(target_radio) + set_dir(get_dir(src,target_radio)) + switch(get_dist(src,target_radio)) + if(0 to 3) + icon_state = "pinondirect" + if(4 to 10) + icon_state = "pinonclose" + if(11 to 30) + icon_state = "pinonmedium" + if(31 to INFINITY) + icon_state = "pinonfar" + else + if(scan_ticks) + icon_state = "pinonnull" + scan_ticks++ + if(prob(scan_ticks * 10)) + spawn(0) + set background = 1 + if(processing_objects.Find(src)) + //scan radios in the world to try and find one + var/cur_dist = 999 + for(var/obj/item/device/radio/beacon/R in world) + if(R.z == src.z && R.frequency == src.frequency) + var/check_dist = get_dist(src,R) + if(check_dist < cur_dist) + cur_dist = check_dist + target_radio = R + + scan_ticks = 0 + var/turf/T = get_turf(src) + if(target_radio) + T.visible_message("\icon[src] [src] [pick("chirps","chirrups","cheeps")] happily.") + else + T.visible_message("\icon[src] [src] [pick("chirps","chirrups","cheeps")] sadly.") + else + icon_state = "pinoff" + +/obj/item/device/beacon_locator/attack_self(var/mob/user as mob) + return src.interact(user) + +/obj/item/device/beacon_locator/interact(var/mob/user as mob) + var/dat = "Radio frequency tracker
    " + dat += {" + Reset tracker
    + Frequency: + - + - + [format_frequency(frequency)] + + + +
    + "} + + dat += "Close
    " + user << browse(dat,"window=locater;size=300x150") + onclose(user, "locater") + +/obj/item/device/beacon_locator/Topic(href, href_list) + ..() + usr.set_machine(src) + + if(href_list["reset_tracking"]) + scan_ticks = 1 + target_radio = null + else if(href_list["freq"]) + var/new_frequency = (frequency + text2num(href_list["freq"])) + if (frequency < 1200 || frequency > 1600) + new_frequency = sanitize_frequency(new_frequency, 1499) + frequency = new_frequency + + else if(href_list["close"]) + usr.unset_machine() + usr << browse(null, "window=locater") + + updateSelfDialog() diff --git a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm similarity index 71% rename from code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm rename to code/modules/xenoarcheaology/tools/tools_pickaxe.dm index e8bedc09878..a8bf853e82e 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm +++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm @@ -1,132 +1,151 @@ - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Excavation pickaxes - sorted in order of delicacy. Players will have to choose the right one for each part of excavation. - -/obj/item/weapon/pickaxe/brush - name = "brush" - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "pick_brush" - item_state = "syringe_0" - digspeed = 20 - desc = "Thick metallic wires for clearing away dust and loose scree (1 centimetre excavation depth)." - excavation_amount = 0.5 - drill_sound = 'sound/weapons/thudswoosh.ogg' - drill_verb = "brushing" - w_class = 2 - -/obj/item/weapon/pickaxe/one_pick - name = "1/6 pick" - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "pick1" - item_state = "syringe_0" - digspeed = 20 - desc = "A miniature excavation tool for precise digging (2 centimetre excavation depth)." - excavation_amount = 1 - drill_sound = 'sound/items/Screwdriver.ogg' - drill_verb = "delicately picking" - w_class = 2 - -/obj/item/weapon/pickaxe/two_pick - name = "1/3 pick" - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "pick2" - item_state = "syringe_0" - digspeed = 20 - desc = "A miniature excavation tool for precise digging (4 centimetre excavation depth)." - excavation_amount = 2 - drill_sound = 'sound/items/Screwdriver.ogg' - drill_verb = "delicately picking" - w_class = 2 - -/obj/item/weapon/pickaxe/three_pick - name = "1/2 pick" - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "pick3" - item_state = "syringe_0" - digspeed = 20 - desc = "A miniature excavation tool for precise digging (6 centimetre excavation depth)." - excavation_amount = 3 - drill_sound = 'sound/items/Screwdriver.ogg' - drill_verb = "delicately picking" - w_class = 2 - -/obj/item/weapon/pickaxe/four_pick - name = "2/3 pick" - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "pick4" - item_state = "syringe_0" - digspeed = 20 - desc = "A miniature excavation tool for precise digging (8 centimetre excavation depth)." - excavation_amount = 4 - drill_sound = 'sound/items/Screwdriver.ogg' - drill_verb = "delicately picking" - w_class = 2 - -/obj/item/weapon/pickaxe/five_pick - name = "5/6 pick" - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "pick5" - item_state = "syringe_0" - digspeed = 20 - desc = "A miniature excavation tool for precise digging (10 centimetre excavation depth)." - excavation_amount = 5 - drill_sound = 'sound/items/Screwdriver.ogg' - drill_verb = "delicately picking" - w_class = 2 - -/obj/item/weapon/pickaxe/six_pick - name = "1/1 pick" - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "pick6" - item_state = "syringe_0" - digspeed = 20 - desc = "A miniature excavation tool for precise digging (12 centimetre excavation depth)." - excavation_amount = 6 - drill_sound = 'sound/items/Screwdriver.ogg' - drill_verb = "delicately picking" - w_class = 2 - -/obj/item/weapon/pickaxe/hand - name = "hand pickaxe" - icon = 'icons/obj/xenoarchaeology.dmi' - icon_state = "pick_hand" - item_state = "syringe_0" - digspeed = 30 - desc = "A smaller, more precise version of the pickaxe (30 centimetre excavation depth)." - excavation_amount = 15 - drill_sound = 'sound/items/Crowbar.ogg' - drill_verb = "clearing" - w_class = 3 - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// Pack for holding pickaxes - -/obj/item/weapon/storage/box/excavation - name = "excavation pick set" - icon = 'icons/obj/storage.dmi' - icon_state = "excavation" - desc = "A set of picks for excavation." - item_state = "syringe_kit" - foldable = /obj/item/stack/material/cardboard //BubbleWrap - storage_slots = 7 - w_class = 2 - can_hold = list(/obj/item/weapon/pickaxe/brush,\ - /obj/item/weapon/pickaxe/one_pick,\ - /obj/item/weapon/pickaxe/two_pick,\ - /obj/item/weapon/pickaxe/three_pick,\ - /obj/item/weapon/pickaxe/four_pick,\ - /obj/item/weapon/pickaxe/five_pick,\ - /obj/item/weapon/pickaxe/six_pick) - max_storage_space = 18 - max_w_class = 3 - use_to_pickup = 1 // for picking up broken bulbs, not that most people will try - -/obj/item/weapon/storage/box/excavation/New() - ..() - new /obj/item/weapon/pickaxe/brush(src) - new /obj/item/weapon/pickaxe/one_pick(src) - new /obj/item/weapon/pickaxe/two_pick(src) - new /obj/item/weapon/pickaxe/three_pick(src) - new /obj/item/weapon/pickaxe/four_pick(src) - new /obj/item/weapon/pickaxe/five_pick(src) - new /obj/item/weapon/pickaxe/six_pick(src) +/obj/item/weapon/pickaxe/brush + name = "brush" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "pick_brush" + item_state = "syringe_0" + slot_flags = SLOT_EARS + digspeed = 20 + desc = "Thick metallic wires for clearing away dust and loose scree (1 centimetre excavation depth)." + excavation_amount = 1 + drill_sound = 'sound/weapons/thudswoosh.ogg' + drill_verb = "brushing" + w_class = 2 + +/obj/item/weapon/pickaxe/one_pick + name = "2cm pick" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "pick1" + item_state = "syringe_0" + digspeed = 20 + desc = "A miniature excavation tool for precise digging (2 centimetre excavation depth)." + excavation_amount = 2 + drill_sound = 'sound/items/Screwdriver.ogg' + drill_verb = "delicately picking" + w_class = 2 + +/obj/item/weapon/pickaxe/two_pick + name = "4cm pick" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "pick2" + item_state = "syringe_0" + digspeed = 20 + desc = "A miniature excavation tool for precise digging (4 centimetre excavation depth)." + excavation_amount = 4 + drill_sound = 'sound/items/Screwdriver.ogg' + drill_verb = "delicately picking" + w_class = 2 + +/obj/item/weapon/pickaxe/three_pick + name = "6cm pick" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "pick3" + item_state = "syringe_0" + digspeed = 20 + desc = "A miniature excavation tool for precise digging (6 centimetre excavation depth)." + excavation_amount = 6 + drill_sound = 'sound/items/Screwdriver.ogg' + drill_verb = "delicately picking" + w_class = 2 + +/obj/item/weapon/pickaxe/four_pick + name = "8cm pick" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "pick4" + item_state = "syringe_0" + digspeed = 20 + desc = "A miniature excavation tool for precise digging (8 centimetre excavation depth)." + excavation_amount = 8 + drill_sound = 'sound/items/Screwdriver.ogg' + drill_verb = "delicately picking" + w_class = 2 + +/obj/item/weapon/pickaxe/five_pick + name = "10cm pick" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "pick5" + item_state = "syringe_0" + digspeed = 20 + desc = "A miniature excavation tool for precise digging (10 centimetre excavation depth)." + excavation_amount = 10 + drill_sound = 'sound/items/Screwdriver.ogg' + drill_verb = "delicately picking" + w_class = 2 + +/obj/item/weapon/pickaxe/six_pick + name = "12cm pick" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "pick6" + item_state = "syringe_0" + digspeed = 20 + desc = "A miniature excavation tool for precise digging (12 centimetre excavation depth)." + excavation_amount = 12 + drill_sound = 'sound/items/Screwdriver.ogg' + drill_verb = "delicately picking" + w_class = 2 + +/obj/item/weapon/pickaxe/hand + name = "hand pickaxe" + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "pick_hand" + item_state = "syringe_0" + digspeed = 30 + desc = "A smaller, more precise version of the pickaxe (30 centimetre excavation depth)." + excavation_amount = 30 + drill_sound = 'sound/items/Crowbar.ogg' + drill_verb = "clearing" + w_class = 2 + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Pack for holding pickaxes + +/obj/item/weapon/storage/excavation + name = "excavation pick set" + icon = 'icons/obj/storage.dmi' + icon_state = "excavation" + desc = "A set of picks for excavation." + item_state = "syringe_kit" + storage_slots = 7 + w_class = 2 + can_hold = list(/obj/item/weapon/pickaxe/brush, + /obj/item/weapon/pickaxe/one_pick, + /obj/item/weapon/pickaxe/two_pick, + /obj/item/weapon/pickaxe/three_pick, + /obj/item/weapon/pickaxe/four_pick, + /obj/item/weapon/pickaxe/five_pick, + /obj/item/weapon/pickaxe/six_pick, + /obj/item/weapon/pickaxe/hand) + max_storage_space = 18 + max_w_class = 2 + use_to_pickup = 1 + +/obj/item/weapon/storage/excavation/New() + ..() + new /obj/item/weapon/pickaxe/brush(src) + new /obj/item/weapon/pickaxe/one_pick(src) + new /obj/item/weapon/pickaxe/two_pick(src) + new /obj/item/weapon/pickaxe/three_pick(src) + new /obj/item/weapon/pickaxe/four_pick(src) + new /obj/item/weapon/pickaxe/five_pick(src) + new /obj/item/weapon/pickaxe/six_pick(src) + +/obj/item/weapon/storage/excavation/handle_item_insertion() + ..() + sort_picks() + +/obj/item/weapon/storage/excavation/proc/sort_picks() + var/list/obj/item/weapon/pickaxe/picksToSort = list() + for(var/obj/item/weapon/pickaxe/P in src) + picksToSort += P + P.loc = null + while(picksToSort.len) + var/min = 200 // No pick is bigger than 200 + var/selected = 0 + for(var/i = 1 to picksToSort.len) + var/obj/item/weapon/pickaxe/current = picksToSort[i] + if(current.excavation_amount <= min) + selected = i + min = current.excavation_amount + var/obj/item/weapon/pickaxe/smallest = picksToSort[selected] + smallest.loc = src + picksToSort -= smallest + orient2hud() diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm index b50e42acd63..e772558fcc8 100644 --- a/code/modules/xenobio2/machinery/core_extractor.dm +++ b/code/modules/xenobio2/machinery/core_extractor.dm @@ -16,12 +16,11 @@ var/occupiedcolor = "#22FF22" var/emptycolor = "#FF2222" var/operatingcolor = "#FFFF22" - - + + /obj/machinery/slime/extractor/New() ..() update_light_color() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -29,14 +28,14 @@ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) RefreshParts() - + /obj/machinery/slime/extractor/attackby(var/obj/item/W, var/mob/user) //Let's try to deconstruct first. if(istype(W, /obj/item/weapon/screwdriver) && !inuse) default_deconstruction_screwdriver(user, W) return - + if(istype(W, /obj/item/weapon/crowbar)) default_deconstruction_crowbar(user, W) return @@ -45,7 +44,7 @@ user << "Close the panel first!" var/obj/item/weapon/grab/G = W - + if(!istype(G)) return ..() @@ -54,12 +53,12 @@ return move_into_extractor(user,G.affecting) - + /obj/machinery/slime/extractor/MouseDrop_T(mob/target, mob/user) if(user.stat || user.restrained()) return move_into_extractor(user,target) - + /obj/machinery/slime/extractor/proc/move_into_extractor(var/mob/user,var/mob/living/victim) if(src.occupant) @@ -73,12 +72,12 @@ if(!(istype(victim, /mob/living/simple_animal/xeno/slime)) ) user << "This is not a suitable subject for the core extractor!" return - + var/mob/living/simple_animal/xeno/slime/S = victim if(S.is_child) user << "This subject is not developed enough for the core extractor!" return - + user.visible_message("[user] starts to put [victim] into the core extractor!") src.add_fingerprint(user) if(do_after(user, 30) && victim.Adjacent(src) && user.Adjacent(src) && victim.Adjacent(user) && !occupant) @@ -89,7 +88,7 @@ victim.forceMove(src) src.occupant = victim update_light_color() - + /obj/machinery/slime/extractor/proc/update_light_color() if(src.occupant && !(inuse)) set_light(2, 2, occupiedcolor) @@ -97,13 +96,13 @@ set_light(2, 2, operatingcolor) else set_light(2, 2, emptycolor) - + /obj/machinery/slime/extractor/proc/extract_cores() if(!src.occupant) src.visible_message("\icon[src] [src] pings unhappily.") else if(inuse) return - + inuse = 1 update_light_color() spawn(30) @@ -112,17 +111,17 @@ var/obj/item/xenoproduct/slime/core/C = new(src) C.traits = new() occupant.traitdat.copy_traits(C.traits) - + C.nameVar = occupant.nameVar - + C.create_reagents(C.traits.traits[TRAIT_XENO_CHEMVOL]) for(var/reagent in occupant.traitdat.chems) C.reagents.add_reagent(reagent, occupant.traitdat.chems[reagent]) - + C.color = C.traits.traits[TRAIT_XENO_COLOR] if(occupant.traitdat.get_trait(TRAIT_XENO_BIOLUMESCENT)) C.set_light(occupant.traitdat.get_trait(TRAIT_XENO_GLOW_STRENGTH),occupant.traitdat.get_trait(TRAIT_XENO_GLOW_RANGE), occupant.traitdat.get_trait(TRAIT_XENO_BIO_COLOR)) - + spawn(30) icon_state = "scanner_0old" qdel(occupant) @@ -131,20 +130,20 @@ eject_contents() update_light_color() src.updateUsrDialog() - -/obj/machinery/slime/extractor/proc/eject_slime() + +/obj/machinery/slime/extractor/proc/eject_slime() if(occupant) occupant.forceMove(loc) occupant = null - + /obj/machinery/slime/extractor/proc/eject_core() for(var/obj/thing in (contents - component_parts - circuit)) thing.forceMove(loc) - + /obj/machinery/slime/extractor/proc/eject_contents() eject_core() eject_slime() - + //Here lies the UI /obj/machinery/slime/extractor/attack_hand(mob/user as mob) user.set_machine(src) @@ -192,4 +191,3 @@ /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/micro_laser = 2 ) - \ No newline at end of file diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm index c8bd8d374c9..8cf7b45a1fa 100644 --- a/code/modules/xenobio2/machinery/gene_manipulators.dm +++ b/code/modules/xenobio2/machinery/gene_manipulators.dm @@ -1,12 +1,12 @@ /* This file contains: - + Xenobiological disk: Holds traits that can be taken from cores and transplanted into slimes. - + Biological Product Destructive Analyzer: Takes certain traits in gene grouping from a core and places them into a disk. - + Biological genetic bombarder: Takes traits from a disk and replaces/adds to the genes in a xenobiological creature. */ @@ -16,10 +16,10 @@ icon = 'icons/obj/hydroponics_machines.dmi' icon_state = "disk" w_class = 1.0 - + var/list/genes = list() var/genesource = "unknown" - + /obj/item/weapon/disk/xenobio/attack_self(var/mob/user as mob) if(genes.len) var/choice = alert(user, "Are you sure you want to wipe the disk?", "Xenobiological Data", "No", "Yes") @@ -29,7 +29,7 @@ desc = initial(name) genes = list() genesource = "unknown" - + /obj/item/weapon/storage/box/xenobiodisk name = "biological disk box" desc = "A box of biological data disks, apparently." @@ -53,13 +53,13 @@ var/eject_disk = 0 var/failed_task = 0 var/disk_needs_genes = 0 - + /obj/machinery/xenobio/attack_ai(mob/user as mob) return attack_hand(user) /obj/machinery/xenobio/attack_hand(mob/user as mob) ui_interact(user) - + /obj/machinery/xenobio/attackby(obj/item/weapon/W as obj, mob/user as mob) if(default_deconstruction_screwdriver(user, W)) return @@ -96,7 +96,7 @@ if(world.time > last_action + action_time) finished_task() - + /obj/machinery/xenobio/proc/finished_task() active = 0 in_use = 0 @@ -112,7 +112,7 @@ loaded_disk.forceMove(get_turf(src)) visible_message("\icon[src] [src] beeps and spits out [loaded_disk].") loaded_disk = null - + /obj/machinery/xenobio/extractor name = "biological product destructive analyzer" icon = 'icons/obj/hydroponics_machines.dmi' @@ -122,10 +122,9 @@ var/obj/item/xenoproduct/product var/datum/xeno/traits/genetics // Currently scanned xeno genetic structure. var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point. - + /obj/machinery/xenobio/extractor/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -134,7 +133,7 @@ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) RefreshParts() - + /obj/machinery/xenobio/extractor/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/xenoproduct)) if(product) @@ -187,7 +186,7 @@ ui.set_initial_data(data) ui.open() ui.set_auto_update(1) - + /obj/machinery/xenobio/proc/eject_disk() if(!loaded_disk) return loaded_disk.forceMove(loc) @@ -201,7 +200,7 @@ if(href_list["eject_product"]) if(!product) return - + product.forceMove(get_turf(src)) visible_message("\icon[src] [src] beeps and spits out [product].") product = null @@ -253,22 +252,21 @@ usr.set_machine(src) src.add_fingerprint(usr) - + src.updateUsrDialog() return - + /obj/machinery/xenobio/editor name = "biological genetic bombarder" icon = 'icons/obj/cryogenics.dmi' icon_state = "cellold0" disk_needs_genes = 1 circuit = /obj/item/weapon/circuitboard/biobombarder - + var/mob/living/simple_animal/xeno/slime/occupant - + /obj/machinery/xenobio/editor/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -277,7 +275,7 @@ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) RefreshParts() - + /obj/machinery/xenobio/editor/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W @@ -358,21 +356,21 @@ occupant.traitdat.apply_gene(gene) occupant.stability += rand(5,10) occupant.ProcessTraits() - + if(href_list["eject_disk"]) eject_disk() - + if(href_list["eject_xeno"]) eject_xeno() - + usr.set_machine(src) src.add_fingerprint(usr) - + /obj/machinery/xenobio/editor/MouseDrop_T(mob/target, mob/user) if(user.stat || user.restrained()) return move_into_editor(user,target) - + /obj/machinery/xenobio/editor/proc/move_into_editor(var/mob/user,var/mob/living/victim) if(src.occupant) @@ -396,16 +394,16 @@ victim.client.eye = src victim.forceMove(src) occupant = victim - + /obj/machinery/xenobio/editor/proc/eject_contents() eject_disk() eject_xeno() - + /obj/machinery/xenobio/editor/proc/eject_xeno() if(occupant) occupant.forceMove(loc) occupant = null - + /obj/item/weapon/circuitboard/bioproddestanalyzer name = T_BOARD("biological product destructive analyzer") build_path = "/obj/machinery/xenobio/extractor" @@ -416,7 +414,7 @@ /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/scanning_module = 3 ) - + /obj/item/weapon/circuitboard/biobombarder name = T_BOARD("biological genetic bombarder") build_path = "/obj/machinery/xenobio/editor" @@ -427,4 +425,3 @@ /obj/item/weapon/stock_parts/matter_bin = 2, /obj/item/weapon/stock_parts/scanning_module = 2 ) - \ No newline at end of file diff --git a/code/modules/xenobio2/machinery/injector.dm b/code/modules/xenobio2/machinery/injector.dm index 7b482d5c1d6..dc9bad89f1b 100644 --- a/code/modules/xenobio2/machinery/injector.dm +++ b/code/modules/xenobio2/machinery/injector.dm @@ -25,7 +25,6 @@ reagents = R R.my_atom = src beaker = new /obj/item/weapon/reagent_containers/glass/beaker(src) - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) @@ -75,7 +74,7 @@ if(occupant) occupant.forceMove(loc) occupant = null - + /obj/machinery/xenobio2/manualinjector/proc/eject_beaker() if(beaker) var/obj/item/weapon/reagent_containers/glass/beaker/B = beaker @@ -140,7 +139,7 @@ /obj/item/weapon/circuitboard/xenobioinjectormachine name = T_BOARD("biological injector") - build_path = "/obj/machinery/xenobio2/manualinjector" - board_type = "machine" + build_path = /obj/machinery/xenobio2/manualinjector + board_type = /datum/frame/frame_types/machine origin_tech = list() //To be filled, req_components = list() //To be filled, \ No newline at end of file diff --git a/code/modules/xenobio2/machinery/injector_computer.dm b/code/modules/xenobio2/machinery/injector_computer.dm index 7bcccd55ca8..12887506c2f 100644 --- a/code/modules/xenobio2/machinery/injector_computer.dm +++ b/code/modules/xenobio2/machinery/injector_computer.dm @@ -61,7 +61,7 @@ if(isxeno(injector.occupant)) var/mob/living/simple_animal/xeno/X = injector.occupant data["compatible"] = 1 - data["instability"] = 100 * (X.mut_level / X.mut_max) + data["instability"] = 100 * (X.mut_level / X.mut_max) else data["compatible"] = null @@ -109,6 +109,5 @@ /obj/item/weapon/circuitboard/xenobio2computer name = T_BOARD("injector control console") - build_path = "/obj/item/weapon/circuitboard/xenobio2computer" - board_type = "computer" + build_path = /obj/item/weapon/circuitboard/xenobio2computer origin_tech = list() //To be filled, diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm index 9faa4272b40..077e3300088 100644 --- a/code/modules/xenobio2/machinery/slime_replicator.dm +++ b/code/modules/xenobio2/machinery/slime_replicator.dm @@ -16,10 +16,9 @@ var/occupiedcolor = "#22FF22" var/emptycolor = "#FF2222" var/operatingcolor = "#FFFF22" - + /obj/machinery/slime/replicator/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -27,23 +26,23 @@ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) RefreshParts() update_light_color() - - + + /obj/machinery/slime/replicator/attackby(var/obj/item/W, var/mob/user) //Let's try to deconstruct first. if(istype(W, /obj/item/weapon/screwdriver) && !inuse) default_deconstruction_screwdriver(user, W) return - + if(istype(W, /obj/item/weapon/crowbar)) default_deconstruction_crowbar(user, W) return var/obj/item/xenoproduct/slime/core/G = W - + if(!istype(G)) return ..() - + if(core) user << "[src] is already filled!" return @@ -53,7 +52,7 @@ user.drop_from_inventory(G) G.forceMove(src) update_light_color() - + /obj/machinery/slime/replicator/proc/update_light_color() if(src.core && !(inuse)) set_light(2, 2, occupiedcolor) @@ -61,13 +60,13 @@ set_light(2, 2, operatingcolor) else set_light(2, 2, emptycolor) - + /obj/machinery/slime/replicator/proc/replicate_slime() if(!src.core) src.visible_message("\icon[src] [src] pings unhappily.") else if(inuse) return - + inuse = 1 update_light_color() icon_state = "restruct_1" @@ -86,20 +85,20 @@ icon_state = "restruct_0" update_light_color() src.updateUsrDialog() - + /obj/machinery/slime/replicator/proc/eject_slime() for(var/mob/thing in contents) thing.forceMove(loc) -/obj/machinery/slime/replicator/proc/eject_core() +/obj/machinery/slime/replicator/proc/eject_core() if(core) core.forceMove(loc) core = null /obj/machinery/slime/replicator/proc/eject_contents() eject_slime() - eject_core() - + eject_core() + //Here lies the UI /obj/machinery/slime/replicator/attack_hand(mob/user as mob) user.set_machine(src) @@ -135,7 +134,7 @@ eject_core() src.updateUsrDialog() return - + //Circuit board below, /obj/item/weapon/circuitboard/slimereplicator name = T_BOARD("Slime replicator") @@ -148,4 +147,3 @@ /obj/item/weapon/stock_parts/micro_laser = 1 ) - \ No newline at end of file diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index b8acf60c218..a090548623c 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -75,7 +75,7 @@ var/total_unit_tests = 0 // // Check the async tests to see if they are finished. - // + // while(async_test.len) for(var/datum/unit_test/test in async_test) diff --git a/code/world.dm b/code/world.dm index 1d439428d26..c2280c0dea1 100644 --- a/code/world.dm +++ b/code/world.dm @@ -103,6 +103,8 @@ var/global/datum/global_init/init = new () for(var/turf/simulated/mineral/M in world) // Ugh. M.update_icon() + // Create frame types. + populate_frame_types() // Create robolimbs for chargen. populate_robolimb_list() @@ -157,8 +159,8 @@ var/world_topic_spam_protect_time = world.timeofday // This is dumb, but spacestation13.com's banners break if player count isn't the 8th field of the reply, so... this has to go here. s["players"] = 0 - s["stationtime"] = worldtime2text() - s["roundduration"] = round_duration_as_text() + s["stationtime"] = stationtime2text() + s["roundduration"] = roundduration2text() if(input["status"] == "2") var/list/players = list() diff --git a/html/changelog.html b/html/changelog.html index 5527c0a30af..cd77152c9d2 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,16 +53,173 @@ -->
    +

    30 August 2016

    +

    Anewbe updated:

    +
      +
    • Arm and leg guards are now slightly less slowing.
    • +
    • Mining RIG is now faster
    • +
    • Tweaks security voidsuit armor values.
    • +
    • Hardsuits (RIGs) now have an inbuilt suit cooling system, toggled via HUD button. This only works when the hardsuit is fully deployed, and drains charge from its power cell.
    • +
    +

    Neerti updated:

    +
      +
    • Emitters can be examined to see if they are damaged. They can also be repaired by applying metal sheets to them.
    • +
    • Emitters now only explode on death if they are on a powered wire with significant power flowing through it.
    • +
    • Emitters don't explode in one hit, or by tasers or non-damaging projectiles anymore.
    • +
    + +

    29 August 2016

    +

    Haswell updated:

    +
      +
    • Modules installed within a hardsuit will now be listed when examining the hardsuit control module while being held or worn, if the maintenance panel is open.
    • +
    +

    Hubblenaut updated:

    +
      +
    • Bottles will now actually sell for their set prices.
    • +
    • Chief Medical Officer and Medical Doctors now spawn with a health analyzer instead of a penlight.
    • +
    +

    Sin4 updated:

    +
      +
    • Camera Console swaps to active camera upon clicking on.
    • +
    • Hugs gender correctly.
    • +
    • Prometheans gender correctly and have a gender identity.
    • +
    • Meatspike no longer takes you prisoner upon placing something on it.
    • +
    • Lighting someone on fire now tells the admins.
    • +
    • Wiping something down with a damp rag no longer wets the floor.
    • +
    • Captains gloves now appear when put on.
    • +
    • Fixes Station Administrator Spawn point and access/restrictions.
    • +
    • Renamed items from captain to station administrator.
    • +
    +

    Yoshax updated:

    +
      +
    • IDs can now actually be put onto your ears.
    • +
    • Lungs will now once again rupture when you are in an area where you cannot breathe. This has a relatively small chance to happen.
    • +
    + +

    15 August 2016

    +

    Anewbe updated:

    +
      +
    • Changed some words to match current Tajaran lore.
    • +
    +

    Hubblenaut updated:

    +
      +
    • Adds a verb for toggling whether to show specific pieces of underwear.
    • +
    • Changes medical belt sprite. Mostly white now so they go nicely with all medical uniforms.
    • +
    +

    Yoshax updated:

    +
      +
    • Dirt accumulation on tiles will now work again.
    • +
    • The change appearance window provided to antagoniss such as mercenaries, heisters or suchlike (including traders!) will now properly allow people to select species they are whitelisted for.
    • +
    + +

    13 August 2016

    +

    Yoshax updated:

    +
      +
    • The ERT camera monitor on the shuttle will now connect to the right network.
    • +
    • The 'choose sprite' verb as a ghost will no longer prematurely clear you sprite and will now return your sprite to what it was previous when you press 'no'. However, it will not allow you to get back the sprite of your actual character because those are horrible snowflakes.
    • +
    • The Atmos Substation is now a proper substation with a breaker box and all!
    • +
    • Diona Nymphs now get a popup window on evolution to allow them to input a name.
    • +
    • Changeling revive will now close any surgical incisions.
    • +
    + +

    08 August 2016

    +

    Kelenius updated:

    +
      +
    • Xenoarcheology code has been partially redone.
    • +
    • Pick set will now sort the picks inside it.
    • +
    • Removed useless random numbers from GPS coordinates in various places. I'm sure we have not lost the arcane knowledge of rounding 500 years into the future.
    • +
    • Picks renamed to show their excavation depths.
    • +
    • Suspension generator's power use lowered.
    • +
    • Suspension generator's different field types removed. By the way, remember that they can suspend any item and even mobs.
    • +
    • Archeology belts and pick sets can now hold small pickaxes. Pick sets still only have 7 slots. Brushes fit on your ears.
    • +
    • Empty rock drop rate reduced.
    • +
    • Empty rock renamed from 'rock' to 'small rock' so you can tell if you are clicking on a turf or an item when hovering over it.
    • +
    • Empty boulder spawn rate reduced.
    • +
    • Tape measuring is a bit faster.
    • +
    • Scanner now shows the lowest and the highest depth of the find (highest is depth + clearance) for easier calculations. Ideally, you need to hit exactly the lowest spot. Less ideally, hit anywhere between higest and lowest. Hit below lowest and you have a chance to break the find.
    • +
    • You can now use a brush to clear strange rocks. Welder uses less fuel for that than before.
    • +
    • Anomaly analyser's report made a bit easier to read.
    • +
    • Anomaly locater will now also locate normal finds.
    • +
    • Gas masks will now correctly spawn as archeological finds.
    • +
    • Digsites will now properly contain several (4-12) turfs in a 5x5 radius. Be careful when digging near your finds.
    • +
    • Suspension generator will now correctly turn off (qdel issue).
    • +
    • Archeology overlays won't disappear when the icon is updated (e.g. when mining next to it).
    • +
    • Archeology overlays won't overlap each other and will properly disappear when you mine out a find.
    • +
    • Some spawning oddities were fixed.
    • +
    • Checks for whether you get a strange rock or a clean item were fixed (previously it always gave you clean item where it should have been rolling a random number).
    • +
    • Can no longer get rid of any item by putting it into evidence bag and bag into core sampler.
    • +
    • Can no longer irreversibly fold pick set into cardboard.
    • +
    • CO2 generator effect now has a type.
    • +
    • Phoron generator effect will now always generate phoron, not sometimes phoron and sometimes oxygen.
    • +
    +

    Sin4 updated:

    +
      +
    • Scheduler ported from Baystation's port of Paradise's scheduler.
    • +
    +

    Yoshax updated:

    +
      +
    • Some items such as commonly found tools are now slightly more effective when wielded as weapons. This change has been made because many of them were too low, and low because of mostly holdovers from other servers where things such as grey tide are big concerns.
    • +
    + +

    07 August 2016

    +

    HarpyEagle updated:

    +
      +
    • Severe enough burn damage now causes one-time blood loss due to blistering and body fluid cook-off.
    • +
    +

    Sin4 updated:

    +
      +
    • Fixed ERT icon not showing up properly for sechuds.
    • +
    • Fixed instances of the game mode's config_tag being displayed instead of the game mode name.
    • +
    +

    Yoshax updated:

    +
      +
    • Attacking yourself, or anyone else with a stack of five or more telecrystals will teleport the attacked person to a random, safe (not in space) location within 14 metres.
    • +
    • All telecrystals ammounts have been multiplied by 10. This means the base amount is now 120, and an emag for example costs 30, vs the previous 12 and 3, respectively.
    • +
    • You can once again use telecrystals on an emag to add more uses to it. You get 1 use per every 2 telecrystals.
    • +
    • Instead of only being able to remove 1 telecrystal from your uplink, you can now remove 1, 5, 10, 25, 50.
    • +
    + +

    05 August 2016

    +

    Anewbe updated:

    +
      +
    • Changeling Self-Respiration is now a toggle. By default they breathe normally, but if they use the power they no longer require oxygen, or experience the effects of inhaled gasses.
    • +
    • Heat based damage has been increased. This includes fire.
    • +
    +

    Hubblenaut updated:

    +
      +
    • Windoor assemblies can now be named with a pen.
    • +
    • Windoor and airlock assemblies now show their custom name during construction phase.
    • +
    • Windoors can now be made out of two sheets of glass or reinforced glass, for normal and secure windoors respectively.
    • +
    • Windoors now automatically close after construction.
    • +
    • Adjusts the algorism for how windoors and windows are placed on construction (when there are already windows co on the same turf).
    • +
    • Windoors will now drop exactly the materials they were made of.
    • +
    • Prying a broken circuit out of a windoor will no longer cause duplicates to drop.
    • +
    • Airlocks no longer spark after spawn and several other icon update issues were fixed.
    • +
    • Fixes reinforced walls not being constructable with one sheet left in stack.
    • +
    • Windows that were busted out of their frame by force are now correctly rotatable.
    • +
    • Lots of spellchecking and code cleanup in windoor and airlock code.
    • +
    • Killed innocent kittens.
    • +
    +

    Sin4 updated:

    +
      +
    • Advanced Body Scanners are now deconstructable
    • +
    • You can now add coolant to the Radiocarbon Spectrometers
    • +
    • Frame code revamped and cleaned up.
    • +
    • R&D server circuitboards can be swapped between core and robotics types using a screwdriver.
    • +
    +

    Yoshax updated:

    +
      +
    • Wounds will now once again bleed.
    • +
    • Xeno loadout items will now properly be reloaded into a slot when the server restarts.
    • +
    • A new item has been added to the uplink. Package bombs. These come in two variants, small and big, which cost 20 TC and 40 TC respectively. These come in a box with an explosive, a disguised detonator and a screwdriver. The use the detonator you muse apply the screwdriver to configure it into detonator mode. This must be done when it is closed.
    • +
    +

    31 July 2016

    Anewbe updated:

    • Sprays now respect shields.

    Yoshax updated:

    -
      -
    • A new item has been added to the uplink. Package bombs. These come in two variants, small and big, which cost 20 TC and 40 TC respectively. These come in a box with an explosive, a disguised detonator and a screwdriver. The use the detonator you muse apply the screwdriver to configure it into detonator mode. This must be done when it is closed.
    • -
    -

    Yoshax updated:

    • Certain items such as pills and suchlike will once again be usable on someone who is on a surgical table/table.
    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 7bc9d09161f..df24f59d204 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2605,11 +2605,177 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. Anewbe: - rscadd: Sprays now respect shields. Yoshax: + - bugfix: Certain items such as pills and suchlike will once again be usable on + someone who is on a surgical table/table. +2016-08-05: + Anewbe: + - rscadd: Changeling Self-Respiration is now a toggle. By default they breathe normally, + but if they use the power they no longer require oxygen, or experience the effects + of inhaled gasses. + - tweak: Heat based damage has been increased. This includes fire. + Hubblenaut: + - rscadd: Windoor assemblies can now be named with a pen. + - rscadd: Windoor and airlock assemblies now show their custom name during construction + phase. + - tweak: Windoors can now be made out of two sheets of glass or reinforced glass, + for normal and secure windoors respectively. + - tweak: Windoors now automatically close after construction. + - tweak: Adjusts the algorism for how windoors and windows are placed on construction + (when there are already windows co on the same turf). + - bugfix: Windoors will now drop exactly the materials they were made of. + - bugfix: Prying a broken circuit out of a windoor will no longer cause duplicates + to drop. + - bugfix: Airlocks no longer spark after spawn and several other icon update issues + were fixed. + - bugfix: Fixes reinforced walls not being constructable with one sheet left in + stack. + - bugfix: Windows that were busted out of their frame by force are now correctly + rotatable. + - bugfix: Lots of spellchecking and code cleanup in windoor and airlock code. + - rscdel: Killed innocent kittens. + Sin4: + - bugfix: Advanced Body Scanners are now deconstructable + - bugfix: You can now add coolant to the Radiocarbon Spectrometers + - tweak: Frame code revamped and cleaned up. + - rscadd: R&D server circuitboards can be swapped between core and robotics types + using a screwdriver. + Yoshax: + - bugfix: Wounds will now once again bleed. + - bugfix: Xeno loadout items will now properly be reloaded into a slot when the + server restarts. - rscadd: A new item has been added to the uplink. Package bombs. These come in two variants, small and big, which cost 20 TC and 40 TC respectively. These come in a box with an explosive, a disguised detonator and a screwdriver. The use the detonator you muse apply the screwdriver to configure it into detonator mode. This must be done when it is closed. +2016-08-07: + HarpyEagle: + - rscadd: Severe enough burn damage now causes one-time blood loss due to blistering + and body fluid cook-off. + Sin4: + - bugfix: Fixed ERT icon not showing up properly for sechuds. + - tweak: Fixed instances of the game mode's config_tag being displayed instead of + the game mode name. Yoshax: - - bugfix: Certain items such as pills and suchlike will once again be usable on - someone who is on a surgical table/table. + - rscadd: Attacking yourself, or anyone else with a stack of five or more telecrystals + will teleport the attacked person to a random, safe (not in space) location + within 14 metres. + - tweak: All telecrystals ammounts have been multiplied by 10. This means the base + amount is now 120, and an emag for example costs 30, vs the previous 12 and + 3, respectively. + - tweak: You can once again use telecrystals on an emag to add more uses to it. + You get 1 use per every 2 telecrystals. + - tweak: Instead of only being able to remove 1 telecrystal from your uplink, you + can now remove 1, 5, 10, 25, 50. +2016-08-08: + Kelenius: + - rscadd: Xenoarcheology code has been partially redone. + - tweak: Pick set will now sort the picks inside it. + - tweak: Removed useless random numbers from GPS coordinates in various places. + I'm sure we have not lost the arcane knowledge of rounding 500 years into the + future. + - tweak: Picks renamed to show their excavation depths. + - tweak: Suspension generator's power use lowered. + - tweak: Suspension generator's different field types removed. By the way, remember + that they can suspend any item and even mobs. + - tweak: Archeology belts and pick sets can now hold small pickaxes. Pick sets still + only have 7 slots. Brushes fit on your ears. + - tweak: Empty rock drop rate reduced. + - tweak: Empty rock renamed from 'rock' to 'small rock' so you can tell if you are + clicking on a turf or an item when hovering over it. + - tweak: Empty boulder spawn rate reduced. + - tweak: Tape measuring is a bit faster. + - tweak: Scanner now shows the lowest and the highest depth of the find (highest + is depth + clearance) for easier calculations. Ideally, you need to hit exactly + the lowest spot. Less ideally, hit anywhere between higest and lowest. Hit below + lowest and you have a chance to break the find. + - tweak: You can now use a brush to clear strange rocks. Welder uses less fuel for + that than before. + - tweak: Anomaly analyser's report made a bit easier to read. + - tweak: Anomaly locater will now also locate normal finds. + - bugfix: Gas masks will now correctly spawn as archeological finds. + - bugfix: Digsites will now properly contain several (4-12) turfs in a 5x5 radius. + Be careful when digging near your finds. + - bugfix: Suspension generator will now correctly turn off (qdel issue). + - bugfix: Archeology overlays won't disappear when the icon is updated (e.g. when + mining next to it). + - bugfix: Archeology overlays won't overlap each other and will properly disappear + when you mine out a find. + - bugfix: Some spawning oddities were fixed. + - bugfix: Checks for whether you get a strange rock or a clean item were fixed (previously + it always gave you clean item where it should have been rolling a random number). + - bugfix: Can no longer get rid of any item by putting it into evidence bag and + bag into core sampler. + - bugfix: Can no longer irreversibly fold pick set into cardboard. + - bugfix: CO2 generator effect now has a type. + - bugfix: Phoron generator effect will now always generate phoron, not sometimes + phoron and sometimes oxygen. + Sin4: + - tweak: Scheduler ported from Baystation's port of Paradise's scheduler. + Yoshax: + - tweak: Some items such as commonly found tools are now slightly more effective + when wielded as weapons. This change has been made because many of them were + too low, and low because of mostly holdovers from other servers where things + such as grey tide are big concerns. +2016-08-13: + Yoshax: + - bugfix: The ERT camera monitor on the shuttle will now connect to the right network. + - bugfix: The 'choose sprite' verb as a ghost will no longer prematurely clear you + sprite and will now return your sprite to what it was previous when you press + 'no'. However, it will not allow you to get back the sprite of your actual character + because those are horrible snowflakes. + - bugfix: The Atmos Substation is now a proper substation with a breaker box and + all! + - bugfix: Diona Nymphs now get a popup window on evolution to allow them to input + a name. + - bugfix: Changeling revive will now close any surgical incisions. +2016-08-15: + Anewbe: + - tweak: Changed some words to match current Tajaran lore. + Hubblenaut: + - rscadd: Adds a verb for toggling whether to show specific pieces of underwear. + - tweak: Changes medical belt sprite. Mostly white now so they go nicely with all + medical uniforms. + Yoshax: + - bugfix: Dirt accumulation on tiles will now work again. + - bugfix: The change appearance window provided to antagoniss such as mercenaries, + heisters or suchlike (including traders!) will now properly allow people to + select species they are whitelisted for. +2016-08-29: + Haswell: + - rscadd: Modules installed within a hardsuit will now be listed when examining + the hardsuit control module while being held or worn, if the maintenance panel + is open. + Hubblenaut: + - bugfix: Bottles will now actually sell for their set prices. + - tweak: Chief Medical Officer and Medical Doctors now spawn with a health analyzer + instead of a penlight. + Sin4: + - bugfix: Camera Console swaps to active camera upon clicking on. + - bugfix: Hugs gender correctly. + - bugfix: Prometheans gender correctly and have a gender identity. + - bugfix: Meatspike no longer takes you prisoner upon placing something on it. + - rscadd: Lighting someone on fire now tells the admins. + - bugfix: Wiping something down with a damp rag no longer wets the floor. + - bugfix: Captains gloves now appear when put on. + - bugfix: Fixes Station Administrator Spawn point and access/restrictions. + - tweak: Renamed items from captain to station administrator. + Yoshax: + - bugfix: IDs can now actually be put onto your ears. + - bugfix: Lungs will now once again rupture when you are in an area where you cannot + breathe. This has a relatively small chance to happen. +2016-08-30: + Anewbe: + - tweak: Arm and leg guards are now slightly less slowing. + - tweak: Mining RIG is now faster + - tweak: Tweaks security voidsuit armor values. + - rscadd: Hardsuits (RIGs) now have an inbuilt suit cooling system, toggled via + HUD button. This only works when the hardsuit is fully deployed, and drains + charge from its power cell. + Neerti: + - rscadd: Emitters can be examined to see if they are damaged. They can also be + repaired by applying metal sheets to them. + - tweak: Emitters now only explode on death if they are on a powered wire with significant + power flowing through it. + - bugfix: Emitters don't explode in one hit, or by tasers or non-damaging projectiles + anymore. diff --git a/html/changelogs/Techhead-Splints.yml b/html/changelogs/Techhead-Splints.yml new file mode 100644 index 00000000000..efc41657285 --- /dev/null +++ b/html/changelogs/Techhead-Splints.yml @@ -0,0 +1,7 @@ +author: Techhead + +delete-after: True + +changes: + - rscadd: "Medical splints can now also be applied to hands and feet (in addition to arms and legs)." + - rscadd: "For those that miss the old functionality, ghetto splints have been added. These can be crafted with a roll of tape and a metal rod and can only splint arms and legs." \ No newline at end of file diff --git a/html/changelogs/Yoshax - Bleeding.yml b/html/changelogs/Yoshax - Case.yml similarity index 92% rename from html/changelogs/Yoshax - Bleeding.yml rename to html/changelogs/Yoshax - Case.yml index 51703f64fec..0ac726b460c 100644 --- a/html/changelogs/Yoshax - Bleeding.yml +++ b/html/changelogs/Yoshax - Case.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Yoshax +author: Yosh # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,4 @@ delete-after: True # Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - - bugfix: "Wounds will now once again bleed." + - rscadd: "The secure briefcase is now available in the loadout for anyone who wishes to use it." \ No newline at end of file diff --git a/html/changelogs/Yoshax - Floating.yml b/html/changelogs/Yoshax - Floating.yml new file mode 100644 index 00000000000..b42ea00f267 --- /dev/null +++ b/html/changelogs/Yoshax - Floating.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: Yosh + +# 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: + - bugfix: "Leaving a space area and entering a non-space area will no longer leave your sprite floating." \ No newline at end of file diff --git a/html/changelogs/Yoshax - Ponchos.yml b/html/changelogs/Yoshax - Ponchos.yml new file mode 100644 index 00000000000..1625b5a53c8 --- /dev/null +++ b/html/changelogs/Yoshax - Ponchos.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: Yosh + +# 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: "Ponchos can now be attached to your uniform as an accessory. In addition they can also be attached to suits!" \ No newline at end of file diff --git a/html/changelogs/Yoshax - Regen.yml b/html/changelogs/Yoshax - Regen.yml new file mode 100644 index 00000000000..023b98a3ae3 --- /dev/null +++ b/html/changelogs/Yoshax - Regen.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: Yosh + +# 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: + - bugfix: "Changeling regenerative stasis will now properly regrow limbs." + - bugfix: "Changeling regenerative stasis will no longer runtime and refuse to work when you have a missing limb." diff --git a/html/changelogs/Yoshax - Rev.yml b/html/changelogs/Yoshax - Rev.yml new file mode 100644 index 00000000000..f328183dbb8 --- /dev/null +++ b/html/changelogs/Yoshax - Rev.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: Yosh + +# 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: "The shuttle during revolution will no longer take forever and a day to arrive and such." \ No newline at end of file diff --git a/html/changelogs/alberyk-PR-752.yml b/html/changelogs/alberyk-PR-752.yml new file mode 100644 index 00000000000..9a6d435838e --- /dev/null +++ b/html/changelogs/alberyk-PR-752.yml @@ -0,0 +1,7 @@ + +author: Alberyk + +delete-after: True + +changes: + - rscadd: "Added more horns and horns related facial options for Unathi." diff --git a/icons/atmos/tank.dmi b/icons/atmos/tank.dmi index 322f43e8f09..17e08f49b9d 100644 Binary files a/icons/atmos/tank.dmi and b/icons/atmos/tank.dmi differ diff --git a/icons/mob/AI.dmi b/icons/mob/AI.dmi index f074231afba..7fe7877cdaa 100644 Binary files a/icons/mob/AI.dmi and b/icons/mob/AI.dmi differ diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 5f8e67691e0..18c6f0e46c3 100644 Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index afc8a68ddd0..cd378680b23 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi index b9fbe70b5e1..81316a066e1 100644 Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index f26dd77bf43..b9e90df4b11 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index b6d4ba748dc..6686ed3f64a 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index 4f14b81e3e5..b8275ce7bf3 100644 Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 99f9bfd2e7f..f78b75c6c10 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/items/lefthand_storage.dmi b/icons/mob/items/lefthand_storage.dmi index 21c6653e3fb..98d3e697640 100644 Binary files a/icons/mob/items/lefthand_storage.dmi and b/icons/mob/items/lefthand_storage.dmi differ diff --git a/icons/mob/items/righthand_storage.dmi b/icons/mob/items/righthand_storage.dmi index 215ae85788e..9aede7781a4 100644 Binary files a/icons/mob/items/righthand_storage.dmi and b/icons/mob/items/righthand_storage.dmi differ diff --git a/icons/mob/screen_spells.dmi b/icons/mob/screen_spells.dmi index a1a480a50ae..1d416a954ce 100644 Binary files a/icons/mob/screen_spells.dmi and b/icons/mob/screen_spells.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index 554cad55b4a..3de07fbad56 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index 67898604e37..6343aa53cc9 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 6f3bd865e63..498b9e65109 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index 7fa721499b3..cf1c7b343c0 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index d0c44e3fd19..3fffa242528 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 8bd1183df81..3cd1a040a6b 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 2fe02d970ee..b64cb6027cf 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index c97eff9aa41..389d3c31ce8 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index a1725f7f8ac..0d209716d87 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/doors/Doorext.dmi b/icons/obj/doors/Doorext.dmi index 2660865175b..d912394ecef 100644 Binary files a/icons/obj/doors/Doorext.dmi and b/icons/obj/doors/Doorext.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 5d61df9dff7..69af391a2ad 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index b8ee96c1d9b..e0b25abb5ee 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index 294f1f82f74..28ea28bde1d 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm index a4237919777..aef92ba018d 100644 --- a/maps/polaris-1.dmm +++ b/maps/polaris-1.dmm @@ -158,7 +158,8 @@ "adb" = (/obj/machinery/photocopier,/turf/simulated/floor/lino,/area/chapel/office) "adc" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/dark,/area/chapel/chapel_morgue) "add" = (/turf/simulated/wall,/area/maintenance/library) -"ade" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"ade" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/library) +"adf" = (/obj/structure/closet,/obj/item/weapon/towel/random,/obj/item/weapon/towel/random,/obj/item/weapon/towel/random,/obj/item/weapon/towel/random,/turf/simulated/floor,/area/maintenance/pool) "adg" = (/obj/structure/table/rack,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plating,/area/maintenance/library) "adh" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/library) "adi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/maintenance/library) @@ -538,13 +539,13 @@ "aks" = (/obj/structure/closet,/obj/item/weapon/beach_ball,/turf/simulated/floor,/area/maintenance/pool) "akt" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/tiled,/area/storage/tools) "aku" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/random/tech_supply,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/storage/tools) -"akv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) -"akw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) -"akx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/storage/tools) -"aky" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/storage/tools) +"akv" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) +"akw" = (/obj/machinery/door/airlock/glass{name = "Auxiliary Tool Storage"; req_access = list(12)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) +"akx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/recreation_area_hallway) +"aky" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) "akz" = (/turf/simulated/wall,/area/chapel/main) "akA" = (/turf/simulated/wall,/area/chapel/office) -"akB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/storage/tools) +"akB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/storage/tools) "akC" = (/obj/effect/decal/cleanable/generic,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/locker) "akD" = (/obj/machinery/door/airlock/maintenance{req_access = list(12)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/maintenance/pool) "akE" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/dark,/area/chapel/chapel_morgue) @@ -554,17 +555,17 @@ "akI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light/small,/turf/simulated/floor,/area/maintenance/pool) "akJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard) "akK" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) -"akL" = (/obj/machinery/camera/network/civilian{c_tag = "CIV - Auxiliary Tool Storage"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/storage/tools) -"akM" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/storage/tools) +"akL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/storage/tools) +"akM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/storage/tools) "akN" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/library) "akO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/library) "akP" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) "akQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/library) "akR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/library) -"akS" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/storage/tools) -"akT" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/structure/cable,/turf/simulated/floor/tiled,/area/storage/tools) -"akU" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/storage/tools) -"akV" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/storage/tools) +"akS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/maintenance/pool) +"akT" = (/obj/machinery/camera/network/civilian{c_tag = "CIV - Auxiliary Tool Storage"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/storage/tools) +"akU" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/storage/tools) +"akV" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/storage/tools) "akW" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/structure/table/steel,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/recharger{pixel_y = 0},/turf/simulated/floor/tiled,/area/storage/tools) "akX" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "akY" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) @@ -572,7 +573,7 @@ "ala" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/machinery/alarm{pixel_y = 22},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "alb" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 8},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "alc" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) -"ald" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Pump Station"; req_one_access = list(11,24)},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) +"ald" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/tiled,/area/storage/tools) "ale" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "alf" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "alg" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) @@ -587,7 +588,7 @@ "alp" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/tiled/hydro,/area/maintenance/engineering/pumpstation) "alq" = (/turf/simulated/wall/r_wall,/area/maintenance/auxsolarstarboard) "alr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) -"als" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 1},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) +"als" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/storage/tools) "alt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) "alu" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "alv" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/library) @@ -597,7 +598,7 @@ "alz" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 9},/obj/effect/decal/warning_stripes,/turf/simulated/floor,/area/maintenance/engineering/pumpstation) "alA" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/structure/closet/firecloset,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "alB" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/maintenance/engineering/pumpstation) -"alC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) +"alC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/storage/tools) "alD" = (/obj/machinery/door/airlock/glass_engineeringatmos{name = "Pump Station Atmospherics"; req_one_access = list(11,24)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "alE" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth"},/turf/simulated/floor/tiled/dark,/area/chapel/main) "alF" = (/obj/machinery/door/morgue{dir = 2; name = "Confession Booth (Chaplain)"; req_access = list(22)},/turf/simulated/floor/tiled/dark,/area/chapel/main) @@ -624,7 +625,7 @@ "ama" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/empty,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "amb" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "amc" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) -"amd" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/red{dir = 1},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) +"amd" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Pump Station"; req_one_access = list(11,24)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "ame" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering/pumpstation) "amf" = (/turf/simulated/floor/tiled/dark,/area/chapel/main) "amg" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/table/steel_reinforced,/obj/random/tech_supply,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) @@ -651,8 +652,8 @@ "amB" = (/obj/machinery/atmospherics/binary/pump{dir = 4},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "amC" = (/obj/machinery/atmospherics/tvalve/mirrored/digital/bypass{dir = 4},/obj/machinery/camera/network/engineering{c_tag = "ENG - Pump Station"; dir = 1},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "amD" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) -"amE" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) -"amF" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) +"amE" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) +"amF" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(12,5)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/pool) "amG" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/lino,/area/chapel/office) "amH" = (/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/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/lino,/area/chapel/office) "amI" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/lino,/area/chapel/office) @@ -674,7 +675,7 @@ "amY" = (/turf/simulated/wall,/area/storage/primary) "amZ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/structure/table/steel_reinforced,/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/steel{amount = 50; pixel_x = -2; pixel_y = -2},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "ana" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/storage/briefcase/inflatable{pixel_x = 3; pixel_y = 6},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) -"anb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Pump Station"; req_one_access = list(11,24)},/turf/simulated/floor,/area/maintenance/medbay_fore) +"anb" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/medbay_fore) "anc" = (/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/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "chapel"; name = "Chapel Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/chapel/office) "and" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/shutters{density = 0; dir = 2; icon_state = "shutter0"; id = "chapel"; name = "Chapel Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/chapel/office) "ane" = (/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/disposalpipe/segment,/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock{name = "Chapel Office"; req_access = list(27)},/turf/simulated/floor/lino,/area/chapel/office) @@ -1167,7 +1168,7 @@ "awx" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/machinery/light/small{dir = 1},/obj/structure/plasticflaps/mining,/turf/simulated/floor,/area/maintenance/disposal) "awy" = (/obj/machinery/conveyor{dir = 2; id = "garbage"},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/maintenance/disposal) "awz" = (/obj/effect/floor_decal/industrial/loading,/obj/machinery/door/firedoor/border_only,/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Command"},/turf/simulated/floor/tiled,/area/bridge_hallway) -"awA" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/security{c_tag = "SEC - Interrogation"},/turf/simulated/floor/tiled/dark,/area/security/interrogation) +"awA" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/interrogation{c_tag = "INT - Interrogation"},/turf/simulated/floor/tiled/dark,/area/security/interrogation) "awB" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled/dark,/area/security/interrogation) "awC" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/security/interrogation) "awD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/corner/red{dir = 1},/turf/simulated/floor/tiled,/area/security/brig) @@ -1228,7 +1229,7 @@ "axG" = (/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/keycard_auth{pixel_x = 32},/obj/machinery/light_switch{pixel_x = 23; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "axH" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/security/main) "axI" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/tiled,/area/security/main) -"axJ" = (/obj/structure/noticeboard{pixel_x = 32; pixel_y = 0},/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/tiled,/area/security/main) +"axJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red{dir = 9},/obj/structure/noticeboard{pixel_x = -32},/turf/simulated/floor/tiled,/area/security/main) "axK" = (/turf/simulated/wall/r_wall,/area/security/security_lockerroom) "axL" = (/turf/simulated/wall/r_wall,/area/security/security_bathroom) "axM" = (/obj/machinery/camera/network/northern_star{c_tag = "Hall - Civilian Aft Port 1"; dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/civilian_hallway_aft) @@ -1277,7 +1278,7 @@ "ayD" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/standard,/obj/machinery/camera/network/security{c_tag = "SEC - Evidence Storage"; dir = 8},/obj/item/weapon/storage/laundry_basket,/turf/simulated/floor/tiled/dark,/area/security/evidence_storage) "ayE" = (/obj/structure/table/standard,/obj/item/weapon/soap/nanotrasen,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_4) "ayF" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) -"ayG" = (/obj/structure/bed/chair/comfy/black{dir = 1},/obj/effect/landmark/start{name = "Head of Security"},/obj/machinery/button/remote/airlock{id = "HoSdoor"; name = "Office Door"; pixel_x = -36; pixel_y = 29},/obj/machinery/button/windowtint{pixel_x = -26; pixel_y = 30},/obj/machinery/button/remote/blast_door{id = "security_lockdown"; name = "Brig Lockdown"; pixel_x = -36; pixel_y = 39; req_access = list(2)},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) +"ayG" = (/obj/structure/bed/chair/comfy/black{dir = 1},/obj/effect/landmark/start{name = "Head of Security"},/obj/machinery/button/remote/airlock{id = "HoSdoor"; name = "Office Door"; pixel_x = -36; pixel_y = 29},/obj/machinery/button/windowtint{pixel_x = -26; pixel_y = 30; req_access = list(58)},/obj/machinery/button/remote/blast_door{id = "security_lockdown"; name = "Brig Lockdown"; pixel_x = -36; pixel_y = 39; req_access = list(2)},/turf/simulated/floor/carpet,/area/crew_quarters/heads/hos) "ayH" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "ayI" = (/obj/structure/grille,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced/polarized{dir = 1},/obj/structure/window/reinforced/polarized{dir = 8},/obj/structure/window/reinforced/polarized{dir = 4},/turf/simulated/floor/plating,/area/crew_quarters/heads/hos) "ayJ" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/security/main) @@ -2521,10 +2522,10 @@ "aWz" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) "aWA" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) "aWB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) -"aWC" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) -"aWD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) +"aWC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) +"aWD" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/red{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "aWE" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_starboard_outer"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) -"aWF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/recreation_area_hallway) +"aWF" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/maintenance/medbay_fore) "aWG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/maintenance/pool) "aWH" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "escape_dock_south_starboard_inner"; locked = 1; name = "Escape Airlock"; req_access = list(13)},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) "aWI" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "trade_shuttle_dock_airlock"; name = "interior access button"; pixel_x = -28; pixel_y = -26; req_access = list(13)},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1) @@ -2598,7 +2599,7 @@ "aXY" = (/obj/structure/sign/directions/engineering{dir = 8; pixel_y = -32; pixel_z = 8},/obj/structure/sign/directions/security{dir = 8; pixel_y = -32},/obj/structure/sign/directions/cargo{dir = 8; pixel_y = -32; pixel_z = -8},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) "aXZ" = (/obj/structure/sign/directions/science{dir = 8; pixel_y = -32; pixel_z = 8},/obj/structure/sign/directions/medical{dir = 8; pixel_y = -32},/obj/structure/sign/directions/evac{dir = 8; pixel_y = -32; pixel_z = -8},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) "aYa" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) -"aYb" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/recreation_area_hallway) +"aYb" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor/tiled,/area/maintenance/engineering/pumpstation) "aYc" = (/obj/structure/closet,/obj/item/clothing/head/ushanka,/turf/simulated/floor/plating,/area/maintenance/pool) "aYd" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/maintenance/pool) "aYe" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor,/area/maintenance/pool) @@ -2636,7 +2637,7 @@ "aYK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/recreation_area_hallway) "aYL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/recreation_area_hallway) "aYM" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/crew_quarters/recreation_area_hallway) -"aYN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/crew_quarters/recreation_area_hallway) +"aYN" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor,/area/maintenance/medbay_fore) "aYO" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/escape/fore_port_escape_pod_hallway) "aYP" = (/turf/simulated/wall,/area/gateway) "aYQ" = (/obj/structure/extinguisher_cabinet{pixel_x = -27},/turf/simulated/floor/tiled/dark,/area/gateway) @@ -2849,7 +2850,7 @@ "bcP" = (/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/corner/yellow{dir = 5},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop) "bcQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/yellow{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop) "bcR" = (/turf/simulated/wall,/area/medical/surgery_storage) -"bcS" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_fore) +"bcS" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/engineering{name = "Pump Station"; req_one_access = list(11,24)},/turf/simulated/floor,/area/maintenance/medbay_fore) "bcT" = (/obj/machinery/floodlight,/turf/simulated/floor,/area/maintenance/medbay_fore) "bcU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/research{name = "Research Division Auxiliary Access"; req_access = list(47)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/rnd/research_foyer_auxiliary) "bcV" = (/obj/machinery/lapvend,/turf/simulated/floor/tiled,/area/gateway) @@ -2896,7 +2897,7 @@ "bdK" = (/obj/structure/closet/crate/freezer,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) "bdL" = (/obj/machinery/iv_drip,/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) "bdM" = (/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/turf/simulated/floor,/area/maintenance/medbay_fore) -"bdN" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_fore) +"bdN" = (/obj/random/powercell,/obj/random/powercell,/obj/random/powercell,/obj/random/powercell,/obj/random/toolbox,/obj/effect/decal/cleanable/molten_item,/obj/structure/closet/crate,/turf/simulated/floor,/area/maintenance/medbay_fore) "bdO" = (/turf/simulated/floor,/area/maintenance/medbay_fore) "bdP" = (/turf/simulated/wall/r_wall,/area/rnd/research_storage) "bdQ" = (/obj/effect/floor_decal/corner/purple{dir = 9},/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/rnd/research) @@ -2974,8 +2975,8 @@ "bfk" = (/obj/structure/bed/chair/wood{dir = 4},/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop) "bfl" = (/obj/machinery/door/airlock/maintenance{name = "Operating Theatre Maintenance Access"; req_access = list(45)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) "bfm" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor,/area/maintenance/medbay_fore) -"bfn" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/maintenance/medbay_fore) -"bfo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/maintenance/medbay_fore) +"bfn" = (/obj/structure/table/standard,/obj/effect/floor_decal/corner/brown{dir = 9},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/item/stack/material/steel/fifty,/obj/item/stack/material/glass/fifty,/obj/item/device/multitool,/turf/simulated/floor/tiled,/area/quartermaster/office) +"bfo" = (/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,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "bfp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/maintenance/medbay_fore) "bfq" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor,/area/rnd/research_storage) "bfr" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/rnd/research_storage) @@ -3021,8 +3022,8 @@ "bgf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/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/freezer,/area/medical/surgery_storage) "bgg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) "bgh" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) -"bgi" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/maintenance/medbay_fore) -"bgj" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/maintenance/medbay_fore) +"bgi" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = list(10,12)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/atmos/storage) +"bgj" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/vacant/vacant_shop) "bgk" = (/turf/simulated/wall,/area/crew_quarters/medbreak) "bgl" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/maintenance/medbay_fore) "bgm" = (/turf/simulated/wall/r_wall,/area/medical/virology) @@ -4505,6 +4506,7 @@ "bIH" = (/obj/effect/floor_decal/corner/blue{dir = 5},/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = 28},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bII" = (/obj/structure/table/reinforced,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 30},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bIJ" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/effect/floor_decal/corner/blue/full{dir = 1},/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bIK" = (/obj/machinery/door/airlock/command{name = "Station Administrator's Quarters"; req_access = list(20)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bIL" = (/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/bridge_hallway) "bIM" = (/obj/effect/floor_decal/corner/blue{dir = 6},/obj/structure/table/standard,/obj/item/weapon/storage/box/cups,/turf/simulated/floor/tiled,/area/bridge_hallway) "bIN" = (/obj/machinery/cell_charger,/obj/structure/table/steel,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/substation/command) @@ -4514,6 +4516,7 @@ "bIR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) "bIS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) "bIT" = (/obj/structure/closet/crate/freezer,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/kitchen) +"bIU" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"; tag = "icon-spiderling"},/turf/simulated/floor,/area/maintenance/medbay_fore) "bIV" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bIW" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/material/knife/butch,/obj/item/weapon/material/kitchen/rollingpin,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bIX" = (/obj/machinery/smartfridge,/turf/simulated/wall,/area/crew_quarters/kitchen) @@ -4649,6 +4652,7 @@ "bLx" = (/obj/effect/floor_decal/corner/purple{dir = 6},/turf/simulated/floor/tiled/white,/area/rnd/rdoffice) "bLy" = (/obj/structure/table/standard,/obj/item/weapon/cartridge/signal/science,/obj/item/weapon/cartridge/signal/science{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/science{pixel_x = 4; pixel_y = 6},/obj/item/clothing/glasses/welding/superior,/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; pixel_x = 30; pixel_y = -2},/turf/simulated/floor/tiled/dark,/area/rnd/rdoffice) "bLz" = (/obj/structure/closet{name = "robotics parts"},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/effect/floor_decal/corner/pink{dir = 6},/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"bLA" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/effect/landmark/start{name = "Station Administrator"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bLB" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bLC" = (/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/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/pen/red,/obj/item/weapon/pen/blue,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bLD" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Exterior Airlock"; req_access = list(39)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -24; pixel_y = 0; req_access = list(39)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/black,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/virology) @@ -4757,8 +4761,10 @@ "bNC" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain) "bND" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bNE" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bNF" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/machinery/button/remote/airlock{desc = "A remote control switch for the Starboard Bridge Doors."; id = "sbridgedoor"; name = "Starboard Bridge Door Control"; pixel_x = 4; pixel_y = -6},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the captain's office."; id = "captaindoor"; name = "Station Administrator's Office Door Control"; pixel_x = 4; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bNG" = (/obj/structure/table/woodentable,/obj/machinery/light,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop) "bNH" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bNI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/atmos/storage) "bNJ" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/camera/network/civilian{c_tag = "CIV - Kitchen Starboard"; dir = 8},/obj/structure/closet/secure_closet/freezer/meat,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bNK" = (/obj/effect/floor_decal/corner/lime/full,/obj/item/weapon/reagent_containers/glass/bucket,/obj/structure/table/standard{name = "plastic table frame"},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled,/area/hydroponics) "bNL" = (/obj/effect/floor_decal/corner/lime{dir = 8},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics) @@ -4860,6 +4866,7 @@ "bPD" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bPE" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/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/kitchen) "bPF" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bPG" = (/obj/machinery/power/breakerbox/activated{RCon_tag = "Atmos Substation Bypass"},/turf/simulated/floor,/area/engineering/atmos/storage) "bPH" = (/obj/structure/closet/secure_closet/freezer/kitchen,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bPI" = (/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,/turf/simulated/floor/plating,/area/hydroponics) "bPJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hydroponics) @@ -4905,7 +4912,9 @@ "bQx" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/virologyaccess) "bQy" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/camera/network/medbay{c_tag = "MED - Virology Access"; dir = 1},/turf/simulated/floor/tiled,/area/medical/virologyaccess) "bQz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/lime{dir = 6},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"bQA" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/item/weapon/tank/oxygen/yellow,/obj/item/weapon/tank/oxygen/yellow,/turf/simulated/floor,/area/engineering/atmos/storage) "bQB" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/medical/virologyaccess) +"bQC" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/security/main) "bQD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/virologyaccess) "bQE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/virologyaccess) "bQF" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/mining/station) @@ -4936,6 +4945,7 @@ "bRe" = (/obj/structure/table/rack,/obj/item/weapon/rig/hazmat/equipped,/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/rnd/rdoffice) "bRf" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics) "bRg" = (/obj/machinery/optable{name = "Robotics Operating Table"},/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"bRh" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable,/turf/simulated/floor,/area/engineering/atmos/storage) "bRi" = (/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},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics) "bRj" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/effect/floor_decal/corner/pink{dir = 6},/obj/item/weapon/storage/toolbox/mechanical,/obj/item/device/multitool{pixel_x = 3},/obj/item/device/multitool{pixel_x = 3},/obj/item/weapon/crowbar,/obj/item/weapon/crowbar,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/item/weapon/storage/toolbox/electrical{pixel_x = 1; pixel_y = 6},/turf/simulated/floor/tiled,/area/assembly/robotics) "bRk" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled,/area/assembly/robotics) @@ -4959,6 +4969,7 @@ "bRC" = (/obj/machinery/door/airlock{name = "Private Restroom"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/captain) "bRD" = (/turf/simulated/floor/tiled/freezer,/area/crew_quarters/captain) "bRE" = (/obj/structure/toilet{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/captain) +"bRF" = (/obj/machinery/power/smes/buildable{charge = 2e+006; RCon_tag = "Substation - Atmospherics"},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/structure/cable/cyan,/turf/simulated/floor,/area/engineering/atmos/storage) "bRG" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bRH" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/light,/obj/machinery/button/remote/blast_door{id = "kitchen"; name = "Kitchen Shutters Control"; pixel_x = -1; pixel_y = -24; req_access = list(28)},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bRI" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) @@ -5081,7 +5092,7 @@ "bTV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bTW" = (/obj/machinery/iv_drip,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bTX" = (/obj/structure/closet/l3closet/medical,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) -"bTY" = (/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; listening = 1; name = "Captain's Intercom"; pixel_x = 21; pixel_y = 0},/obj/structure/table/woodentable,/obj/item/weapon/folder/blue_captain,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bTY" = (/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; listening = 1; name = "Station Administrator's Intercom"; pixel_x = 21; pixel_y = 0},/obj/structure/table/woodentable,/obj/item/weapon/folder/blue_captain,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bTZ" = (/obj/structure/bedsheetbin,/obj/structure/table/steel,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bUa" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/floodlight,/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor,/area/maintenance/medbay_aft) "bUb" = (/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/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_aft) @@ -5125,7 +5136,7 @@ "bUN" = (/obj/effect/floor_decal/corner/blue{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/bridge_hallway) "bUO" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue{dir = 6},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/bridge_hallway) "bUP" = (/turf/simulated/wall/r_wall,/area/bridge_hallway) -"bUQ" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = list(20)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"bUQ" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/blue,/obj/item/weapon/pen,/obj/item/device/megaphone,/obj/machinery/requests_console{announcementConsole = 1; department = "Station Administrator's Desk"; departmentType = 5; name = "Station Administrator RC"; pixel_x = 30; pixel_y = 0},/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bUR" = (/turf/simulated/wall,/area/crew_quarters/cafeteria) "bUS" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 1; freq = 1400; location = "Medbay"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/medical/patient_wing) "bUT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) @@ -5219,6 +5230,7 @@ "bWD" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bWE" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/clothing/mask/gas,/obj/item/clothing/suit/armor/captain,/obj/item/clothing/head/helmet/space/capspace,/obj/machinery/newscaster/security_unit{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bWF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/central) +"bWG" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/engineering/atmos/storage) "bWH" = (/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/tiled,/area/crew_quarters/cafeteria) "bWI" = (/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/tiled/neutral,/area/crew_quarters/cafeteria) "bWJ" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) @@ -5302,7 +5314,7 @@ "bYj" = (/obj/structure/bed/chair/comfy/brown,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bYk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bYl" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor,/area/maintenance/cargo) -"bYm" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/effect/landmark/start{name = "Captain"},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bYm" = (/obj/machinery/door/airlock/command{id_tag = "captaindoor"; name = "Station Administrator's Office"; req_access = list(20)},/obj/structure/disposalpipe/segment,/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/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/crew_quarters/captain) "bYn" = (/turf/simulated/floor/wood,/area/crew_quarters/captain) "bYo" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/machinery/light{dir = 1},/obj/machinery/computer/security/telescreen/entertainment{pixel_y = 32},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria) "bYp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/central) @@ -5361,7 +5373,7 @@ "bZq" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/captain,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bZr" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills,/obj/item/weapon/hand_tele,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bZs" = (/obj/machinery/door/window/southright{name = "Captain's Desk Door"; req_access = list(20)},/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bZt" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/blue,/obj/item/weapon/pen,/obj/item/device/megaphone,/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain RC"; pixel_x = 30; pixel_y = 0},/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bZt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos/storage) "bZu" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) "bZv" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "bZw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) @@ -5421,6 +5433,7 @@ "cay" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain) "caz" = (/obj/structure/filingcabinet,/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "caA" = (/obj/machinery/recharge_station,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) +"caB" = (/obj/structure/disposalpipe/segment,/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,/area/engineering/atmos/storage) "caC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) "caD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "caE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) @@ -5501,6 +5514,7 @@ "ccb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "ccc" = (/obj/structure/table/rack,/obj/item/clothing/suit/radiation,/obj/item/clothing/head/radiation,/obj/item/weapon/storage/toolbox/emergency,/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 2; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = -21},/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "ccd" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"cce" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engineering/atmos/storage) "ccf" = (/obj/effect/floor_decal/corner/pink{dir = 9},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) "ccg" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/effect/floor_decal/corner/pink{dir = 6},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) "cch" = (/obj/effect/floor_decal/corner/pink/full,/obj/machinery/computer/med_data/laptop,/obj/structure/table/glass,/obj/machinery/light,/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -21},/turf/simulated/floor/tiled/white,/area/medical/patient_e) @@ -5534,7 +5548,7 @@ "ccJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/bridge) "ccK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/bridge) "ccL" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/blue{dir = 6},/turf/simulated/floor/tiled,/area/bridge) -"ccM" = (/obj/machinery/door/airlock/command{id_tag = "captaindoor"; name = "Captain's Office"; req_access = list(20)},/obj/structure/disposalpipe/segment,/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/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/crew_quarters/captain) +"ccM" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/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,/area/engineering/atmos/storage) "ccN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain) "ccO" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Captain's Office"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "ccP" = (/turf/simulated/wall,/area/crew_quarters/captain) @@ -5581,6 +5595,7 @@ "cdE" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "cdF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "cdG" = (/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) +"cdH" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/engineering/atmos/storage) "cdI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "cdJ" = (/obj/structure/table/standard,/obj/item/weapon/material/kitchen/utensil/fork,/obj/item/weapon/material/kitchen/utensil/spoon{pixel_x = 2},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "cdK" = (/obj/structure/table/standard,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) @@ -5710,6 +5725,7 @@ "cge" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) "cgf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) "cgg" = (/obj/structure/closet/emcloset,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/medical_emergency_hallway) +"cgh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos) "cgi" = (/obj/structure/closet,/obj/item/clothing/glasses/welding,/obj/item/weapon/weldingtool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay_aft) "cgj" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay_aft) "cgk" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor,/area/maintenance/medbay_aft) @@ -5902,6 +5918,7 @@ "cjP" = (/obj/machinery/photocopier,/obj/effect/floor_decal/corner/brown/full{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) "cjQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/miningdock) "cjR" = (/obj/machinery/door/airlock/mining{id_tag = "cargodoor"; name = "Mining Dock"; req_access = list(50)},/obj/machinery/door/firedoor/border_only,/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/tiled,/area/quartermaster/miningdock) +"cjS" = (/obj/effect/decal/warning_stripes,/obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/visible/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos) "cjT" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/delivery) "cjU" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor,/area/quartermaster/delivery) "cjV" = (/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,/area/maintenance/substation/cargo) @@ -5933,6 +5950,7 @@ "ckv" = (/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access = list(50)},/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/tiled,/area/quartermaster/delivery) "ckw" = (/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/quartermaster/delivery) "ckx" = (/obj/effect/floor_decal/corner/brown{dir = 5},/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/light{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/delivery) +"cky" = (/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"},/turf/simulated/floor/tiled,/area/engineering/atmos) "ckz" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/firealarm{dir = 4; pixel_x = 26},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/delivery) "ckA" = (/obj/structure/plasticflaps{opacity = 0},/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor,/area/quartermaster/delivery) "ckB" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/substation/cargo) @@ -6013,6 +6031,7 @@ "clY" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/storage/tech) "clZ" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria) "cma" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/office) +"cmb" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold/visible/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cmc" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/quartermaster/office) "cmd" = (/obj/machinery/door/airlock/glass_mining{id_tag = "cargodoor"; name = "Cargo Office"; req_access = list(50)},/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/quartermaster/miningdock) "cme" = (/obj/structure/table/steel,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/effect/floor_decal/corner/brown{dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/tiled,/area/quartermaster/delivery) @@ -6023,6 +6042,9 @@ "cmj" = (/turf/simulated/wall,/area/storage/emergency_storage/emergency6) "cmk" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/storage/tools) "cml" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/storage/tools) +"cmm" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/meter{frequency = 1443; id = "wloop_atm_meter"; name = "Waste Loop"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cmn" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cmo" = (/obj/machinery/atmospherics/binary/pump/on{name = "Scrubber to Waste"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cmp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_three) "cmq" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/crew{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/card{pixel_x = 2; pixel_y = -2},/obj/item/weapon/circuitboard/communications{pixel_x = 5; pixel_y = -5},/obj/machinery/light/small{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/storage/tech) "cmr" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/storage/tech) @@ -6071,6 +6093,9 @@ "cni" = (/obj/machinery/floodlight,/turf/simulated/floor,/area/storage/emergency_storage/emergency6) "cnj" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency6) "cnk" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency6) +"cnl" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible/red,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cnm" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cnn" = (/obj/machinery/atmospherics/valve/digital/open,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cno" = (/obj/structure/closet/wardrobe/grey,/obj/item/weapon/storage/backpack,/obj/item/weapon/storage/backpack,/turf/simulated/floor/plating,/area/maintenance/cargo) "cnp" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/tiled/dark,/area/storage/tech) "cnq" = (/turf/simulated/floor/tiled/dark,/area/storage/tech) @@ -6118,6 +6143,9 @@ "cog" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor,/area/storage/emergency_storage/emergency6) "coh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/storage/emergency_storage/emergency6) "coi" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/storage/emergency_storage/emergency6) +"coj" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (WEST)"; icon_state = "map"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cok" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/meter,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"col" = (/obj/structure/window/reinforced,/obj/structure/closet/firecloset,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering/atmos) "com" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/cell_charger,/obj/structure/table/steel,/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled,/area/storage/tools) "con" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/cargo) "coo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/delivery) @@ -6163,7 +6191,12 @@ "cpc" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/delivery) "cpd" = (/obj/structure/table/standard,/obj/item/device/t_scanner,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency6) "cpe" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency6) +"cpf" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpg" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cph" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpi" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Starboard"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpj" = (/turf/simulated/wall,/area/hallway/primary/port) +"cpk" = (/obj/machinery/atmospherics/tvalve/mirrored/digital{name = "Waste to Space"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpl" = (/obj/machinery/cell_charger{pixel_y = 5},/obj/item/device/multitool,/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech) "cpm" = (/obj/machinery/light/small,/turf/simulated/floor,/area/storage/tech) "cpn" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor,/area/storage/tech) @@ -6189,7 +6222,7 @@ "cpH" = (/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) "cpI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/maintenance/medbay_aft) "cpJ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/maintenance/medbay_aft) -"cpK" = (/obj/structure/table/standard,/obj/item/stack/material/glass{pixel_x = 3; pixel_y = 3},/obj/item/stack/material/steel,/obj/item/device/multitool,/obj/effect/floor_decal/corner/brown{dir = 9},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/tiled,/area/quartermaster/office) +"cpK" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office) "cpM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) "cpN" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/office) @@ -6205,6 +6238,7 @@ "cpX" = (/turf/simulated/wall,/area/hallway/secondary/cargo_hallway) "cpY" = (/obj/machinery/door/airlock{name = "Cargo Emergency Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency6) "cpZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/storage/tools) +"cqa" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cqb" = (/obj/structure/bed/chair,/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 1; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 21},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/large_escape_pod1/station) "cqc" = (/obj/structure/table/rack,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/medbay_aft) "cqd" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) @@ -6234,7 +6268,7 @@ "cqB" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "cqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/medbay_aft) "cqD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_aft) -"cqE" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/machinery/button/remote/airlock{desc = "A remote control switch for the Starboard Bridge Doors."; id = "sbridgedoor"; name = "Starboard Bridge Door Control"; pixel_x = 4; pixel_y = -6},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the captain's office."; id = "captaindoor"; name = "Captain's Office Door Control"; pixel_x = 4; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"cqE" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cqF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/office) "cqG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/quartermaster/office) "cqH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/quartermaster/office) @@ -6257,7 +6291,10 @@ "cqY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) "cqZ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) "cra" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) +"crb" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 1; tag_south = 7; tag_west = 2; use_power = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"crc" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "crd" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) +"cre" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "crf" = (/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) "crg" = (/obj/effect/floor_decal/corner/brown{dir = 5},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) "crh" = (/obj/machinery/door/airlock/glass{name = "Cargo Access"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) @@ -6364,14 +6401,18 @@ "cte" = (/obj/machinery/computer/arcade,/turf/simulated/floor/wood,/area/crew_quarters/bar) "ctf" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_5) "ctg" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_5) +"cth" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) "cti" = (/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "ctj" = (/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,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"ctk" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/engineering/atmos) "ctl" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) "ctm" = (/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/crew_quarters/sleep/elevator) "ctn" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_11) "cto" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_11) +"ctp" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) "ctq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "ctr" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"cts" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Transit"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) "ctt" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) "ctu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway) "ctv" = (/obj/structure/table/standard,/obj/item/weapon/tape_roll,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/obj/effect/floor_decal/corner/brown/full,/turf/simulated/floor/tiled,/area/quartermaster/office) @@ -6426,6 +6467,8 @@ "cus" = (/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cut" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cuu" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) +"cuv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cuw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "cux" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_5) "cuy" = (/obj/effect/floor_decal/corner/lime{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/smartfridge/drying_rack,/turf/simulated/floor/tiled,/area/hydroponics) "cuz" = (/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) @@ -6434,15 +6477,19 @@ "cuC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) "cuD" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) "cuE" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) +"cuF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cuG" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) +"cuH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = list(10,12)},/obj/machinery/door/firedoor,/turf/simulated/floor,/area/maintenance/atmos_control) "cuI" = (/obj/item/frame/light,/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/vacant/vacant_shop) "cuJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_11) +"cuK" = (/turf/simulated/wall/r_wall,/area/maintenance/atmos_control) "cuL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cuM" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cuN" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) "cuO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) "cuP" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) "cuQ" = (/obj/structure/closet/secure_closet/personal,/obj/item/clothing/head/kitty,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_12) +"cuR" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Drone Fabrication"; name = "Drone Fabrication"},/turf/simulated/floor/tiled,/area/engineering/workshop) "cuS" = (/turf/simulated/wall,/area/quartermaster/storage) "cuT" = (/obj/structure/curtain/open/shower,/obj/machinery/door/window/southright{name = "Shower"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) "cuU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/storage) @@ -6473,21 +6520,28 @@ "cvt" = (/obj/machinery/atm{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) "cvu" = (/obj/structure/bed/chair/wood/wings,/turf/simulated/floor/wood,/area/crew_quarters/bar) "cvv" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_engineeringatmos{name = "Engineering Break Room"; req_one_access = list(10)},/turf/simulated/floor/tiled,/area/engineering/break_room) +"cvw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/atmos_control) "cvx" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cvy" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_5) +"cvz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "cvA" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cvB" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) +"cvC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/maintenance{req_one_access = list(11,24)},/obj/machinery/door/firedoor,/turf/simulated/floor,/area/maintenance/atmos_control) "cvD" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) +"cvE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cvF" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) "cvG" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_11) "cvH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cvI" = (/obj/effect/floor_decal/corner/white{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cvJ" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) +"cvK" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cvL" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_12) "cvM" = (/turf/space,/area/supply/station) "cvN" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Port Primary 1"; dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) "cvO" = (/obj/structure/closet/emcloset,/obj/machinery/status_display/supply_display{pixel_y = 32},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cvP" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"cvQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) +"cvR" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cvS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/storage) "cvT" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/storage) "cvU" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #3"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/storage) @@ -6584,6 +6638,7 @@ "cxH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/crew_quarters/sleep/elevator) "cxI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/sleep/elevator) "cxJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/crew_quarters/sleep/elevator) +"cxK" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cxL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway) "cxM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway) "cxN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/storage) @@ -6596,6 +6651,7 @@ "cxU" = (/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/vacant/vacant_shop) "cxV" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cxW" = (/obj/machinery/door/airlock/glass_medical{name = "First-Aid Station"; req_one_access = list(5,10,63)},/obj/structure/cable{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/white,/area/medical/first_aid_station) +"cxX" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cxY" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cxZ" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cya" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) @@ -6666,7 +6722,7 @@ "czn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/crew_quarters/bar) "czo" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "czp" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) -"czq" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"czq" = (/obj/machinery/door/airlock/maintenance{name = "Engine Waste Handling"; req_one_access = list(10,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/engineering/engine_waste) "czr" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/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) "czs" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor,/area/quartermaster/storage) "czt" = (/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) @@ -6713,17 +6769,21 @@ "cAi" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_3) "cAj" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_3) "cAk" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) +"cAl" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/engineering/engine_waste) "cAm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cAn" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cAo" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_4) +"cAp" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Master Grid"; name_tag = "Master"},/turf/simulated/floor,/area/engineering/engine_waste) "cAq" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) "cAr" = (/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/quartermaster/qm) "cAs" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_9) "cAt" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_9) "cAu" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) +"cAv" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) "cAw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cAx" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cAy" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_10) +"cAz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/engineering/workshop) "cAA" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_10) "cAB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "cAC" = (/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) @@ -6801,16 +6861,24 @@ "cBW" = (/obj/machinery/atmospherics/pipe/tank/air,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor,/area/maintenance/bar) "cBX" = (/obj/structure/table/rack{dir = 4},/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/bar) "cBY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/lime{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/virology) +"cBZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cCa" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) "cCb" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cCc" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_4) "cCd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cCe" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_4) "cCf" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_4) +"cCg" = (/obj/structure/table/reinforced,/obj/item/device/floor_painter,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/t_scanner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 3; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled,/area/engineering/workshop) +"cCh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/atmos_control) +"cCi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sign/nosmoking_1{pixel_x = -32},/turf/simulated/floor,/area/maintenance/atmos_control) +"cCj" = (/obj/structure/closet/crate,/obj/item/weapon/deck/tarot,/obj/item/weapon/coin/gold,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/weapon/flame/lighter/zippo,/turf/simulated/floor,/area/maintenance/atmos_control) "cCk" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "cCl" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_9) "cCm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cCn" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_10) "cCo" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) +"cCp" = (/obj/machinery/computer/cryopod/robot{pixel_y = 30},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "ENG - Drone Fabrication"; dir = 2},/obj/structure/bed/chair,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) +"cCq" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor,/area/engineering/drone_fabrication) "cCr" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cCs" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/vehicle/train/cargo/trolley,/obj/machinery/camera/network/cargo{c_tag = "CRG - Cargo Bay Starboard"; dir = 8; name = "security camera"},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cCt" = (/turf/simulated/wall,/area/quartermaster/warehouse) @@ -6869,6 +6937,7 @@ "cDu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cDv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cDw" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) +"cDx" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cDy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_3) "cDz" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Room 3"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cDA" = (/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/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) @@ -6884,6 +6953,7 @@ "cDK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "cDL" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "cDM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_9) +"cDN" = (/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/maintenance/atmos_control) "cDO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Room 9"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "cDP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Room 10"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) "cDQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) @@ -7038,8 +7108,8 @@ "cGJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/warehouse) "cGK" = (/turf/simulated/floor/tiled,/area/quartermaster/warehouse) "cGL" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/crate,/turf/simulated/floor/tiled/steel,/area/quartermaster/warehouse) -"cGM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/floor_decal/industrial/warning,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/apmaint) -"cGN" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/maintenance/apmaint) +"cGM" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/maintenance/atmos_control) +"cGN" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/maintenance/atmos_control) "cGO" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "cGP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "cGQ" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 1},/obj/machinery/cell_charger,/turf/simulated/floor/tiled,/area/assembly/robotics) @@ -7079,6 +7149,7 @@ "cHy" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_1) "cHz" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_1) "cHA" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_4) +"cHB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/drone_fabrication) "cHC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cHD" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cHE" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_2) @@ -7088,9 +7159,11 @@ "cHI" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_7) "cHJ" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_7) "cHK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) +"cHL" = (/turf/simulated/floor,/area/maintenance/atmos_control) "cHM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cHN" = (/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/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cHO" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_8) +"cHP" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cHQ" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_8) "cHR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) "cHS" = (/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) @@ -7158,7 +7231,7 @@ "cJc" = (/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) "cJd" = (/obj/machinery/camera/network/engineering{c_tag = "Atmos Tank - Gas Mixing"; dir = 2},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) "cJe" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) -"cJf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = list(10,12)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/atmos/storage) +"cJf" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/industrial/warning,/obj/machinery/light,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cJg" = (/turf/simulated/wall,/area/engineering/atmos/storage) "cJh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "cJi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) @@ -7211,9 +7284,6 @@ "cKd" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) "cKe" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) "cKf" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) -"cKg" = (/obj/machinery/power/terminal,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/oxygen/yellow,/obj/item/weapon/tank/oxygen/yellow,/turf/simulated/floor,/area/engineering/atmos/storage) -"cKh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/atmos/storage) -"cKi" = (/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor,/area/engineering/atmos/storage) "cKj" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/monitoring) "cKk" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "cKl" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light_switch{pixel_x = 0; pixel_y = -27},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) @@ -7274,8 +7344,6 @@ "cLq" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1441; icon_state = "map_injector"; id = "waste_in"; pixel_y = 1; use_power = 1},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) "cLr" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) "cLs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0; use_power = 1},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) -"cLt" = (/obj/machinery/power/smes/buildable{charge = 2e+006; RCon_tag = "Substation - Atmospherics"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor,/area/engineering/atmos/storage) -"cLu" = (/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/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/engineering/atmos/storage) "cLv" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/tiled,/area/vacant/vacant_shop) "cLw" = (/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Engine Waste")},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "cLx" = (/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7346,7 +7414,6 @@ "cMM" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/engineering/atmos) "cMN" = (/turf/simulated/wall/r_wall,/area/engineering/atmos) "cMO" = (/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos) -"cMP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/atmos) "cMQ" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "cMR" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "cMS" = (/obj/machinery/newscaster{pixel_x = 28; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7410,7 +7477,6 @@ "cOa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table/standard,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmos RC"; pixel_x = 0; pixel_y = 28},/obj/item/device/t_scanner,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/radio/headset/headset_eng,/obj/item/weapon/cartridge/atmos,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/item/clothing/ears/earmuffs,/obj/item/clothing/ears/earmuffs,/obj/item/weapon/cartridge/atmos,/obj/item/device/pipe_painter,/turf/simulated/floor/tiled,/area/engineering/atmos) "cOb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/standard,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/cell_charger,/obj/item/weapon/wrench,/turf/simulated/floor/tiled,/area/engineering/atmos) "cOc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/standard,/obj/machinery/newscaster{pixel_y = 30},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Fore Starboard"; dir = 2},/turf/simulated/floor/tiled,/area/engineering/atmos) -"cOd" = (/obj/effect/decal/warning_stripes,/obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/visible/supply,/turf/simulated/floor,/area/engineering/atmos) "cOe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos) "cOf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "cOg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7495,7 +7561,6 @@ "cPK" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos) "cPL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/standard,/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/turf/simulated/floor/tiled,/area/engineering/atmos) "cPM" = (/turf/simulated/floor/tiled,/area/engineering/atmos) -"cPN" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/turf/simulated/floor/tiled,/area/engineering/atmos) "cPO" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos) "cPP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "ceoffice"; name = "CE Office Privacy Shutters"; opacity = 0},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) "cPQ" = (/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7577,7 +7642,6 @@ "cRp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cRq" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cRr" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) -"cRs" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold/visible/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cRt" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 10},/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Atmospherics"; name = "Atmospherics"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cRu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/break_room) "cRv" = (/obj/machinery/computer/atmos_alert,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7645,7 +7709,6 @@ "cSG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "cSH" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/engineering/atmos) "cSI" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/engineering/atmos) -"cSJ" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/meter{frequency = 1443; id = "wloop_atm_meter"; name = "Waste Loop"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cSK" = (/obj/machinery/meter{frequency = 1443; id = "dloop_atm_meter"; name = "Distribution Loop"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos) "cSL" = (/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/engineering/atmos/monitoring) "cSM" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7757,7 +7820,6 @@ "cUQ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos) "cUR" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "cUS" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos) -"cUT" = (/obj/machinery/atmospherics/binary/pump/on{name = "Scrubber to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cUU" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; name = "Air to Supply"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cUV" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cUW" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -7801,7 +7863,6 @@ "cVI" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos) "cVJ" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos) "cVK" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) -"cVL" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos) "cVM" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos) "cVN" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos) "cVO" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -7907,7 +7968,6 @@ "cXL" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos) "cXM" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/engineering/atmos) "cXN" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/engineering/atmos) -"cXO" = (/obj/machinery/atmospherics/valve/digital/open,/turf/simulated/floor/tiled,/area/engineering/atmos) "cXP" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos) "cXQ" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; name = "Air to Ports"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cXR" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -7989,7 +8049,6 @@ "cZs" = (/obj/structure/dispenser,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cZt" = (/turf/simulated/wall,/area/engineering/atmos) "cZu" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/engineering/atmos) -"cZv" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (WEST)"; icon_state = "map"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "cZw" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cZx" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8; name = "Ports to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cZy" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -8057,7 +8116,6 @@ "daN" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) "daP" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "daQ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Port to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) -"daR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering/atmos) "daS" = (/turf/simulated/wall/r_wall,/area/engineering/workshop) "daT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "daU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/workshop) @@ -8131,7 +8189,6 @@ "dcn" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) "dco" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "dcp" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) -"dcq" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "dcr" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) "dcs" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/corner/yellow{dir = 9},/turf/simulated/floor/tiled,/area/engineering/workshop) "dct" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/engineering/workshop) @@ -8171,7 +8228,6 @@ "ddb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engineering/workshop) "ddc" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry/D2) "ddd" = (/turf/simulated/wall,/area/hallway/secondary/entry/D2) -"dde" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(11,24)},/turf/simulated/floor,/area/vacant/vacant_shop) "ddf" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D2) "ddg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/engineering) "ddh" = (/turf/simulated/wall/r_wall,/area/hallway/secondary/entry/starboard) @@ -8191,11 +8247,9 @@ "ddv" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "ddw" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos) "ddx" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) -"ddy" = (/obj/machinery/atmospherics/tvalve/mirrored/digital{name = "Waste to Space"},/turf/simulated/floor/tiled,/area/engineering/atmos) "ddz" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "ddA" = (/obj/machinery/atmospherics/valve/digital,/turf/simulated/floor/tiled,/area/engineering/atmos) "ddB" = (/obj/structure/window/reinforced,/obj/structure/closet/firecloset,/turf/simulated/floor/tiled,/area/engineering/atmos) -"ddC" = (/obj/structure/window/reinforced,/obj/structure/closet/firecloset,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Starboard"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "ddD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "ddE" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/workshop) "ddF" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled,/area/engineering/workshop) @@ -8245,15 +8299,11 @@ "dex" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "dey" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos) "dez" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 2; tag_south = 5; tag_west = 4; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) -"deA" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) -"deB" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor/tiled,/area/engineering/atmos) "deC" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/red{dir = 1},/turf/simulated/wall/r_wall,/area/engineering/workshop) "deD" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/engineering/workshop) "deE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "deF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/workshop) "deG" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/workshop) -"deH" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Drone Fabrication"; name = "Drone Fabrication"},/turf/simulated/floor/tiled,/area/engineering/workshop) -"deI" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "deJ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; name = "Engineering"; sortType = "Engineering"},/turf/simulated/floor/tiled,/area/engineering/workshop) "deK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_engineeringatmos{name = "Engineering Workshop"; req_one_access = list(11,24)},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "deL" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/turf/simulated/floor/tiled,/area/engineering) @@ -8292,15 +8342,11 @@ "dfs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) "dft" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "dfu" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 0; tag_south = 6; tag_west = 2; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) -"dfv" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 1; tag_south = 7; tag_west = 2; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "dfw" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) -"dfx" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/engineering/atmos) "dfy" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{dir = 5; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/turf/simulated/wall/r_wall,/area/engineering/workshop) "dfz" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/camera/network/engineering{c_tag = "ENG - Workshop Port"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "dfA" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/closet/secure_closet/engineering_electrical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/workshop) "dfB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D2) -"dfC" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) -"dfD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/workshop) "dfE" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/camera/network/engineering{c_tag = "ENG - Workshop Starboard"; dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) "dfF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) "dfG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled,/area/engineering) @@ -8340,13 +8386,10 @@ "dgo" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 5; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/turf/simulated/floor/tiled,/area/engineering/atmos) "dgp" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "dgq" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 10; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) -"dgr" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) -"dgs" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "dgt" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/engineering/workshop) "dgu" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/engineering/workshop) "dgv" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/closet/secure_closet/engineering_electrical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/engineering/workshop) "dgw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1) -"dgx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) "dgy" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light_switch{pixel_x = 27},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) "dgz" = (/turf/simulated/wall,/area/engineering/workshop) "dgA" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) @@ -8376,13 +8419,11 @@ "dgY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2 to Connector"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/atmos) "dgZ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "CO2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos) "dha" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) -"dhb" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Transit"},/turf/simulated/floor/tiled,/area/engineering/atmos) "dhc" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "dhd" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/tiled,/area/engineering/atmos) "dhe" = (/obj/machinery/vending/engivend,/turf/simulated/floor/tiled,/area/engineering/workshop) "dhf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/lino,/area/crew_quarters/bar) "dhg" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/super/critical{dir = 4; is_critical = 1; name = "east bump"; pixel_x = 24; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1) -"dhh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/tiled,/area/engineering/workshop) "dhi" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/engineering/workshop) "dhj" = (/obj/machinery/camera/network/engineering{c_tag = "ENG - Hallway Fore"; dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering) "dhk" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering) @@ -8430,7 +8471,6 @@ "dia" = (/obj/machinery/atmospherics/valve/digital{name = "N2O Outlet Valve"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/engineering/atmos) "dib" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos) "dic" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) -"did" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/tiled,/area/engineering/atmos) "die" = (/obj/structure/closet/toolcloset,/obj/item/device/flashlight,/turf/simulated/floor/tiled,/area/engineering/workshop) "dif" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3) "dig" = (/obj/structure/table/reinforced,/obj/item/device/radio/off{pixel_y = 6},/obj/item/device/radio/off{pixel_x = 6; pixel_y = 4},/obj/item/device/radio/off{pixel_x = -6; pixel_y = 4},/obj/item/device/radio/off,/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled,/area/engineering/workshop) @@ -8465,8 +8505,6 @@ "diJ" = (/obj/structure/table/reinforced,/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 = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/engineering/workshop) "diK" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/electrical,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/tiled,/area/engineering/workshop) "diL" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos) -"diM" = (/obj/structure/table/reinforced,/obj/item/device/floor_painter,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/t_scanner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 3; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) -"diN" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/tiled,/area/engineering/workshop) "diO" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/workshop) "diP" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Engineering Subgrid"; name_tag = "Engineering Subgrid"},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor,/area/maintenance/substation/engineering) "diQ" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Engineering"},/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/engineering) @@ -8515,10 +8553,6 @@ "djH" = (/turf/simulated/wall/r_wall,/area/engineering/drone_fabrication) "djI" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor,/area/engineering/drone_fabrication) "djJ" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/drone_fabrication) -"djK" = (/obj/machinery/computer/cryopod/robot{pixel_y = 30},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"djL" = (/obj/structure/bed/chair,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "ENG - Drone Fabrication"; dir = 2},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"djM" = (/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"djN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/engineering/drone_fabrication) "djO" = (/obj/item/weapon/storage/toolbox/electrical,/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/drone_fabrication) "djP" = (/turf/simulated/wall,/area/engineering/drone_fabrication) "djQ" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) @@ -8547,7 +8581,6 @@ "dkn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/reinforced/n20,/area/engineering/atmos) "dko" = (/obj/machinery/cryopod/robot{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dkp" = (/obj/effect/landmark{name = "JoinLateCyborg"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"dkq" = (/turf/simulated/floor,/area/engineering/drone_fabrication) "dkr" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dks" = (/obj/machinery/computer/security/engineering{name = "Drone Monitoring Cameras"; network = list("Engineering")},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dkt" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) @@ -8598,8 +8631,6 @@ "dlo" = (/obj/machinery/drone_fabricator,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dlp" = (/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dlq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"dlr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/engineering/drone_fabrication) -"dls" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/drone_fabrication) "dlt" = (/obj/machinery/door/airlock/engineering{name = "Engineering Drone Fabrication"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/drone_fabrication) "dlu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) "dlv" = (/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,/turf/simulated/floor/tiled,/area/engineering) @@ -8648,7 +8679,6 @@ "dmq" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor,/area/engineering/drone_fabrication) "dmr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dms" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/drone_fabrication) -"dmt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/drone_fabrication) "dmu" = (/obj/machinery/door/airlock/engineering{name = "Engineering Drone Fabrication"; req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/drone_fabrication) "dmv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) "dmw" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/engineering) @@ -8714,9 +8744,6 @@ "dnH" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/engineering/drone_fabrication) "dnI" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/drone_fabrication) "dnJ" = (/obj/machinery/computer/drone_control,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"dnK" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"dnL" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"dnM" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/engineering/drone_fabrication) "dnN" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dnO" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dnP" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) @@ -8743,8 +8770,6 @@ "dol" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/aft_hallway) "dom" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "don" = (/obj/machinery/computer/shuttle_control/engineering{name = "engineering elevator control console"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"doo" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dop" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "doq" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dor" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dos" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) @@ -8771,7 +8796,6 @@ "doP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "doQ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "doR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"doS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "doT" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "doU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "englockdown"; name = "Engineering Lockdown"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/engineering/aft_hallway) "doV" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) @@ -8831,11 +8855,6 @@ "dpX" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/engineering{c_tag = "ENG - Hallway Starboard"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dpY" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dpZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "interior access button"; pixel_x = 30; pixel_y = -25; req_one_access = list(13,11,24)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dqa" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dqb" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dqc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "englockdown"; name = "Engineering Lockdown"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/engineering/aft_hallway) -"dqd" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dqe" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dqf" = (/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/engineering/aft_hallway) "dqg" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "ENG - Hallway Aft Starboard"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dqh" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) @@ -8872,7 +8891,6 @@ "dqM" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_inner"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/engineering/aft_hallway) "dqN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/maintenance/portsolar) "dqO" = (/turf/simulated/wall/r_wall,/area/engineering/engine_waste) -"dqP" = (/obj/machinery/door/airlock/maintenance{name = "Engine Waste Handling"; req_one_access = list(10,24)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/engineering/engine_waste) "dqQ" = (/turf/simulated/wall/r_wall,/area/engineering/engine_smes) "dqR" = (/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/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/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/engineering/engine_smes) "dqS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) @@ -8912,7 +8930,6 @@ "drE" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "engineering_dock_airlock"; pixel_x = 0; pixel_y = 25; req_one_access = list(13,11,24); tag_airpump = "engineering_dock_pump"; tag_chamber_sensor = "engineering_dock_sensor"; tag_exterior_door = "engineering_dock_outer"; tag_interior_door = "engineering_dock_inner"},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "drF" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/aft_hallway) "drG" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineEmitterPortWest"; name = "Engine Room Blast Doors"; pixel_x = 0; pixel_y = 25; req_access = null; req_one_access = list(11,24)},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_waste) -"drH" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/engineering/engine_waste) "drI" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/closet/radiation,/obj/item/clothing/glasses/meson,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/camera/network/engine{c_tag = "ENG - Waste Handling"},/turf/simulated/floor/tiled,/area/engineering/engine_waste) "drJ" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light_switch{pixel_x = -38; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/engine_smes) "drK" = (/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/device/multitool{pixel_x = 5},/obj/item/clothing/gloves/yellow,/obj/structure/table/steel,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/engineering/engine_smes) @@ -8970,7 +8987,6 @@ "dsO" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "engineering_dock_pump"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dsP" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "engineering_dock_sensor"; pixel_x = 25; pixel_y = 8},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/camera/network/engineering{c_tag = "ENG - Shuttle Access"; dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/engineering/aft_hallway) "dsQ" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor,/area/engineering/engine_waste) -"dsR" = (/obj/structure/cable,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Master Grid"; name_tag = "Master"},/turf/simulated/floor,/area/engineering/engine_waste) "dsS" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{pixel_x = 38; pixel_y = 0},/turf/simulated/floor,/area/engineering/engine_waste) "dsT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/engineering/engine_smes) "dsU" = (/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/table/steel,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_smes) @@ -9450,7 +9466,6 @@ "dCj" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) "dCk" = (/obj/structure/table/standard,/obj/machinery/microwave,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) "dCl" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_7) -"dCm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "dCn" = (/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) "dCo" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_8) "dCp" = (/obj/structure/bed/chair/wood{dir = 8},/obj/effect/floor_decal/corner/green/full{dir = 1},/turf/simulated/floor/tiled,/area/hydroponics/garden) @@ -9626,7 +9641,6 @@ "dGu" = (/obj/structure/table/rack,/obj/effect/floor_decal/corner/green/full{dir = 4},/obj/structure/window/reinforced{dir = 2; health = 1e+006},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/obj/machinery/door/window/brigdoor/westleft{name = "Bullet Armor"; req_access = list(1)},/obj/item/clothing/gloves/arm_guard/bulletproof,/obj/item/clothing/shoes/leg_guard/bulletproof,/obj/item/clothing/suit/armor/bulletproof/alt,/obj/item/clothing/head/helmet/bulletproof,/turf/simulated/floor/tiled/dark,/area/security/armoury) "dGv" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled/dark,/area/security/armoury) "dGw" = (/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/security/armoury) -"dGG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/maintenance/medbay_fore) "dGH" = (/obj/structure/closet,/obj/item/stack/material/steel{amount = 4},/obj/item/stack/rods{amount = 2},/turf/simulated/floor,/area/maintenance/pool) "dGI" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/maintenance/pool) "dGJ" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor,/area/maintenance/pool) @@ -9762,11 +9776,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyahyahyahyahyahyahyahyamuarParQarRarSarTarUarVarWarXarYarZasaasbascasdamuayZagpagrayZayZagsayZayZauNayZanransansansansagIansansagOagJasrapwanraahagHagWahUagUagPagUagTagUagUaiyagUagUaiOaiNaiMaiMagHaahaahapzassagXasuapzagYabZagZaaNaahaahakzarEarFarGarHarIarJarKarLarMakzaahaahanZahiahhahhahhahhahhahkahjanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyasGasGasGasHasIasJasIasKasGasGamuasLasLasMasNasOasPasNasLasLamuamuamuamuamuamuasLasQasRasRasRasRasRatNayZauNatNanranraqkaqkanranranranransahlahmanranraahagHajiajiagUagPagUahnajeajeajfajeajeajdahpajbahuagHaahaahdEOdEOdEOdEOapzahvabSafwaaNaaNaahakzaqFaqFaqFaqIaqJaqKaqFaqFaqFakzaahaahanZaAJarOanZanZanZanZaAJarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiatiatiatjatkatlatmatnatoatpatqatratsattatuatvatwatxatyatzatAatBatCatDatEatFatGatHatIasQatJatKajYatMasRatNatNahwatNahxanranranranraahaahanrahzatQatRanraeAaahagHagUagUagUahBajzahCagUagUajwagUagUaiOajvajuahDagHaahdEOdEOahHahGahJahIagaabEahLahKaaNaahakzamfatganQaqIaqJaqKatganQathakzaahamXamXamXamXamXanyanxanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiauiaujaukaulaumaunauoaupauqaurausautauuauvauwauxauyauzauAauBauCauBauDauEauFauGauHauGauIasQauJauKauLauMasRaahatNauNatNatNanraahaahaahaahaahanrasTauOasranraahaahagHajUahNahMahWahRahXagUagUajNajMajLagHajKajJagHagHaahdEOahYaibahZaigaicaikaihafwaimaaNaahakzaqFaufaugaqIaqJaqKauhaugaqFakzaahamXaoxanzanzaoyaozanzapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiauiaujaukaulaumaunauoaupauqaurausautauuauvauwauxauyauzauAauBauCauBauDauEauFauGauHauGauIasQauJauKauLauMasRaahatNauNatNatNanraahaahaahaahaahanrasTauOasranraahaahagHajUahNahMahWahRahXagUadeajNajMajLagHajKajJagHagHaahdEOahYaibahZaigaicaikaihafwaimaaNaahakzaqFaufaugaqIaqJaqKauhaugaqFakzaahamXaoxanzanzaoyaozanzapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahyahyahyahyahyatiauXauYauZatiavaavbavcavdaveavdavfavfavgavhaviavjavkavfavlavmavnavoavpavqatDavravsavtavuavvavwavxavyavzavAasRaahatNavBatNaahaahaahaahaahaahaahanrasTauOasranraahaahagHagHakbakcagHainahXagUagHakbakcagHagHagHagHagHahyahydEOaioaOqaipairaiqabYafvafwaisaaNaahakzauSauTakzauUauVauWakzauSauTakzaahamXaitanzanzapBaiuapDapEanZaixanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaxsaxsaxsaxsaxsaxsaxsaxsaahatiavKavLavMatiavNavOavdavdavPavQavfavRavSavTavUavTavVavWavXavYavZawaawbawcawdaweaweawfaweawgasQawhawiasRawjasRaahatNauNatNaahaahaahaahaahaahanranrawkaiBawmanranrahyahyahyahyahyagHaiCaiDakfagHahyahyahyaahaahaahahyahyahydEOaiEaiGaiFdEOaaNaiIaiHaiJaaNaaNahyahyahyahyaiKavHavIavJaiKahyahyahyaahamXanwanzanzaquaquaquapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyaahaahaahaahaahaahaahaahaxsdFmdFnazHdFoaytayuaxsaahatiawAawBawCatiawDawEavdawFawGawHavfawIawJawKawLawMawNawOawPavmawQawQawRawSatDatEawTawUawVawWasQawXawYasRawZasRaahatNauNatNaahaahaahaahaahatNavCaxaaxbaxcaxdaxeavCavCaxfaxgaxhavCavCaxdavEawnavCavCavCavCavCavCavCaxfaxgaxhavCaiLaiQaiPavCaxkaxlaxmaxdaxnawsawsawsaxoaxpawsavHaxqavJawsaxoaxpawsawsamXaiRanwanwanwanwanwapEanZaiSanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaALaALaALaALaALaALaALaxsdFqdFqazHazHdFrdFraxsaahatiaxtaxuaxvaxwaxxaxyavdavQaxzaxAavfaxBaxCaxDaxEaxFaxGavfadeaxHaxIawQawRaxJaxKaxKaxKaxKaxKaxKaxKaxLaxLaxLaxLaxLaahatNauNatNatNatNatNatNatNatNaxMawnaxNaxOaxPaxQaiTaxSaxTaxQaxQaxRaxVaiUaiWaiVaiVajaaiVaiVajgajcajhaiVajjaiVajkaiVaiVaiVajaaiVajmajlajnaydayeaygayfayfayhayiajpajoavJaymaymaymaymaypamXajqajtanzanzajxanwanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaALaALaALaALaALaALaALaxsdFqdFqazHazHdFrdFraxsaahatiaxtaxuaxvaxwaxxaxyavdavQaxzaxAavfaxBaxCaxDaxEaxFaxGavfaxJaxHaxIawQawRbQCaxKaxKaxKaxKaxKaxKaxKaxLaxLaxLaxLaxLaahatNauNatNatNatNatNatNatNatNaxMawnaxNaxOaxPaxQaiTaxSaxTaxQaxQaxRaxVaiUaiWaiVaiVajaaiVaiVajgajcajhaiVajjaiVajkaiVaiVaiVajaaiVajmajlajnaydayeaygayfayfayhayiajpajoavJaymaymaymaymaypamXajqajtanzanzajxanwanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALaALaALaALaALaALaALaxsdFsdFsazHazHdFtdFuaxsaahatiayxayyayzatiayAavbavdayBayCayDavfaEqayFavTayGavTayHayIayJayKayLayMayNayOayPayQayRayPazXaySayPayTayUayVayWayXatNatNauNayYayZayZayZazaazbazcazdawnaxlazeazfazgazkaziazjazjazgazhaziazjazlazjazgazmaznaznaznazoaznaznazpaznazqaznaznaznazmazqazpazrazsaztazuazvazvazvazwazvazvajyajAazvazvazvazvavDavGavFawoawlawlawpajBanZarOarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALaALdFwdFvdFxaALdFzdFyaxsayrayraBCazHazHazIaxsazJazJazJazJazJazJazKazLazMazMazNazMazMazMazMazOazPazQazRazSazTazUazVavqavqazWayPazYaBiayPaCdaCcayPazZaAaaAbaAcaGWaAeaAfauNaAgatNatNatNaAhazbatNaAiawnaxlaxmaxdaAjaAoaAlawnaAmaAnaAkaApawnaAqawnaAraAkawnawnawnaApawnawnaAsawnaAtawnaAuawnaAkaAvaxlaAwaAxaAyaAzaAAaAAaAAaAAaACaABajCajDayfayfayfajGajEajOajIasYaoAaoAanzajPanZarOajQanZaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaALaALaALdFAaDxaDxaDxdFBdFDdFCaALayrayrazHazHaAMaAMaANaAOaAPaAQaARaASaATaAUaAVaAWaAXaAYaAZaBaaBbazMavfavfavfavfavfaBcaBdaBeaBfaBgaBhayPaDdaDeayPaIoaDgayPaBjaBkaBlayXayXaBmaBnaBoatNatNaKlatNatNatNatNavCaBpaxlaxmaxdaBqavCavCaxfaxgaxhavCavCaBraBsaAiavCavCaBtaBuaBuaBuaBvavCavCavCavCavCavCavCavCaBwaxlaAwaxdaBxawsawsawsawsawsawsawsawsawsawsawsawsawsawsamXajRanzataanzanzataanZaByaBzanZaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9791,18 +9805,18 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTuaRPaTvaTwaTwaSXaTxaTyaTzaTAaSvaSwaRfaahaahaahaahaahaahaahaahaahaSxaTBaTCaTDaTEaTFaTGaRTahyahyaTfaTfaQraTIaQraTfaTfaTfaTJaTKaTJaTfaTfahyahyaahaahaahaahahyahyahyahyahyahyahyahyahyaTfaTfaTfaTfaTfaahaahaahaahaTfatNaTLatNaTfaahaahaahahyahyahyavCavCaTMaTNaTMavCaToaToaTOaTPaTQaToaToaCjaTRaCjaCjaahaahaahaahahyahyahyahyahyahyahyahyahyaFpaDpaQVaDraQkaClaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaDtaTSaTTaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTuaRPaRPaRPaTUaTUaRPaRPaRPaRPaTVaRfaahaahaahaahaahaTWaTWaTWaTWaSxaTXaTYaTZaSxaRTaUaaRTaUbaUcaTfaUdaTkaTkaTkaUeaTfaUfaTkaUgaTkaUhaTfaUiaUjaTfaTfaTfaTfaTgaThaThaThaThaThaThaThaTiaTfaUkaUlaUmaTfaTfaTfaTfaTfaTfaUnaUoaUpaTfaTfaTfaTfaTfaUqaUraTfaUsaTkaTlaTkaUtaToaUuaUvaUvaUwaUxaToaUyaUzaUAaClaClaClaClaClaClaUBaUCaUCaUCaUCaUCaUCaUDaClaGIaUEaCnaCoaClaClcllcllcllcllcllcllaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaTWaDtaDtaUFaUGaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaRfaRfaRfaRfaUHaUHaRfaRfaRfaRfaRfaRfaUIaUIaUIaUIaUIaUIaUJaUKaULaSxaTcaUMaSxaSxawqaUOaUPaUNaUNaUQaTkaURaUSaUTaUTaUUaUVaUTaUWaUTaUTaUUaUTaUTaUTaUXaUYaUTaUZaUTaUTaUTaUTaUSaUTaUTaUTaUUaUTaVaaUSaUUaUTaUTaVbaVcaVdaUTaVeaTkaTJaTkaVfaTkaVgaTkaTkaVhaTkaTkaTlaTkaTkaViaVjaUvaUvaVkaVlaVmaVnaVoaVnaVpaVqaVraZQaVsaVtaVnaVnaVuaVvaVnaVnaVwaVxaVyaVnaVnaVzaVAaLIaUAcpZcmkcmlakuaktaktaDtaVCaYcaYdaYeaDtaDtaDtaDtaDtaDtaDtaDtaDtaVBaVCaFJaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaVDaVEaVFaVGaVHaVIaVJaVKaVLaVMaVNaVOaVPaVQaVKaVKaVRaVSaVTaVKaVUaVKaVPaVVaVWaVVaVRaVKaVXaVYaVZaIxaVYaVYaWbaWcaWdaWeaWdaWfaWbaWdaWdaWdaWgaWhaWdaWdaWiaWdaWdaWfaWcaWdaWdaWaaWbaWdaWjaWcaWbaWqaWdaWgaWdaWkaWhaWlaWdaWbaWdaWiaWdaWcaWdaWdaWmaWdaWfaWnaTkaTkaViaWoaWpbhcaWraWsaWtaWuaWvaWuaWwaWuaWuaWuaWuaWxaWyaWuaObaWuaWuaWuaWzaWAaWAaWAaWBaWCaWDaWDaWFakvakxakwakBakyakyakDaWGakIaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaWKaWLaWMaWNaWLaWOaWPaUNaWQaUNaWRaUNaWSaUNaWTaWUaWVaWWaWXaWYaWZaXaaXbaXcaXdaXeaXfaXgaXhaXiaXjaXkaXlaXmaXnaXmaXmaXmaXmaXoaXnaXmaXmaXpaXmaXqaXmaXmaXraXmaXmaXsaXtaXuaXmaXvaXnaXwaXxaXyaXzaXyaXyaXyaXAaXBaXCaXDaXEaXFaXGaXHaXmaXIaXtaXJaXKaTkaXLaTkaTkaTkaViaUvaXMaXNaXOaXPaXQaXRaXSaLIaLIaXTaLIaLIaXVaSfaXWaLIaLJaLIaXXaLIaXYaXZaXVaXUaYaaYbaLIaLIaUAcpZakLakKakPakMcomaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaRfaYfaYgaYhaYiaYjaRfaRfaRfaRfaYkaYlaYmaRfaUIaUIaUIaUIaUIaUIaUbaYnaYnaYnaUcaUIaUIaYhaTfaYoaYpaYqaYraYsaTfaYtaTkaTkaTkaYuaTfaTfaTfaTfaTfaTfaYvaYwaUgaYxaYvaTfaTfaTfaTfaTfaTfaYyaYzaYAaTfaUqaYBaUraTfaTfaUqaYBaUraTfaYCaYDaYEaTfaUqaYBaUraTfaTfaUqaYBaUraToaRjaYGaYHaUwaYIaToaClaYJaYKaYLaClaYJaYKaYLaClaClaClaYMaUAaClaClaClaClaClaClaUAaYNaUAaClaClcllakTakSakVakUakWdEoakYakXalaakZalcalbdEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaRfaRfaRfaRfaRfaRfaRfaahaahaRfaYOaYOaYOaRfaahaahaahaahaYPaYQaYRaYRaYRaYRaYRbewaYPahyaTfaTfaYTaYUaYVaTfaTfaTfaYWaYXaYYaTfaTfaahaahaahaahaahaYZaZaaZbaZcaYZaahaahaahaahaahaTfaZdaZeaZdaTfahyahyahyahyahyahyahyahyaZfaZgaZhaZiaZfahyahyahyahyahyahyahyahyaToaToaZjaZkaZlaToaToahyahyahyahyahyahyahyahyahyahyaClaYMaUAaClaahaahaahaahaZmaZmaZnaZmaZmaahcllclldEoalddEodEodEoakYalealgalfaloalbdEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpaZqaZraZoaahaahaahaahaYPaZsaZtaZuaZvaZwaZxaYRaYPahyahyaZyaZzaZAaZBaZyahyaTfaUiaThaTiaTfaahaahaZCaZCaZCaZCaZDaZDaZEaZDaZDaZFaZFaZFaZFaahaZdaZGaZHaZdahyahyahyahyaZIaZJaZKaZLaZIaZIaZMaZNaZOaZIaZIaZJaZKaZLaZIahyahyahyahyaZPaYGaYHaUwbaAaZRaZRaZSaZTaZUaZRaZSaZTaZUaZRaZRaZRaZVaZRaZRaahaahaahaahaahaZmaZWaZXaZmaahaahdEoalpalsalralualtalxalwalzalyalyalAdEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZYaZZbaaaZoaahaahaahaahaYPbabbacbadbaebafbagbahaYPahyahybaibajbakbalbamahyahyahyahyahyaahaahaahaZCbanbaobapaZDbaqbarbasaZDbatbaubavaZFaahaZdaZGbaxaZdahyahyahybayaZLbKzaYFaTHbaCbKMbaEbaFbaGbaHbaIbawbazbhAaZJbaMahyahyahybaNaYGaYHaUwbdwbaLbaBbaPbaObaRbaQbaPbaSbaRbaTbaWbaVbcPbaXaZRaZRaahaahaahaahaZmbbbbbcaZmaahaahdEoalBalCalyalLalDalyalPalZalyambamadEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdaaaaaabbdaaaaaaaaabbdaaaaaaaaaaaaaaabbdaaaaaaaaabbdaaaaaabbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobbebbfdGNaZoaahaahaahaahaYPbbhbacbbibbjbbkbagbblaYPbbmbbnbbobbpbbqbbrbamahyahyahyaahaahaahaahaahaZCbbsbbtbbubbvbbwbbxbbybbzbbAbbBbbCaZFaahaZdaZdaZHaZdahyahybaybbDbbEbMcbfMbdCbdCdCqbbGbbHbbGbgHccSblCdCpbbLbbEbbMbaMahyahybbNbbObbPbbQbbRbbabaYbbTbbSbbTbbUbbWbbVbbWbcabcIbbXbbYbbZbcJaZRaahaahaahaahaZmaZWbcbaZmaahaahdEodEBamdamcamgameamAamhamCamBamDamadEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobccbcdbceaZoaahaahaahaahaYPbcfbcgbchbchbchbcibfvbcjbckbclbclbcmbcnbcobamahyahyaahaahaahaahaahaahaZCbcpbcqbcraZDbcsbctbcuaZDbcvbcwbcxaZFaahaahaZdaZHaZdahyaZIbcybbEbbFbfMdCqbbGbbGbczbcAbcBbcCbcDbbGbbGbgHdCrbbLbbEbcyaZIahyaTobcEbcFbcGbcHbcLbcKbcNbcMbcNbcQbdzbdybdzdCsbdDbcObaZdCtbdEaZRbcRbcRbcRbcRaZmbcSbcTaZmaahaahdEodEBamFamEamWamVanaamZdEodEodEodEodEoaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnbdobdpaZFaahaahaZdaZHaZdahybdqbaJbbFbfMdCqbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbgHdCrbdsbaKbdqahyaTobdubdvaUwbdwbaLbdFbfkbdGbLZbdIbWObNGbiVbYuaZRccRcsWdCucwuaZRbdJbdKbdLbcRbdMbdNbdOaZmaahaahaZmaZmaZmanbaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPaRtbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbeibeUbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbfMdCqbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbgHdCvbiFbejahyaZPbesbetaUwaToaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRbkjbevbuJbcRbdMbdNbdOaZmaahaZmaZmbexbeyaZWantbdObezbeAaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahbegbegbdlbdlbehbeTbeUbeTbeSbdlbdlbegbegaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfaaFLbeZbfcbfdbfedGObfgbfhbfibfjbcRbkhbevbevbflbdMbdNbfmaZmaZmaZmbfnbfobfodGGbfobfobfobfobfpaZmaZmaZmaZmaZmaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfucxEbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahbegbegbdlbfGbeTbfHbfIbfJbeTbfKbdlbegbegaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbjlbfPbfQbbGbbGdCAbfSaZIahybbNaYGbetaUwaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMbgibfobfobfobfobgjbgkbgkbgkbgkbgkbgkbgkbglbfobfobfobfobfobfpaZmaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaVDaVEaVFaVGaVHaVIaVJaVKaVLaVMaVNaVOaVPaVQaVKaVKaVRaVSaVTaVKaVUaVKaVPaVVaVWaVVaVRaVKaVXaVYaVZaIxaVYaVYaWbaWcaWdaWeaWdaWfaWbaWdaWdaWdaWgaWhaWdaWdaWiaWdaWdaWfaWcaWdaWdaWaaWbaWdaWjaWcaWbaWqaWdaWgaWdaWkaWhaWlaWdaWbaWdaWiaWdaWcaWdaWdaWmaWdaWfaWnaTkaTkaViaWoaWpbhcaWraWsaWtaWuaWvaWuaWwaWuaWuaWuaWuaWxaWyaWuaObaWuaWuaWuaWzaWAaWAaWAaWBakvaWuaWuakxakwakyakyakLakBakMakDaWGakIaWGaWGaWGaWGaWGakSaWGaWGaWGaWGaWGaWGaWGaWJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaWKaWLaWMaWNaWLaWOaWPaUNaWQaUNaWRaUNaWSaUNaWTaWUaWVaWWaWXaWYaWZaXaaXbaXcaXdaXeaXfaXgaXhaXiaXjaXkaXlaXmaXnaXmaXmaXmaXmaXoaXnaXmaXmaXpaXmaXqaXmaXmaXraXmaXmaXsaXtaXuaXmaXvaXnaXwaXxaXyaXzaXyaXyaXyaXAaXBaXCaXDaXEaXFaXGaXHaXmaXIaXtaXJaXKaTkaXLaTkaTkaTkaViaUvaXMaXNaXOaXPaXQaXRaXSaLIaLIaXTaLIaLIaXVaSfaXWaLIaLJaLIaXXaLIaXYaXZaXVaXUaYaaLIaLIaLIaUAcpZakTakKakPakUcomaDtaDtaDtaDtaDtaDtaDtaDtaFJaVCaDtaDtaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaRfaYfaYgaYhaYiaYjaRfaRfaRfaRfaYkaYlaYmaRfaUIaUIaUIaUIaUIaUIaUbaYnaYnaYnaUcaUIaUIaYhaTfaYoaYpaYqaYraYsaTfaYtaTkaTkaTkaYuaTfaTfaTfaTfaTfaTfaYvaYwaUgaYxaYvaTfaTfaTfaTfaTfaTfaYyaYzaYAaTfaUqaYBaUraTfaTfaUqaYBaUraTfaYCaYDaYEaTfaUqaYBaUraTfaTfaUqaYBaUraToaRjaYGaYHaUwaYIaToaClaYJaYKaYLaClaYJaYKaYLaClaClaClaYMaUAaClaClaClaClaClaClaUAaUAaUAaClaClcllaldakValCalsakWdEoakYakXalaakZalcalbdEoaFJaVCaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaRfaRfaRfaRfaRfaRfaRfaahaahaRfaYOaYOaYOaRfaahaahaahaahaYPaYQaYRaYRaYRaYRaYRbewaYPahyaTfaTfaYTaYUaYVaTfaTfaTfaYWaYXaYYaTfaTfaahaahaahaahaahaYZaZaaZbaZcaYZaahaahaahaahaahaTfaZdaZeaZdaTfahyahyahyahyahyahyahyahyaZfaZgaZhaZiaZfahyahyahyahyahyahyahyahyaToaToaZjaZkaZlaToaToahyahyahyahyahyahyahyahyahyahyaClaYMaUAaClaahaahaahaahaZmaZmaZnaZmaZmaahcllclldEoamddEodEodEoakYalealgalfaloalbdEoaFJadfaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpaZqaZraZoaahaahaahaahaYPaZsaZtaZuaZvaZwaZxaYRaYPahyahyaZyaZzaZAaZBaZyahyaTfaUiaThaTiaTfaahaahaZCaZCaZCaZCaZDaZDaZEaZDaZDaZFaZFaZFaZFaahaZdaZGaZHaZdahyahyahyahyaZIaZJaZKaZLaZIaZIaZMaZNaZOaZIaZIaZJaZKaZLaZIahyahyahyahyaZPaYGaYHaUwbaAaZRaZRaZSaZTaZUaZRaZSaZTaZUaZRaZRaZRaZVaZRaZRaahaahaahaahaahaZmbdOaZXaZmaahaahdEoalpamEalralualtalxalwalzalyalyalAdEoamFaDtaTWaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZYaZZbaaaZoaahaahaahaahaYPbabbacbadbaebafbagbahaYPahyahybaibajbakbalbamahyahyahyahyahyaahaahaahaZCbanbaobapaZDbaqbarbasaZDbatbaubavaZFaahaZdaZGbaxaZdahyahyahybayaZLbKzaYFaTHbaCbKMbaEbaFbaGbaHbaIbawbazbhAaZJbaMahyahyahybaNaYGaYHaUwbdwbaLbaBbaPbaObaRbaQbaPbaSbaRbaTbaWbaVbcPbaXaZRaZRaahaahaahaahaZmanbbbcaZmaahaahdEoalBaWCalyalLalDalyalPalZalyambamadEoaZWaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdaaaaaabbdaaaaaaaaabbdaaaaaaaaaaaaaaabbdaaaaaaaaabbdaaaaaabbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobbebbfdGNaZoaahaahaahaahaYPbbhbacbbibbjbbkbagbblaYPbbmbbnbbobbpbbqbbrbamahyahyahyaahaahaahaahaahaZCbbsbbtbbubbvbbwbbxbbybbzbbAbbBbbCaZFaahaZdaZdaZHaZdahyahybaybbDbbEbMcbfMbdCbdCdCqbbGbbHbbGbgHccSblCdCpbbLbbEbbMbaMahyahybbNbbObbPbbQbbRbbabaYbbTbbSbbTbbUbbWbbVbbWbcabcIbbXbbYbbZbcJaZRaahaahaahaahaZmbdObcbaZmaahaahdEodEBaWDamcamgameamAamhamCamBamDamadEoaZWaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobccbcdbceaZoaahaahaahaahaYPbcfbcgbchbchbchbcibfvbcjbckbclbclbcmbcnbcobamahyahyaahaahaahaahaahaahaZCbcpbcqbcraZDbcsbctbcuaZDbcvbcwbcxaZFaahaahaZdaZHaZdahyaZIbcybbEbbFbfMdCqbbGbbGbczbcAbcBbcCbcDbbGbbGbgHdCrbbLbbEbcyaZIahyaTobcEbcFbcGbcHbcLbcKbcNbcMbcNbcQbdzbdybdzdCsbdDbcObaZdCtbdEaZRbcRbcRbcRbcRaZmaWFbcTaZmaahaahdEodEBaYbalyamWamVanaamZdEodEodEodEodEoaZWaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnbdobdpaZFaahaahaZdaZHaZdahybdqbaJbbFbfMdCqbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbgHdCrbdsbaKbdqahyaTobdubdvaUwbdwbaLbdFbfkbdGbLZbdIbWObNGbiVbYuaZRccRcsWdCucwuaZRbdJbdKbdLbcRbdMaYNbdOaZmaahaahaZmaZmaZmbcSaZmaZmaZmaZmaZmaahaahaahaZmaZWaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPaRtbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbeibeUbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbfMdCqbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbgHdCvbiFbejahyaZPbesbetaUwaToaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRbkjbevbuJbcRbdMaYNbdOaZmaahaZmaZmbexbeybdOantbdObezbeAaZmaZmaahaahaZmaZWbIUaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahbegbegbdlbdlbehbeTbeUbeTbeSbdlbdlbegbegaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfaaFLbeZbfcbfdbfedGObfgbfhbfibfjbcRbkhbevbevbflbdMaYNbfmaZmaZmaZmbdObdObdObdObdObdObdObdObdOaZmaZmaZmaZmaZWbdObdNaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfucxEbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahbegbegbdlbfGbeTbfHbfIbfJbeTbfKbdlbegbegaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbjlbfPbfQbbGbbGdCAbfSaZIahybbNaYGbetaUwaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMbdObdObdObdObdObdObgkbgkbgkbgkbgkbgkbgkbdObdObdObdObdObglbfpbdOaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbgnbfrbgobdPbgpbgqbgrbdTaahaahaahaahahyahyahyahyahyahyahyahyahyahybbobbobgsbcnbgtbeebefbgubgvbgwbgxbefaahaahbegbegbdlbgybeTbeibgzbeibeTbgAbdlbegbegaahaZdaZdaZHaZdahyaZIbgBdCBbfRbbGbgCbbGbbGdCCbgDbgEbgFdCDbbGbbGbgCbbGbgGbgHdCEaZIaZfaTobgIbgJbgKaToaToaahbeZbgLbgMbgNbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgYbgYbgYbgYbgYbgYbgZbgZbgZbgZbgZbgkbhabhbbmzbhdbhebgkbhfbhfbhfbhfbhfbhfbglbfpaZmaahaahaahaahaahbgmbgmbhgbhhbhibhhbhjbgmbgmaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbhkbhlbhkbdPbhmbfubhnbhobhobhobhoaahaahaahahyahyahyahyahyahyahyahyaZycrkbajbhqbhrbhsbefbhtbgvbgwbhubefaahaahbegbegbdlbhvbhybhxblrbhwbeTbhvbdlbegbegaahaZdaZGaZHaZdahybdqbaUdCFbbGbbGbbGbbGdCGbgDbhAbhAbhAbgFdCFbbGbbGbbGbhBbbGbhCbhDbhEbhFbhGbetaUwbhHaToaahbeZbhIbhJbgNbhKbhLbhLbhLbhLbhMbhNbgVbhObhPbgYbhQbhRbhSbhTbgYbhUbhVbhVbhWbgZbhXbhYbhYbhZbhZbhYbiabhfbibbicbidbiebhfbdOaZWaZmaahaahaahaahaahbgmbifbigbihbiibijbikbifbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahbilbilbilbilbilbilbilbilbilbimbinbiobipbeEbfubinbhobiqbirbhobhobhoaahaahahyahyahyahyahyahyahybambisaZzbitbiubdebivbiwbixbgwbhubefaahaahbegbegbdlbiyblsbizbiAbiBbltbiCbdlbegbegaahaZdbiDaZHaZdahybejbdrdCFbbGbbGbbGbbGdCGbiFbhAbdtbhAbiHdCFbbGbbGbbGbiIbiJbiJbiKbiLbiMbiNbiObiPbiQaToaahbeZbfTbiRbiSbeZbiTbiUblObiWbxjbfhbzjbhObiYbgYbiZbjabjbbjcbgYbSjbjebjfbjgbgZbjhbjibjjbjkbpybjmbjnbhfbibbjobjpbjqbhfbjrbjsaZmaahaahaahaahaahbgmbjtbjubjvbjwbjvbjubjxbgmaahaahbgmbgmbgmbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9829,13 +9843,13 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaahaahaahbOLbOMbONbOObOPbOQbOLbORahyahyaahaahbtHbOSbIibOTbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbOUbOVbOWbOXbOYbOZbzHbPabPbbPcbPdbPebPfbPgbImbInbIobPhbPibLxbPjbGYbSRbSQbSSbNqbNqbNrbNpbSSbRlbSTbGYahyahybKdbecbcnbecbPobHcbFubPpbKhbPqbPrbPsbKhbPtbFubPubPvbPwbNCbPxbPybPzbPAbNCbPBbNCbNCaahaZdaZHbEgbPCbPDbPEbPEbPFbPEbPEaNabFJbPHbEgbPIbPJbPKbPLbPMbPNbPIbPJbPKbEjbPObPPaToaZjblDbHCaToaToahybMkbPQbPRbPSbPTbPUbPVbPWbPXbPYbPZbQabQbbQcbQdbKSbQebQfbQgbQhbKWbQibQjbQkbMBbQlbQmbQnbQobQpbQqbQrbQsbQtbQpbQubQvdGRbMPbMQbQxbQybQzbMUbMVbWWbQBbOJanDbQDbQEbOJcAfbLdaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczacAaczaczacOacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaahaahaahbNgbQFbQGbQHbQHbQIbNgahyahyahyaahaahbtHbQJbQKbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbyfbJRbRabRbbRcbRdbRebGYbNobNpbNpbNpbNpbNpbNpbNpbRlbSUbGYahyahybKdbecbcnbRmbRnbRobRpbRqbRrbRsbRtbRubRvbRwbFubRxbPvbRybNCbRzbRAbRBbRBbRCbRDbREbNCaahaZdaZHbEgaynbRGbFJbRHbRIbFJbFJbFJbFJbRJbEgbupbTlbTkbRNbRObRPbRObRPbvEbRTbRUbRUbRVbRWbetaUvbvFaToahybMkbRYbRZbSabNWbSbbScbSdbSebSfbSgbShbSibMpbvIbKSbXibQfbSlbSmbKWbKWbKWbKWbKWbSnbSobSpbSpbSpbSpbSpbSqbSrbSqbSqbSqbSqbSqbSsbStbSubSvbSwbSwbSwbLdbLdbSxbSycNtbSxbLdbLdaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbOLbSAbQGbQHbQHbSBbOLbORahyahyaahaahbtHbSCbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbGYbUDbPlbPmbNpbNpbSzcpCcpubRlbXTbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubFubSWbFubFubSXbSYbSZbNCbTabTbbTcbTdbNCbTebTfbNCaahaZdaZHbEgbFLbvJbEgbEgbThbTibTibTibTibEgbEgbTjbTkbTlbTmbTnbTkbTlbTkbTobTpaUvaUvaUvaUvbTqbTrbTsaToahybMkbGxbTubTvbTubTtbScbTxbTybVhbTAbTBbTCbTDbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbOabTXbTZbSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbNebNfbNgbUhbNgbNfbNebLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbGYbXUbRgbYYbNpbNpcbIbRgcGibRlcGQbGYahyahybKdbecbcnaZzbUFahybUGbUHbUIbUJbUKbULbULbUMbUGbUNbUObUPbNCbNCbUQbNCbNCbNCbNCbNCbNCaahaZdaZHaZdbvMbUTbUUbUVbUWbUWbUWbUWbUWbYobUYbTkbTlbUZbVabVbbVcbTkbTlbVdbVeaUvaUvbVfbVgbdvaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsdGSbKNbKNbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbNebNfbNgbUhbNgbNfbNebLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbGYbXUbRgbYYbNpbNpcbIbRgcGibRlcGQbGYahyahybKdbecbcnaZzbUFahybUGbUHbUIbUJbUKbULbULbUMbUGbUNbUObUPbNCbNCbIKbNCbNCbNCbNCbNCbNCaahaZdaZHaZdbvMbUTbUUbUVbUWbUWbUWbUWbUWbYobUYbTkbTlbUZbVabVbbVcbTkbTlbVdbVeaUvaUvbVfbVgbdvaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsdGSbKNbKNbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbLlbVPbVQbVRbVSbVTbLmbLkahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebWfbWgbWhbWibWibWjbWkbUEcNkcIgcNkdHrdHrcNkdHscNkdHtcNkbUEahyahybKdbWobcnaZzbamahybWpbWqbULbWrbWsbWsbWtbWubUGbWvbWwbUPbWxbWybWzbWAbWBbWCbWDbWEbNCaahaZdbWFanEbWHbWIbWJclZbWLbWKbTwbWKbWLbWKbWJbTlbTkbWNdBObVabWPbTlbTkbWQbURbPObPPaTobHCblDbHCaToaToahybMkbWRbWSbMkbWRbWSbMkbMkbMkbYAbWUbWVbCAbKNaahaahaahaahaahaahbTJbWXbWYbWZbTNbXabXbbTQbXcbXdbXebSpbXfbXgbXhcccbXjbXkbSqbXlbXmbXnbXobXpbSubSuaahaahbSxbXqbXrbSxbSxaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsbXtbXubXvbXsahyahyahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbXwbXxbXybXzbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbXKbXLbXMbXNbUEbUybUzbUAbUBbUBbUybUzbUybUCanGbUEahyahybKdbXVbhqbXWbamahybXXbXYbXZbYabYbbYcbYdbYebYfbYgbYhbYibYjbYjbYkcqEbYmbYnbYnbTYbNCaahaZdbYpaZdbYqbTkbTlbWJbYrbWJbYrbWJbYrbWJbYsbTkbTlbUZbYtbVbbVcbTkbTlcgwbURahyahyaTobYvbetbYwaToahyahyahyahyahyahyahyahyahyahybKNbKNbYxbYybKNbKNaahaahaahaahaahaahbTJbTJbTJbTJbTJbYzciWbSpbSpbSpbSpbSpbSqbSqbSqbSqbSqbSqbSqbYBbYCbSubSubSubSuaahaahaahbSxbYDbVObYEbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybYFbYGbYHbYIbYFahyahyahyaahaahaahaahbtHbYJbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbYKbYLbYMbYNbYObYPbXMbYQbYRbYSbYTbYUbYRbYQbXMbXMbXMbYVbUEbWlbWmbWlbWnbUBbWlbWmbWlbUCanGbUEahyahyanHbecbDMbZbbamahybZcbZdbZebZfbZgbZhbZibZjbUGbWvbZkbZlbZmbZnbZobZpbZqbZrbZsbZtbNCaahaZdbYpaZdaZdbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbZvbTjbZwbTlbTkbTjbZybZxahybJeaUvbetaUvbJeahyahyahyahyahyahyahyahyahyahyahybZzbZAbZBbZzbeubeubeubeubeubeuaahbZCbZDbZEbZFbZGbTObTPbZHbZIbZJbZKbZLaahaahaahaahaahaahbZMbZNbZObZPbZQbZMaahaahaahaahbSxbZRbZSbZTbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsbXtbXubXvbXsahyahyahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbXwbXxbXybXzbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbXKbXLbXMbXNbUEbUybUzbUAbUBbUBbUybUzbUybUCanGbUEahyahybKdbXVbhqbXWbamahybXXbXYbXZbYabYbbYcbYdbYebYfbYgbYhbYibYjbYjbYkbNFbLAbYnbYnbTYbNCaahaZdbYpaZdbYqbTkbTlbWJbYrbWJbYrbWJbYrbWJbYsbTkbTlbUZbYtbVbbVcbTkbTlcgwbURahyahyaTobYvbetbYwaToahyahyahyahyahyahyahyahyahyahybKNbKNbYxbYybKNbKNaahaahaahaahaahaahbTJbTJbTJbTJbTJbYzciWbSpbSpbSpbSpbSpbSqbSqbSqbSqbSqbSqbSqbYBbYCbSubSubSubSuaahaahaahbSxbYDbVObYEbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybYFbYGbYHbYIbYFahyahyahyaahaahaahaahbtHbYJbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbYKbYLbYMbYNbYObYPbXMbYQbYRbYSbYTbYUbYRbYQbXMbXMbXMbYVbUEbWlbWmbWlbWnbUBbWlbWmbWlbUCanGbUEahyahyanHbecbDMbZbbamahybZcbZdbZebZfbZgbZhbZibZjbUGbWvbZkbZlbZmbZnbZobZpbZqbZrbZsbUQbNCaahaZdbYpaZdaZdbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbZvbTjbZwbTlbTkbTjbZybZxahybJeaUvbetaUvbJeahyahyahyahyahyahyahyahyahyahyahybZzbZAbZBbZzbeubeubeubeubeubeuaahbZCbZDbZEbZFbZGbTObTPbZHbZIbZJbZKbZLaahaahaahaahaahaahbZMbZNbZObZPbZQbZMaahaahaahaahbSxbZRbZSbZTbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybZUbZVbZWbZUbZUahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbZZcaacabcacbSEcadcaecaecaecafcagcahcaicaecaecaecajcakbUEbXObUBbUBbXPbXQbXRbXRbXRbXSdHwbUEahyahyanIbecbcnaZzdHyahycaocapbZecaqcarcarcasbULbUGbWvcatcaucavcavcawcaxcaybYnbYncazbNCaahaZdbYpanJaZdcaAbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkcaCcaDcaEcaFcaGcaHcaIahyahybrGaUvbetcaJbrGahyahyahyahyahyahyahyahyahyahyahycaKcaLcaMcaNbeubZMbZMbZMbZMbeuaahbZCcaOcaPcaQcaRcaScaTcaUcaVcaWcaXbZLaahaahaahaahaahaahbZMcaYcaZbJTcbbbZMaahaahaahaahcbccbdcbecbfcbcaahahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahycbgcbhcbicbjcbgahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEcbkcblcbmcbnbSEbNZcbpcbqcbrcbscbtcbucbvcbwcbxcbycbzcbAbUEbWlbWmbWlbYWbUBbWlbWmbWlbYXdHzbUEbYZbZabeeccHdHAdHBbeeahybUGcbJcbKcbLcbMbULcbNbUGcbOcbPcbQcbObNCcbRcbScbTcbUcbVcbWcbXbNCaahaZdbYpaZGaZdanSbTkbTlbTmbTnbTkbTlbTkcbZbTmbTlbTkbTlccabTnccbbTlbTkdBQcaIahyahybrGccdbgJaUvbrGahyahyahyahyahyahyahyahyahyahyahyccBccfccgcaNbeudGTcgndGUbZMbeuaahbZCcchcciccjbZGcckcclbZHccmccnccobZLaahaahaahaahaahaahbZMbZNbZMbZMbZMbZMaahaahaahaahcbcccpaEGccrccscctccuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsccvccwccxbXsahyahyaahaahaahbZXbZXbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbSEccycczbSEbSEbSLbSLbSLbSLbSLccAbSLbSLbSLccEccCccDbSLbUEbUybUybUybUBbUBbUybUybUybYXcalcamcanbecbecbecbcnaZzbeeahybUGbUGbUGbUGbUGbUGbUGbUGccIccJccKccLbNCbNCccMbNCbNCbNCccNccObNCccPaZdccQaZdaZdcDsbTlbUZdBRbVbbVcccTccUbVbbVaccVccWbUZbVadBOccXbTkbTlcbYcaIahyahybrGaUvbetaUvbvNahyahyahyahyahyahyahyahyahyahyahyccBccYccZcaNbeucgncgndGWbZMbeuaahbZCbZCbZCbZCbZCcdacdbbZLbZLbZLbZLbZLaahaahaahaahaahaahbZMbZNbZMaahaahaahaahaahaahaahcbccdccddcdecdfcdgcdhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsccvccwccxbXsahyahyaahaahaahbZXbZXbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbSEccycczbSEbSEbSLbSLbSLbSLbSLccAbSLbSLbSLccEccCccDbSLbUEbUybUybUybUBbUBbUybUybUybYXcalcamcanbecbecbecbcnaZzbeeahybUGbUGbUGbUGbUGbUGbUGbUGccIccJccKccLbNCbNCbYmbNCbNCbNCccNccObNCccPaZdccQaZdaZdcDsbTlbUZdBRbVbbVcccTccUbVbbVaccVccWbUZbVadBOccXbTkbTlcbYcaIahyahybrGaUvbetaUvbvNahyahyahyahyahyahyahyahyahyahyahyccBccYccZcaNbeucgncgndGWbZMbeuaahbZCbZCbZCbZCbZCcdacdbbZLbZLbZLbZLbZLaahaahaahaahaahaahbZMbZNbZMaahaahaahaahaahaahaahcbccdccddcdecdfcdgcdhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybYFcdiccwcdjbYFahyahyaahaahaahbZXcdkcdlcdmbZXbZXbZXbZXaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbSEbSEbSEaahaahaahaahbZXcdncdobZXahyahyahyahyahyahybUEcbBcbCbUBbUBbUBbUBcbDbUBcbEcbFcamcancbGcbHbecbcnaZzcbOcbOcbOcbOcdpcdqcdrcdscdtbFpcdvcdwcdxcdycdzcdAcdBcdCcdDcbOcbOcbOcbOcbOcdEcdFcdGbURbURaouccUbVbbYtccVaovbUZbYtdBObVccdIccUcdJcdKcdLcdMcdNcdOcdSahyahybrGcdQbetcdRaTocaNahyahyahyahyahyahyahyahyahyahycelcdTcdUcaNbeudGYdGXdGZbZMbeuaahaahaahaahaahbZMcdVcdWbZMaahaahaahaahaahaahaahaahaahaahbZMbZNbZMaahaahcbccbccbccbccbccbccdXcdXcbccbccbccbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahbZUbVSbVQbZUcdYccwcdZbZUbVSbVQbZUbZUbZXbZXceacebceccedceecefbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXcegcehceiceiceiceiceiahyahybUEbUEbUEcdPccFccFccGbUEbUEbUEbUEbUEbYZbZabeecejbjSaZzcekceLcemcbOcenceocepceocencencenccJccKcencencencdBceqcercescbOcetceLceucevcewcexceycezceAceBceCceDceAceEceAceFceCceBceGceBceCceHceIbTkbTlceJbURahyahybvNaUvbetaUvceKcaNcgqceMceMceMceMceMceMceMceMceNcaNceOcePcaNbZMdHabZMbZMaTWbeuaahaahaahbZMbZMbZMceQceRbZMaahaahaahaahaahaahaahaahaahbZMbZMbZNbZMaahaahcbcceSceTceTceTceTceUceUceVceTceTceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbZUceXceYceXceZcfacfbcfccfdcfecffcfgcfhcficfjcfkcflcfmcfncfobZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXcfpcfqcfrcfscftcfuceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybbocfvcfwcfxcfycfzcfAcfBcfCcfDcfEcfFcfFcfFcfFcfGcfHcfFcfFcfFcfIcfJcfDcfKcfLcfMcfNcfOcfPcfQcfRcfSbTpcfTbTlbTkbTlbTkcfUbTkbTlbTkbTlcfVbTlbTkcfWbTkbTlbTkcfXbZyahyahyaTocfYbyncfZaVlcgacgbcgbcgbcgccgbcgbcgdcgbcgbcgbcgbcgecgfcggbZMdGYcgicgnbZMbZMbZMbZMbZMbZMcgjcgkcglcgmbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMdHbbZNbZMaahaahcbccgocgpcgTcgrcgscgtcgucgvcqbcgxceTceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9849,58 +9863,58 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcmScmTcmUcmVcmWcjgcmXbObcmZcnacnbcnScndcnecnfcngcnhcmichYaahaahaahaahaahaahamYartaoDaqwaqBaqwaoDanFamYcnicnjcnkcmjaahaahaahbZXcnocjubZXbWTckJccqdEldElahyclYcnpcnqcnrcnsckIcntcnucnvckIcnwcjzahyahyahyahybaibjQbeccimbDMbDNbeccmzcfRcnxcfRcnycnzcnAcnBcfRcnCcnxcfRcfRcnDcnxcnEcfRcnFcfRcnxcfRcjKcnGchicnHcevcevcnIcevcnJcevcnKcnMcevcnLcxCcevcnJcevcevcevcevcnJcevcnNcevcevcevcnIcnOcnQcnPcnRcfRbKGcodahyahOaqDaqCaqZaqEaraahOaahaahaahaahaahaahaahaahaahaahbZMbZMbZMbZMbZMbZMcnTciVcgnbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjaahaahcjgcnUckXcnVcnWcnXcnYcnZcoacobcoacoccoocoecleclecofchYbRKchYaahaahaahaahaahaahamYanBarbardarcaoDaoDaqwamYcogcohcoicmjaahaahaahbZXconcjubZXclxcrlcmycrqdElahycowckFckFcopcoqckIckIcorckIckIcoscjzahyahyahyahybbobbocotcimbcnbeccoAbboclmckLckMciFclmckMciFcovcoGcoxcoycozcoScoxcoBcovciFclmckLckMciFcoCckicoDcmBcoEciFclmckLckMciFciFclmckLckMczAclmckLckMciFciFdCQckMciFclmckLckMciFcoFckickicfRcoXciFciFaahahOareaiearfaieargahOaahaahaahaahaahaahaahaahaahbZMbZMcoHcoIcoJcoJcoJcoJcoKcoLcoLcoLcoLcoLcoLcoLcoMcoNcoObZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbLjaahaahcjgcoPckncoQcmacoRcpqcoTcoUcoVcoacoWcpPcoYcoZcpacpbchYcpcchYaahaahaahaahaahaahamYariarharkarjarmarlarnamYcpdcohcpecmjaahaahaahcpjbZXarqbZXcpjcvVcrrcvWdElahyahyahyahycjzcplcpmcpncpocppcpTcprcjzahyahyahyahyahybbobbocpscptcmzbbobboahyahyahyahyahyahycovawtcpvcpwcpxcpycpzcpAcpBawucovahyahyahyciFciFcpDcpEckjciFciFahyahyahyczZcEVcEVcEVcEvcEvcEvcEVcEVcEWczZahyahyahyahyahyahyciFciFcjIcjIcjKciFciFaahaahahOahOaiaarraidahOahOaahaahaahaahaahaahaahaahaahbZMcpFcpGcpHbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcpIcoMcpJbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahcjgcpKcpLcpMcpNcpOcqecpQcoacpRcoacpSchYcqzcpUcqzcpVcpWchZchYcpXcpXcpXcpXcpXcpXamYamYarsauQaruauRarvamYamYcmjcpYcmjcmjcpXcpXcpjcpjcFucFrcqdcpjdElcxWcyjdElcrIcqfcqfcqgcjzcjzcjzcjzcqhcjzcjzcjzcjzcrIcqfcqfcqfcqgcpjcqicqjcqkcqlcqmcpjcpjahyahyahyahyahycovcqncqocqpcqqcqrcqscrJcpBcqucovahyahyahyahycqvcqwcqxcqycqvahyahyahyahyczZcuIarwcxUcEvcEvcEVcEVcEVcIFczZahyahyahyahyahyahyahycrNckicqAcqBciFaahaahaahaahahOahOahOahOahOaahaahaahaahaahaahaahaahaahaahbZMcqCcgnbZMbZMaahaahaahaahaahaahaahaahaahaahaahbZMbZMcgncqDbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahcjgbfncpLcpMcpNcpOcqecpQcoacpRcoacpSchYcqzcpUcqzcpVcpWchZchYcpXcpXcpXcpXcpXcpXamYamYarsauQaruauRarvamYamYcmjcpYcmjcmjcpXcpXcpjcpjcFucFrcqdcpjdElcxWcyjdElcrIcqfcqfcqgcjzcjzcjzcjzcqhcjzcjzcjzcjzcrIcqfcqfcqfcqgcpjcqicqjcqkcqlcqmcpjcpjahyahyahyahyahycovcqncqocqpcqqcqrcqscrJcpBcqucovahyahyahyahycqvcqwcqxcqycqvahyahyahyahyczZcuIarwcxUcEvcEvcEVcEVcEVcIFczZahyahyahyahyahyahyahycrNckicqAcqBciFaahaahaahaahahOahOahOahOahOaahaahaahaahaahaahaahaahaahaahbZMcqCcgnbZMbZMaahaahaahaahaahaahaahaahaahaahaahbZMbZMcgncqDbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahcjgctxckncqFcqGcqHcqIcqJcqJcqKcqLcqMcqNcqOcqOcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqYcqZcqOarxcracqYcqYcqYcqYarycqOcrdarzcrfcrgcrhcricrjcMIcMjcrmcrncrocOZcrudBNcrscrtcrucrucrvcrucricrwcrxcrycrzcrAcrBcrAcrCcrAcrDcrAcrzcrAcrEcrFcrGcrucrHcrRahyahyahyahyahycrWcqtcrKcrLcrLcrMcrLcrLcpBcqtcrWahyahyahyahycsKcrOcrPcqycsKahyahyahyahycIHcEVcEVcEVcEVcEVcEVcEVcEVcJKcrQcrQcrQcsLcrScrTcrUcrQcrQctccsNctccrQcrQcrQcrQaahaahaahaahaahaahaahaahaahaahaahcrXcrXcrXcrXcrXbZMcrYcrZcrZcrZcrZcrZaahaahaahaahaahaahaahcsacsacsacsacsacsbbZMcsccsccsccsccscaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahcjgcsdcknckncsecsfcsgcshcshcsicshcsjcskcslcsmcsncsncsncsocspcsqcsrcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsucsvcswcsxcsycswcswcsvdBPcswcswcszcsAcsBcrucrucrucricrucsCcswcsDcswcsEcswcswcswcsFcswcsvcswcsGcsHcsIcrucsJcsRahyahyahyahyahyctmcqtcrKcrLcsMcsMcsMcrLcpBcqtctmahyahyahyctucsOcrOcsPcsQcumcsSahyahyahycMYcEVcEVcDncEVcEVcEVcEVcFecrQcrQcwtctdcsXcwtcwvcsXcsYcwwctbcsYctbctecxOcwxcrQcrQaahaahaahaahaahaahcrXcrXcrXcrXcrXctfctgayocrXctictjcrZayqctlcurcrZcrZcrZcrZcrZcsacsacsacsactnctoayscsactqctrcscayvcttcuTcsccsccsccsccscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaabLjbLjcjgctvctwcALctycmacjgbRMctActBctCctDctEctFctGctHcrfcrfcrfctIctJctKcrfctLctMctNcrfctFctOcrfcrfctPctQctRctSctTctQctQctUctVctWcrocrpctXctYctZcuacubdCbcuadCfcuacuccudcuacuacuacubcuecufcuacubcuacugcuacuhcuicuacuacubcuacujcrucukcruculcuYahyahyahyahyahyctmcuncuocrLcsMcupcsMcrLcuqcunctmahyahyahycvacqycrOcrPcqycqycvaahyahyahycMYcJacEVcLvcEVcQdcEVcEVcEVcrQcxScsYcwrcwscwscwscwscwscwsczmczlczoczncPbcPbcBjcrQaahaahaahaahaahaahcrXcuuazEcuucrXcNfcuxdGMcrXcuzcuAcrZcuNcuCcuDcrZcuEazFcuEcrZcuGaAdcuGcsacOScuJdHccsacuLcuMcsccwEcuOcuPcsccuQaADcuQcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadcuScuScvgcuUcuScuVcuWcuScuScuScuXcvocuZcuXcvrcvbcuXcvccvdcvecvfcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpjcvNcvhcrFcvicvjcpjcpjcpjcpjcrIcqfcqfcqfcqfcqgcpjbRRcvlcqdcpjcrIcqfcqgcpjcrIcqfcqgcpjcvmcrucrucrGcvncpjcpjahyahyahyahyahycwjcvpcuocrLcrLcrLcrLcrLcuqcvqcwjahyahyahycqvcwqcrOcrPcqycvscqvahyahyahycRUcWRcEVcEVcEVcEVcEVcEVcWRcrQcBkcsYcsYcsYcvucvucvucvucvuctbcDpcwzcsYcsYcsYcducrQaahaahaahaahaahaahcrXaAEcvxaAEcrXcrXcvycrXcrXcwFcwGcrZcrZcvBcrZcrZaAFcvDaAFcrZaAGcvFaAGcsacsacvGcsacsacvHcvIcsccsccvJcsccscaAHcvLaAHcscaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxfcvOcvPbHqbIfcvScvTcvUdEKdEJcvXcvYcvZcwacwbcwccuXcpXcpXcpXcpXcpXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcpjcwdcwecwfcwgcwdcpjdELdELdELahyahyahyahyahyahycpjcwhcwicwhcpjahyahyahyahyahyahyahycxAcqicqicqicwkcqicxAahyahyahyahyahyahycovcuncwlcwmcwncwocuncuncuqcwpcovahyahyahycsKcqycrOcrPcqycqycsKahyahyahyczZcPicEVcEVcEvcPocEVcEVcEVcrQcvucvucsYcsYcBicDqdBUcxPbdUctbcxRcsYcFdcFdcFdcFdcrQaahaahaahaahaahaahcrXcwBcwCcwDcPvcwDcwJcwHcwLcwKcwUcwTcwXcwVcwMcwNcwMcwOcwPcrZcwQcwRcwScPBcwScyacyecybcyqcyfcwYcwZcxacxbcxccxbcxdcxecscaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxNcxgcxgcxgcxgcvScvTcxhcxhcxicuXcxjcxkcxlcxmcxncuXcxocxpcxqcxraahaahaahaahaahcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxscxtcxucxvcxwcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcxxcxycwhahyahyahyahyahyahyahyahycxzcyBcxBczkcxDcyBcxzahyahyahyahyahyahycovcovdHdcxFcxGcxHcxIcxJdHecovcovahyahyahycumcsScxLcxMcqyctucsOahyahyahyczZczZcEVcTdcQncUncEVcEVddacrQcEFcxPcsYcsYcxQcxQcxQcxQcxQctbcxRcsYcFdcFdcFdcFbcrQaahaahaahaahaahaahcrXcxVaAKaAIcxYcxZcytcyrcrXcyccydcrZcAkcyucygcyhcyidENcykcrZcyldEPcyncyocypcAqcAucsacyscAxcBocBncyvcywcyxcyydEQcyAcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczTcyCcyDcyEcyFcxgcxgcvScyGcyHcyIcyJcyKcyLcyMaGXcyOcyPcuXcxqcxqcxqcxrcxrcxrcxrcxrcxrcxrcyQcyRcyScyScyScyScyScyScyScyScyScyScyScyTcyScyUcyVcyWcyXcyYcyVcyZczaczbczaczaczaczaczaczaczaczaczaczccwhahyahyahyahyahycxzcxzcxzcxzczdczebTgczgczhcxzcxzcxzcxzahyahyahyahycovcovcovcziczjczicovcovcovahyahyahyahyahycvacrOcrPcqycvaahyahyahyahyahyczZczZczZczZddeczZczZczZcrQcxQcxQcDocwycwycwycFccHvcHrcJzcHxcsYcFdcFdcFdcFdcrQaahaahaahaahaahaahcrXcrXcrXcrXcrXcrXcBqcrXcrXczpcuAcrZcrZcBrcrZcrZcrZcrZcrZcrZcsacsacsacsacsacBucsacsacuLcBvcsccsccsccsccsccsccsccsccscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczTcyCcyDcyEcyFcxgcxgcvScyGcyHcyIcyJcyKcyLcyMaGXcyOcyPcuXcxqcxqcxqcxrcxrcxrcxrcxrcxrcxrcyQcyRcyScyScyScyScyScyScyScyScyScyScyScyTcyScyUcyVcyWcyXcyYcyVcyZczaczbczaczaczaczaczaczaczaczaczaczccwhahyahyahyahyahycxzcxzcxzcxzczdczebTgczgczhcxzcxzcxzcxzahyahyahyahycovcovcovcziczjczicovcovcovahyahyahyahyahycvacrOcrPcqycvaahyahyahyahyahyczZczZczZczZbgjczZczZczZcrQcxQcxQcDocwycwycwycFccHvcHrcJzcHxcsYcFdcFdcFdcFdcrQaahaahaahaahaahaahcrXcrXcrXcrXcrXcrXcBqcrXcrXczpcuAcrZcrZcBrcrZcrZcrZcrZcrZcrZcsacsacsacsacsacBucsacsacuLcBvcsccsccsccsccsccsccsccsccscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczrczsczrczscztczuczvczwczxczyczzcxgcArczBczCczDczEcuXcuXczFczGczGczGczGczGczGczGczGczGczGczHcxqcxrcxrcxrcxrcxrczIczIczJcxrcOHczKcxqcxrczLczMczNczOczPcwhczQczQddgddmddkczQczQcwhcwhcwhcwhczRcwhahyahyahyahyahycxzczSczScABczUczVczWczXczYcAIcAacAacxzaahahyahyahyahyaahaahczicAbcziaahaahaahahyahyahyahyahycqvcAccAdcAecqvahyahyahyahyahyahyahyahycBgcWQcBgahyaahcrQcJNcxTcKMcxTcxTcFacFacKNcxTcxTcMecDrcFdcFdcFdcmYcrQaahaahaahaahaahaahcAicCbaEJcCbcAicAjcBxaywcAicAmcAncAoayEcCccBbcAocCfaFxcCfcAocCkaFzcCkcAscAtcClazxcAscAwcCmcAyazycAAcBAcAycCoaFRcCocAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcAEcAFcxgcxgcvScvTcAGczzcAHcBTcAJcAKcMdbWMcuXcxqcANcxqcxqcxrcxrcxrcxrcxrcxrcxrcxrcAOcxrcxraahaahaahcxrcAPcAPcAPcxrcxrcxrcxrcwdcwdcAQcARcAScwdcwdcwhcwhcwhcwhcwhczQcwhcwhaahaahcwhczRcwhaahahyahyahyahycxzcATczecAUcAVczeczeczgcAWcAXczecAYcxzaahahyahyaahaahaahaahczicAZcziaahaahaahcBacCScBccBacqvcqvcBdcBecBfcqvcBgcBgcBgcBgcBgahyahyahycBgcWQcBgaahaahcrQcvucvucMXcGzcGAcGAcGAcNJcGAcGzcNMcsYcNVcNVcNWcNXcrQaahaahaahaahaahaahcAiaGxaHMaGxcAicBmcDydHfcAiczpcBpcAocDDcDCcBscAoaJaaHOaJacAoaKbaJIaKbcAscBtcDMdHgcAscBwcBvcAycFkcBycBzcAyaKnaKpaKncAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcEBcyCcBBcBCcxgcxgcxgcBDcvTcAGczzcBEcuXcvrcvbcuXcuXcuXcxrcANcBFcxrcxraahaahaahaahaahaahcxrcBGcBHcxraahaahaahcBIcBIcBJcBIcBIaahaahaahaahcwdcBKcxucxvcwdaahaahaahaahaahcwhczQcwhaahaahaahcwhczRcwhaahaahaahahyahycxzcxzcxzcxzcBLcBMcBNcBOcbocxzcxzcxzcxzaahaahaahaahaahaahaahczicAbczicziczicBacBacymcBRcBacBScEIcrOcrPcqycBUcBgcBVcBWcBXcBgcBgahyahycBgcWQcBgaTWaahcrQcNRcxPcMXcGzcHscHtcHucNUdFccGzcNMcsYcPccPccPccOVcrQaahaahaahaahaahaahcAiaKqaKFaHMcAicAicFlcAicAicCdcvAcAocFmcCecAocAoaHOaKGaKHcAoaLuaLtaJIcAscAscFncAscAscvHcFycAycAycCncAycAyaKpaLxaLvcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcCrcyFcxgcxgcvScvTcAGczzcCscCtcCucCvcCwcCxcCycCzcCAcxrcxraahaahaahaahaahaahaahcxrcCBcCCcxrcxraahaahcBIcBQcCEcCDcBIcCGcCGcCGaahcwdcCHcCIcCJcCKcCKcCKcCKcCKcCKcCKcCLcCKcCKaahahycwhczRcwhaahaahaahaahahycxzcCMcCNcABcCOczVcCPcCQcCRcEKcCTcCUcxzaahaahaahaahaahaahaahczicCVcCWcCXcCXcCYcCZcDacDbcDccDdcDecDfcDgcDhcDicBgcDjcDkcDlcDmcBgcBgcBgcBgcWQcQzcBgcBgcrQclXcxQcMXcGzcHscHtcIGcOYcHwcGzcNMcsYcQHcQHdERcPacrQaahaahaahaahaahaahcAicDtcDucDvcDwcDvcFAcFzcDzcDAcwIcDBcHFcHAcDEcDFcDEcDGcDHcAocDIcDJcDKcDLcDKcHGcHKcDOcwWcHNcDPcDQcDRcDScDTcDScDUcDVcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcDWcDXcDWcDYcDZcEacEbcEccEdcEeczzcEfcCtcEgcEhcEicEjcEkcCtcxrcxraahaahaahaahaahaahaahaahcxrcElcEmcxqcxraahaahcBIcBQcCEcCDcBIcEncEocCGcCGcwdcEpcEqcErcCKcEscEtcEuddpcEwcEwcEwcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcATczecEycAVczecEzczgcEAcFHczeczecxzaahaahaahaahaahaahaahczicECcEDcEEcEDcBackacEGcEHcFXcEJcGfcELcEMcENcEOcEPcEQcERcERcEScETcEUcEUcQecZMcEXcQfcEYcEZcxTcxTcQgcQhcHscJLcJMcQFcHwcGzcNMcQIcQGcQGcQGcQGcQGaahaahaahaahaahaahcAicFfdEScFhcFicFjcIKcIJcAicyccydcAocIPcILcFocFpcFqdEUcFscAocFtdEVcFvcFwcFxcIQcIRcAscyscAxcKacJRcFBcFCcFDcFEdEWcFGcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcGjcFIcFJcFKcDZcxgcxgcvScFLcyHcFMcFNcFOcFPcFQcFRcFScFTcCtaahaahaahaahaahaahaahaahaahaahcxrcElcFUcxqcxraahaahcBIcCFcCEcCDcBIcFWcGpcFYcFZcwdcGacGbcGccCKcGdcGecEwcEwcEwcEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcxzcxzcxzcGqczecGgcGhcOIcGBczecGkcxzaahaahaahaahaahaahaahczicECcGlcziczicBacGmcGncGocGScEJcHccGrcrPcqycGscBgcGtcGucGvcGwcBgcBgcBgcGxcXdcERcERddqcrQcrQcrQcrQcrQcKJcKKcKLdhfcHwcGzcNMcQGcQGdkBdkBdlCcQGaahaahaahaahaahaahcAicAicAicAicAicAicKbcAicAiczpcuAcAocAocFmcAocAocAocAocAocAocAscAscAscAscAscKScAscAscuLcBvcAycAycAycAycAycAycAycAycAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacHHcGCcGDcGEcGEcGFcGGcGGcGGcGGcGHcGIcGIcGJcGKcGLcCtbkQbkQahyahyahybkQbkQaahaahaahcxrcGMcGNcxrcxraahaahcBIcFgcGPcFFcBIcGRcHRcCGcCGcwdcGTcCIcGUcGVcGWcGWcGWcGXcGXcGXcGXcGYcCKahyahycwhczRcwhaahaahaahaahaahcxzcGZczecABcHaczVcCPcCQcHbcHSczecGkcxzaahaahaahaahaahaahaahczicAbczicziaahcBacHdcHedmEcHgcHfcHccHicHjcHkcHlcHmcHncHocHmcHpcHmaahcBgcBgcHqcGxcGxdnjcOUdBScFVcMfcrQcrQcMgcMhdhfcHwcGzdBVdDhdDgdDjdDidDkcQGaahaahaahaahaahaahaahaahaahaahcHycHzcKTazzcHycHCcHDcHEazAcKWcIzcHEaahaahaahaahaahaahaahcHIcHJcLgazBcHIcHMcLhcHOazCcHQcJtcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacJwcGCcDXcHTcDXcHUcHVcxgcxgcHWcCtcHXcGKcHYcHZcIacCtbkQcIbcIccIccIccIcbkQaahaahaahcxrcIdcIecxraahaahaahcBIcBQcIfcGOcBIcIhcIicIjcIkcwdcIlcImcIncCKcGecIocGecEwcGecEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcIpczecIqcAVcIrcIscItcAWcIuczecGkcxzaahaahaahaahaahaahaahczicAbcziaahaahcBacIvcIwcHhcFXcIycKDcrOcrPcIAcDicHmcIBcICcIDcIEcHmaahaahcBgcHqcBgcOTdDlcNKcNTcNLcNNctzcNOcNPcNQdDmcNScNTdDncQGdDodDqdDpdDrcQGaahaahaahaahaahaahcHycHycHycHycHycIIcMpdHhcHyczpcuAcHEcMqcIMcINcHEcHEcHEcHEcHEcHIcHIcHIcHIcIOcMrdHicHIcuLcBvcHOcMtcIScITcHOcHOcHOcHOcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadcvMcvMcvMcvMcvMaadaadaadcuScuScuScuScuScuScuScIUcIVcIWcIXcIYcIZddOcJbcCtcCtahycIccJccJdcJccIcahyahyaahcJecJecJfcJgcJeaahaahaahcBIcBQcJhcJicJjcJkcJlcJmcJmcwdcJncJocJpcCKcJqcGecEwcEwcEwcEwcJrcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcJsczecMLcJuczVcJvczXczYcNgczeczecxzaahaahaahaahaahaahaahczicAbcziaahaahcBacJxcJycIxcGScJAcJBcJCcJDcJEcJFcHmcJGcJHcJIcJJcHmaahaahcBgcGycBgcBgcBgcrQdFdcsYcOWdHjcrQcHtdDscOYdDtcsYdDucQGdDvcQGdDwcQGcQGaahaahaahaahaahaahcHycJOcJPcJQcHycHycMucHycHycJScvAcHEcMvcJTcHEcHEcJUcJVcJWcHEcJXcJYcJZcHIcHIcMwcHIcHIcvHcMxcHOcHOcKccHOcHOcKdcKecKfcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaadbkQaahaahaahaahaahcuScuScuScuScCtcCtcCtcCtcCtcCtaahahycIccJccJccJccIcahyahyaahcJecKgcKhcKicJecKjcKjcKjcBIcBIcKkcKlcBIazDcKncKocKpcKqcKrcKscKtcKqcKucGedeccKvcEwcKwcKwcKwcCKahyahycwhczRcwhaahaahaahaahaahcxzcKxczecHScKyczecKzczgcKAcHScKBcKBcxzaahaahaahaahaahaahaahczicAbcziaahcKCcKCcNYcKEcKFcKCcKCcKCcKGcKHcKIcKCcKCcKCcKCcKCcKCcKCcKCaahcBgcHqcBgaahaahcrQcrQcQAcQBcQCcrQcQDcQEdDydDxcsYcsYcQGdDzcQGdDAcQGaahaahaahaahaahaahaahcHycKOcKPcKQcKRcKQcMzcMycKUcDAcwIcKVcMBcMAcKYcKZcKYcLacLbcHEcLccLdcLecLfcLecMCcMDcLicwWcHNcLjcLkcLlcLmcLncLmcLocLpcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccLqcLrcLscIcahyaahaahcJecLtcLudEXcJecLwcLxcLycLzcBIcLAcBIcCGcCGcLBcCGcLCcKqcLDcLEcLFcKqcLGcLGcLGcLGcLGcLGcLGcLGahyahyahycwhczRcwhcziaahaahaahaahcxzcxzcxzcxzcLHcLIcLJcLKcLLcxzcxzcxzcxzaahaahaahaahaahaahcziczicAbczicKCcKCcLMcLNcLOawvcLQcLRcLScLTcLUcLVcLWcLXcLYcLZcMacMbcMccKCcKCcBgcHqcBgahyaahaahcrQcrQcrQcrQcrQcrQcrQcrQcrQdDCdDBcQGcQGcQGcQGcQGaahaahaahaahaahaahaahcHycMidEYcMkcMlcMmcMndBWcHycyccydcHEdBYdBXdCadBZdCcdEZdCedCddCgdFadCidChdCkdCjdClcHIcysdCmdCodCncMEcMFcMGcMHdFbcMJcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQcIccMKcNZcMMcIcbkQcMNcMNcMNcMNcMPcMOcKjcMQcMRcMScMTcMUcMVcMWdDDcoucMZcNacMUcNbcNccNdcNecrVcOpcNhcNicNjcTfcLGcNlcLGcLGahyahycwhcNmcNncziczicziczicziczicNocNpcxzcNqcxzcNrcxzcNqcxzcEDcEDcziczicziczicziczicziczicUqcXxcUucKCcNucLPcLPcNvcNwcNwcNxcNycNzcNAcNBcNCcNDcNEcNEcNEcNFcLPcNGcKCcZgdDEcBgahyahyaahaahaahaahaahaahaahaahcWudDFdbMdbMdDGcWuaahaahaahaahaahaahaahaahaahaahcHycHycHycHycHycHycHycHycHyczpcuAcHEcHEcHEcHEcHEcHEcHEcHEcHEcHIcHIcHIcHIcHIcHIcHIcHIcuLczqcHOcHOcHOcHOcHOcHOcHOcHOcHOaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQbkQcOsahycOMbkQbkQcMNcOacObcOccOdcOecOfcOgcOhcOicMTcOjcOkcOlcOlcOmcOncOocPFcOqcNccNdcNecOrcPPcOtcOtcyzdDHcOvcOtcOwcLGahyahycwhcOxcOycOzcOAcOBcOCcOCcOCcOCcOAcOAcOAcODcOEcOFcOAcOCcOCcOGcOCcOCcOCcOCcOCcOCcOCcOCdlDdBIdBHcKCcOKcLPcLPcOLcLPcLPcPYcONcOOcOPcOQcONcPYcLPcLPcLPcORcLPcLPcKCdBJcHqcBgahyahyahyaahaahaahaahaahaahaahcWudDIdbMdbMdDJcWuaahaahaahaahaahaahaahaahaahaahcPdcPecPfcPgcPhaGYcPjcPkcPdcPlcPmcPncuscPpcPpcPqcPpcutcPrcPscPpcPtcPpcPucPpcPpcvkcPncPwcPlcPxcPycPzcPAaEycPCcPDcPEcPxaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahycQscPGcPGcPHcPGcPIcPJcPKcMNcPLcPMcPMcPNcPOcRfcPQcPRcPScMTcPTcPUcOocPVcPWcOocPXcRucPZcNccQacQbcQcdcEdDKdDMdDLdDNcQicQjcQkcLGahyahycwhcQlczQczicziczicziczicziczicziczicEDcEDcEEcNscEDczicziczicziczicziczicziczicziczicQmcEDdBKcKCcQocQocLPcQpcQqcQrcRJcQtcOOcQucQvcQwcRJcQxcQocLPcQycQqcQocKCdCRcHqcBgahyahyahyahyaahaahaahaahaahaahcWucWudDPbsUcWucWuaahaahaahaahaahaahaahaahaahaahcPdcQJcQKcQKcQLcQKcQKcQMcQNcQOcQPcQQcQRcQRcQRcQScQRcQTcQUcQVcQWcQXcQRcQYcQRcQRcQRcQQcQZarAcRbcRccRccRccRdcRccRccRecPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjbLjaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahycSAcRgcRhcRicRjcRkcRlcRmcRncRocRpcRqcRrcRscRtcSLcRvcRwcRxcMTcRycPUcRzcRAcRBcRCcOlcRDcREcRFcRGcRHcRIcTadDQcRKcRLcRMcRNcROcRPcLGahyahycwhcRQcwhcziahyahyahyahyahyahyahycziczicziczicziczicziaahaahaahaahaahaahaahaahaahcziczicRRdCScKCcRTcRWcRVcLPcRWcRXcRJcRYcOOcOPcOQcRZcRJcRTcRWcLPcRVcRWcSacKCdCTcSccBgahyahyahyahyahyaahaahaahaahaahahydDRdbMdDUdDRahyaahaahaahaahaahcXGcXGcXGcXGaahcPdcSdcSecSfcSgcShcSicSjcSjcSkcSlcSmcSlcSlcSlcSncSlcSlcSlcSocSpcSqcSqcSrcSqcSqcSqcSscStarBcSucSucSvcSwcSxcSycSyarCcPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahbLjbLjaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQcTZcSBcSCcPMcSDcPMcSEcSFcSGcSHcPMcPMcSIcSJcSKcUlcSMcSNcSOcMTcSPcSQcSRcSScSTcSUcSVcSWcSXcSYcSZcNecRIcUscTbcOtcTccOtcTearDcTgcLGahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahczicThcRScKCcTicTjcTkcLPcTlcTjcRJcTmcTncTocOQcTmcRJcTjcTjcTpcLPcTlcTqcKCcSbcTrcBgahyahyahyahyahyahyahyahyahyahyahydDTdbMdDUdDTahyahyahyaahaahcXGcXGasfasecXGaahcPdcPdcTscTtcTucTvcTwcTxcPdcPncPncPncTycTzcTzcTAcTBcTCcTDcTEcTFcTGdCUcTHcTzcTzasgcPncTDashcPxcTJcTKasicTMcTNcTOcPxcPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcTZcSBcTPcTQcTRcTScTTcTUcTVcTWcPMcPMcTXcSIcTYcKjcUvcUacUvcMTcUbcUccUdcUecUecUfcPXcPFcUgcUhcUicUjcRIcUkcUycUmcUodcLcUkcUkcUkcLGahyahycwhcUpcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahahyczidCVcRScKCcUrcLPcORcLPcLPcLPcUHcONcOOcOPcOQcONcUHcLPcLPcOLcLPcLPcUtcKCcSbdCWcBgahyahyahyahyahyahyahyahyahyahyahycWudDWdDVcWuahyahyahyahyaahcXGasjaskdaDcXGaahaahcPdcUIcUwcUwcUwcUxcPdcPdaahaahcPncPncUYcUzcUzcUAcPncUBcUCcUDcPncPncPncPncPncPncPncUBcPmcPxcPxcPxcPxcPxcPxcPxcPxaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccUEcUEcUFcUGcVucVgcUJcUKcULcUMcPMcUMcUNcUOcUPcUQcURcUScUTcUUcUVcRqcUWcUXcVQcUZcOocOocOocOocOocVacRucVbcUhcVccNecVdcVecVfcWicVhcVicVjcVkcVlcVmahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahahyahyahyahyahyahyczicVncEDcKCcLPcLPcVocNEcNEcNEcNDcNCcVpcVqcVrcNycNxcNwcNwcVscLPcLPcLPcKCcGxcVtcBgahyahyahyahyahyahyahyahyahyahyahydDRdbMdbSdDRahyahyahyahyahycXGaslaskasmcXGahyahyahyahyahyahyahyahyaahaahaahaahaahahyahyahyahyahycWvcVvcVwcVxcPnaahaahaahaahaahabTasoasnabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccVycVzcVAcNZahycTZcVBcVCcVDcVEcVFcUMcVGcVHcVIcVJcVKcVKcVLcVMcVNcPMcVOcVPcWBcVRcVScVScVTcOocVUcVVcMTcVWcVXcVYcNecVZcWacWbcWicWccWdcWecWfcWgcVmcwhcwhcwhcRQcwhcWhcWhcWOcWjcWkcWhcWhcWOcWjcWkcWhcWhahyahyahyahyahyahyahyahyahyahyahyahycziczicWlczicKCcWmcWncWocWpcvtcLPcLRcONcOOcOOcOQcONcLRcLPcvtcWpcWqcWrcWscKCcBgcWtcBgcBgahyahyahyahyahyahyahyahyahyahydDTdbMdbSdDTahyahyahyahyahycXGcXGaspcXGcXGahyahyahyahyahyahyahyaahaahaahaahaahahyahyahyahyahyahycXncWwcWxcWycWuaahabTabTabTabTabTastasqabTabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccUEcUEcWzcWAcVucXucWCcWDcWEcWFcWGcWHcWIcWJcWJcWJcWFcWFcWFcWKcWLcPMcWMcWNcMTcMTcXycWPcwAcvvcXycWPcWScWTcWUcVYcNecWVcWWcWXcWicWYcWZcXacXbcXccVmdDXcXecXecXfczQcWhcXgcXhcXicXjcXkcXlcXhcXmcXhcXhcWhcWhcXHcXocXocXocXocXocXpcXqcXHcXpcXqcXqcXrcXscXtcKCcKCcNYcKEcKFcKCcKCcKCcYfcXvcXvcKIcYfcKCcKCcKCcNYcKEcKFcKCcKCcXtcXwdCXcXqcXqcZncXzcXzcXzcXAcWucWucWudDYcWucWwdDZcWucZncXzcXzcXAcWucWucXBasvdHkcWucWucWucWucZncXzcXzcXAcWucWucWucWucWucWucWucZncXzcXzcXAcWucXDcXEcXFcWuabTabTaswacwacwasxacuaeVaszasyacwacwabTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcZocXIcXJcVDcXKcXLcUMcUNcXMcXMcXNcUOcVEcXOcXPcWFcXQcXRcXScXTcXUcXVcXWcXXcXYcXZcYacYbcYacYccYdcNecYecWacNcdaTcYgcYhcYicYjcYkcVmcRQczQcYlczQczQcYmcYncYocYpcYqcYncYrcYpcYscYtcYucYvcYwcYxcYycYxcYxcYzcYxcYAcYBcYxcYxcYCcYDcYEcYFcYGcYHcYCcYxcYIcYxcYycYJcYKcYxcYxcYxcYLcYxcYMcYNcYycYxcYxcYxcYCcYxcYGcYOcYPcYPcYQcYRcYScYRcYTcYRcYUcYVdCYcYRcYScYRbtlcYRcYRcYRcYWcYRcYXcYScYYasAcYZdCYcYXcYRcZacYRcYRcZbcYRcYRcZccYUdCYcYRcYRcZdcYRcYRcYScYRcYXcZecZfcXFasBasDasCacuacuacuasEasFaeVacuacuacuacuawwabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkcZlcZmdbDdbdcZpcZqcVMcZrcPMcUMcUNcZscZtcZucVGcVHcZvcZqcZwcZxcZycZqcZzcZAcZBcZCcZDcZEcZFcZGcZHcZGcZIcZJcZKcZLdmbcZNcZOcZPcZQcZRcZScZTcVmcRQcwhcwhcZUcwhcZVcZWcZXcWhcZVcZWcZYcWhcZVcZZdaadabdacdaddaddaddaedaddaddafdaddaddaddagdaedahdaidajdakdagdaddajdaddaddaddaedaddaddaddaddaddafdaddaddaddaddaddagdakdajdaldaddaedagdamdamdamdandamdamdaodamdamdamdambujdamdamdamdapdamdaqdaodardasdatdaudaqdamdandamdamdaodamdamdamdamdamdamdamdavdamdamdaudamdaqdawdaxasUasSasWasVasXasXatbasZatdatcacJacuacuacuadKabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIcdaEdaFdaGcNZahycTZdaHdaIdaJdaKcTSdaLcUNdaMdaNaImcUNcPMdaPcPMdaQcPMcPMdaRdaSdaSdbIdaUdaVdaWdbIdaUdaSdaXdaYdaZdbadbbdbcdbNdbedbfdbgdbNdbedbcdbccRQcwhdbhdbidbjcZVdbkdbldbmcWhdbndbldbocZVcWhdbpcXhdbqdbrdbrdbrdbsdbtdbrdbrdbudbrdbrdbvdbwdbxdbydbzdbAdbBdbCdcedbCdbCdbEdbFdbCdbCdbGdbCdbCdbCdbHdbCdbCdcfdbCdbBdbJdbzdbydbKdbLdbvdbMdcrdbMdbMdbMdbMdbOdbMdbVdbMdbMdbMdbMdbMdbMdbPdbMcWwdbQdbRdbScXEdbTcWwdbMdcrdbMdbMdbUdbMdbVdbMdbMdbMdbVdbMdbMdbMdbMdbWdbMcWwdbWdbXcXFdbYadCacuacuateatOatfatSatPacJacuacuacuatTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkdccdcddcDdczdcgdchdcidaPcPMcUMdcjdckdcldcmdcndcodcpcTQdcpdcmdcodcqdcJdcsdctdcudcvdcwdcxdcydcxddbdcAdcBdcCddndmkdcFdcGdcHdcIddtdcKczfdbcdcMcwhdcNdbidcOcZVdcPdcQdcRcWhdcSdcTdcUcZVcWhcWhcWhcWhcXHcXocXocXocXocXocXpdcVcXHcXpdcWdcXdpPdqIdpQdcXdcWddDdcVcXHcXocXocXocXocXpdcVcXHcXocXocXocXocXpdcVddDddcddddskdtrdstddddddddPddhcZncXzcXzcXzcXzcXAddhcZncXzcXzcXzcXzcXAddhddPddiddjdBAdBCdBBddjddiddPddhcZncXzcXzcXzcXzcXAddhcZncXzcXzcXzcXzcXAddhddPddodBEdBDdBFddsabTaezacuaeVacuacuatVatUacuacuacuacuaeCabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdducXJddvddwcTSddxcPMcUOcVFcVEcPMcPMddyddzcWLddAddBddCdeedcsdcudcudcvdcwddEddEddFddGddHddIdcCddJddKddKddKddLddMddNddNdBGdbccRQcwhdekddQddRcZVddSddTddScWhddUddVddUcZVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqddXddYddZdeadebdeqaaaaaaaaaaaaaaadeddeddeddeddeddeddedaaaaaaaaaaaaaaadeWdefdegdehdeidejdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdeldemdendeodepdfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdetdeuddsatWatYatXauaatZaegacuaeXaubaciaeYabTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahbkQcIcdevdevdewcZmdbDdbddexcZqdeydezcVNcUMcPMdcjdclcVHcSHcPMcWLcWLcVIcVJdeAdeBdeCdeDdcudeEdeFdeGdeHdeIdeJdeKdeLdeMdeNddJddKddKdeOdePdeQdeRddKdeSdbccRQcwhahyahyahycZVddSdeTddScWhddUdeUddUcZVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfhdeXdeYdeZdeadfadfmaaaaaaaaaaaadeddeddeddeddeddeddeddeddedaaaaaaaaaaaadfBdfddegdfedffdfgdfBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfIdfidfjdfkdeodfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdfndfoddsabTabTabTaflaflafmaflaflabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahahycIcdfpdfqdfrcNZahycTZdfscPMcUMcWLcVIdeydftcZqdfucZqdftcZqdfvcWLcPMcPMdfwdfxdfydfzdcudcudfAaIndfCdfDdfEddbdfFdfGdfHddndfXdfJdfKdfYdfMdfYdfNdbcdbccRQcwhahyahyahyahyddSdfOddScZVddUdfPddUdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgwdfRdfSdfTdfUdfVdfWdhgdcWaaaaacaaadeddeddeddeddeddeddeddeddeddeddedaaaaacaaaddcdhudfZdgadgbdgcddcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddidgddemdgedgfdggddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodghdgidgjdgkddsaahaflagBaflaudafBaueafDafEaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahahycIcdevdevdgldcddcDdczdgmcTSdgncWLcPMdgocTTcTSdgpcTScTScTSdgpdgpdgqcPMdgrdgsdaSdgtdcudgudgvdhzdgxdfDdgydgzdgAddIdgBdgCdgCdgCdgCdgCdgCdgCdgCdbcdgDdgEcwhcwhahyahyahydgFdgGdgHaaadgIdgJdgKdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgLdgMdgNdgOdgPdgQdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdgTdeidfgdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdfidemdgUdgVdfldfbaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdgWdgjdgXddsaahaflauPaflafPafQafRaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdgYcXJcPMcWLcPMcPMdgZdhacWLcPMcPMdhacWLcWLdhbdhadhcdhddaSdhedcudcucyNdhEdfCdhhdhidgzdhjdfGdhkdhldhmdhndhodhpdhqdhrdhsczQczQdhtczQcwhahyahyaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdhIdfRdhvdfTdhwdhxdgRdhydfhaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadhMdhAdhBdgadhCdhDdhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadifdhFdemdgedhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdhKdhLddsaahaflagAaflagfaggaggaghafEaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQdiLdhNdhOdhPcVIdhQdhRdhSdhTdhUdhVdhWdhXdhYdhZdiadibdicdiddaSdiedcudcucyNdiYdfCdfDdigdgzdfFdihdgBdiidijdikdildimdindiodipcXecXediqdircwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfmdeXddYddZdgRdfadfmaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadfBdfddgSdehdeidfgdfBaaaaaaaaaaaaaaadisditdiudiudiudivdiwaaaaaaaaaaaaaaadfIdfidemdendhGdfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdixdgXddsaahaflaflaflaflagqaflaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahahyahyahyahyahydjtdizdiAdiBdiCdiBdiDdiEdiCdiBdiFdiEdiCdiCdiDdiGcMNcMNdaSdiHdiIdiJdiKdjudiMdiNdiOdgzdfFdihdgBdiidijdiPdiQdiRdijdhrdiSdiTdiUdiVdiWcwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjwddYdjcdjddjedcWaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaaddcdjfdjgdjhdeidjiddcaaaaaaaaaaaaaaadjjdjkdjkdjkdjkdjkdjjaaaaaaaaaaaaaaaddidjldemdjmdjndjoddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodjpdjqdjrdjsddsaahaahaahaflagyaggagzaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaaaaaaaaaahydkCdjxdbDdbDdkJdjxdkLdbDdkJdjxdkLdbDdkJdkUcOsbkQbkQahydaSdgzdgzdgzdgzdgzdjydgzdgzdgzdjzdjAdjBdjCdjCdjCdjCdjCdjCdjCdjCdjCcxxdhtcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdehdeidfgdeWaaaaaaaaaaaaaaadjjdjDdjEdjkdjEdjDdjjaaaaaaaaaaaaaaadfbdfidemdendhGdfldfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdixdgXddsaahaahaahaflagyagLagzaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAaaadjFaaabkQcIcdjGcNZcMKcIcdjGcNZcMKcIcdjGcNZcMKcIcbkQaahdjHdjHdjIdjJdjKdjLdjMdjNdjOdjPdjQdjRdjSdjCdjTdjUdjVdjWdjXdjYdjZdjCdjCdhtcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgwdfRdfSdkadfUddZdgRdebdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdejdgSdehdeidgSdhMaaaaaaaaaaaadisdkbdkcdkcdkddkcdkcdkbdiwaaaaaaaaaaaadifdhGdemdendhGdepdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiyderdesdixdgXddsddsaahaahaflaflaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaadaadaaaaadaadaadaaaaadaadaadaaaaadaadaadaaaacAaaddkeaadbkQcIcdkfdkgdkhcIcddrdcYdfQcIcdkldkmdkncIcaahaahdjHdkodkpdkqdkrdksdktdkqdkudjPdkvdkwdkxdjCdkydkydkzdjXdjXdkAdkAdEbdjCdhtcwhdkYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkEdkFdkGdkHddZdkIdlEdfSdfRdkKdeddeddeddeddeddeddeddeddeddeddeddeddeddlUdkMdkNdkOdkPdehdeidfgdhMaaaaaadisdkcbwQdlWdHmdHldjkdHldHnbCYbEMdkcdiwaaaaaadifdfidemdendkTdlYdkVdkWdkXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmGdkZdladlbdlcdixdgXdldddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledlfdlgaaadledlfdlgaaadledlfdlgaaadledlfdlgaaaacAaadaadaaaaaacIcdlhdlidlhcIcdkjdkidkjcIcdlkdlldlkcIcaahaahdjHdlmdlndkqdlodlpdlqdlrdlsdltdludlvdlwdlxdlydlzdlAdlzdlzdlBdlzdEcdjCdhtdDadoidlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhIdfRdhvdkadlGdlHdlIaOpdlKdlLaOrdeddeddeddeddeddeddeddeddeddeddeddeddeddlNdlOdlPaOsdlRdlSdlTdokdkNdkMdlVdjjbuAdjkdjkdjkdjkdjkdjkdjkdjkdjkbuAdjjdoEdkWdkVdkXdlZdmadDbdmcdmddmedmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmgdmhdmidmjdDcdixdgXdmlddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddledmmdlgaaddledmmdlgaaddledmmdlgaaddledmmdlgaadacOaaaaadaadaaacIcdlhdmndlhcIcdkjdkkdkjcIcdlkdmpdlkcIcaahaahdjHdlmdmqdkqdlpdlpdmrdmsdmtdmudmvdmwdmxdmydmzdmAdmBdmCdmCdmDdlzdEddjCdhtczQdmFdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfmdeXddYddZdmHaOtdmJdmKaOudeddeddeddeddeddeddeddeddeddeddeddeddeddmMdmNdmOaPedmQdehdmRdmSdmTdgSdmSdkddjkdjkdjkdmUdmUdjkdmUdmUdjkdjkdjkdkddmVdhGdmWdmVdmXdendmYdmZdnadnbdncaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnddnednfdngdnhdixdgXdniddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaadaadcIccIccIccIccIccIccIccIccIccIccIccIccIcaahaahdjHdkodkpdkqdlodlpdktdkqdEedjPdfFdihdnkdjCdnldnmdnndnodnpdnqdnrdnsdjCdntczQdnudppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdnvddYddZdnwdlEdhvdfRdfTdeddeddeddeddeddeddeddeddeddeddeddeddeddokdkMdnxdkOdnydehdnzdokdnxdkMdkOdjjdqwdjkdjkdjkdjkdjkdjkdjkdjkdjkdqxdjjdlYdkWdnAdkXdnBdendnCdlYdnAdkWdkXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmGdkZdnDdlbdnEdixdgXdnFddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaaaaadaadaadaadaaaaaaaadaadaadaaabkQdnGdnGdnGdnGdnGdjHdjHdnHdnIdnJdnKdnLdnMdjHdjHdnNdnOdnPdjCdjCdnQdnodnRdnSdnTdnrdjCdjCdhtczQdnudppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUaaaaaaaaadeqdeXdnVdnWdgRdeXdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdnXdgSdnYdnZdnXdhMaaaaaadoadjkdmUdmUdmUdmUdjkdmUdmUdmUdmUdjkdoaaaaaaadifdocdoddoedhGdocdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydofdesdogdohddsddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaaaaaaaaddqrdojdojdojdojdnGdqLdoldnGdnGdomdomdondoodopdjHdjHdjHdjHdjHdjHdjHdjHdoqdordosdotdoudjCdjCdjCdjCdjCdjCdjCdjCdjCdhtczQdovdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdgwdfRdfSdkadfUddZdgRdhydfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdhAdgSdehdeidowdhMaaaaaadoxdjkdjkdjkdjkdjkbvidjkdjkdjkdjkdjkdoxaaaaaadifdozdemdendhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdixdoAddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaadoDaaaaaaaaadqNdoFdoGdoHdoIdoJdoKdoLdoMdoNdoOdoPdoQdoQdoRdoSdoTdoUdoVdoWdoRdoOdoXdoYdoZdpadpbdpcdpddpedpfdpgdphdpidpjdpkdpldpmdpndhtdpodqTdpqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdprdpsdptdpudpvdpwdpxdeXdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdnXdpydpzdeidnXdhMaaaaaadpAdjkdmUdmUdmUdmUdjkdmUdmUdmUdmUdjkdpAaaaaaadifdocdemdpBdpCdocdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydofdpDdpEdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddpFdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGdpGdpGdpKdpLdpMdpNdpOcBhcAMdpRdpSdpTdpUdpVdpWdpXdpYdpZdqadqbdqcdqddqedoudoudqfdoudqgdoudqhdqidoudoudqjdoudqfdqkdqldqmdqndqodqpdqqcwhdqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdhIdfRdhvdkadqsdcZdqtdlEdfSdfRdfTdeddeddeddeddeddeddeddeddeddeddeddeddeddokdkMdkNdkOdquddfdqvdokdkNdkMdkOdjjdqwdjkdjkdjkdjkdjkdjkdjkdjkdjkdqxdjjdlYdkWdkVdkXdqyddldqzdlYdkVdkWdkXaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAaaaaaadmGdkZdladlbdqBdqCdqDddsaahaahaahdqEdqEdqEdqEdqEdqEdqEaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadaaaaaaaaadqNdoFdqGdqHcBPcBldojdnGdqJdqKdnGdnGdrxdoldqMdnGdrAdqOdqOdqPdqOdqQdqRdqQdqSdrBdqUdqVdrBdqUdqSdqWdqXdsLdnGdqZdqZdnGdnGcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUaaaaaaaaadfmdeXddYddZdmHaPvdrbdrcaQTdeddeddeddeddeddeddeddeddeddeddeddeddedaQXdrfdrgaQYdmQdehdmRdmSdridgSdmSdkddjkdjkdjkdmUdmUdjkdmUdmUdjkdjkdjkdkddmVdhGdrjdmVdmXdendmYdrkdrldrmdrnaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadrodrpdrqdrrdnhdixdgXddsdqEdqEdqEdqEdrsdrtdrudrvdrsdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaddledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaaaaaddtkdojdojdojdojdnGdrydrzdtIaaadtXdrCdrDdrEdrFdqOdrGdrHdrIdqQdrJdrKdrLdrMdrNdrOdrPdrQdrLdrRdrSdrTdnGdrUdrVdrWdtIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjbdrXdlHdrYaQZdsadsbaRNdeddeddeddeddeddeddeddeddeddeddeddeddedaWEdsedsfaWHdshdlSdsidokdnxdkMdlVdjjbuAbFIdlWdjkdjkdjkdjkdjkdlXbFIbuAdjjdoEdkWdnAdkXdsjdmadDddsldsmdsndsoaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadspdsqdsrdssdDedsudsvdswdBLdsydsydsydszdsAdszdsBdszdsydsxdsydsydsydsCdsDdsEdsFdsGdsHdqEdqEaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaadaadaaaaaaaaaaaaaaadnGdsJdsKdtZaaddtXdsMdsNdsOdsPdqOdsQdsRdsSdqQdsTdsUdrLdsVdsWdsXdsYdsZdrLdtadtbdtcdnGdtddtedtfdtZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdtgdlEdhvdfRdkKdeddeddeddeddeddeddeddeddeddeddeddeddeddlUdkMdnxdkOdthdehdeidfgdhMaaaaaadujdkcbuldtidjkdHobuBdHpdjkdwfbumdkcdunaaaaaadifdfidemdendtldlYdnAdkWdkXaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadmGdkZdtmdtndtodtpdtqdtqdBMdtsdttdtudtvdtwdtxdtydtzdtwdtAdtBdtCdtDdtEdtBdtBdtBdtBdtFdtGdqEaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacHHcGCcGDcGEcGEcGFcGGcGGcGGcGGcGHcGIcGIcGJcGKcGLcCtbkQbkQahyahyahybkQbkQaahaahaahcxrcIdcIecxrcxraahaahcBIcFgcGPcFFcBIcGRcHRcCGcCGcwdcGTcCIcGUcGVcGWcGWcGWcGXcGXcGXcGXcGYcCKahyahycwhczRcwhaahaahaahaahaahcxzcGZczecABcHaczVcCPcCQcHbcHSczecGkcxzaahaahaahaahaahaahaahczicAbczicziaahcBacHdcHedmEcHgcHfcHccHicHjcHkcHlcHmcHncHocHmcHpcHmaahcBgcBgcHqcGxcGxdnjcOUdBScFVcMfcrQcrQcMgcMhdhfcHwcGzdBVdDhdDgdDjdDidDkcQGaahaahaahaahaahaahaahaahaahaahcHycHzcKTazzcHycHCcHDcHEazAcKWcIzcHEaahaahaahaahaahaahaahcHIcHJcLgazBcHIcHMcLhcHOazCcHQcJtcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacJwcGCcDXcHTcDXcHUcHVcxgcxgcHWcCtcHXcGKcHYcHZcIacCtbkQcIbcIccIccIccIcbkQaahcJecJecJgbgicJgcJgaahaahaahcBIcBQcIfcGOcBIcIhcIicIjcIkcwdcIlcImcIncCKcGecIocGecEwcGecEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcIpczecIqcAVcIrcIscItcAWcIuczecGkcxzaahaahaahaahaahaahaahczicAbcziaahaahcBacIvcIwcHhcFXcIycKDcrOcrPcIAcDicHmcIBcICcIDcIEcHmaahaahcBgcHqcBgcOTdDlcNKcNTcNLcNNctzcNOcNPcNQdDmcNScNTdDncQGdDodDqdDpdDrcQGaahaahaahaahaahaahcHycHycHycHycHycIIcMpdHhcHyczpcuAcHEcMqcIMcINcHEcHEcHEcHEcHEcHIcHIcHIcHIcIOcMrdHicHIcuLcBvcHOcMtcIScITcHOcHOcHOcHOcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadcvMcvMcvMcvMcvMaadaadaadcuScuScuScuScuScuScuScIUcIVcIWcIXcIYcIZddOcJbcCtcCtahycIccJccJdcJccIcahyahycJebPGbNIbZtbQAcJeaahaahaahcBIcBQcJhcJicJjcJkcJlcJmcJmcwdcJncJocJpcCKcJqcGecEwcEwcEwcEwcJrcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcJsczecMLcJuczVcJvczXczYcNgczeczecxzaahaahaahaahaahaahaahczicAbcziaahaahcBacJxcJycIxcGScJAcJBcJCcJDcJEcJFcHmcJGcJHcJIcJJcHmaahaahcBgcGycBgcBgcBgcrQdFdcsYcOWdHjcrQcHtdDscOYdDtcsYdDucQGdDvcQGdDwcQGcQGaahaahaahaahaahaahcHycJOcJPcJQcHycHycMucHycHycJScvAcHEcMvcJTcHEcHEcJUcJVcJWcHEcJXcJYcJZcHIcHIcMwcHIcHIcvHcMxcHOcHOcKccHOcHOcKdcKecKfcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaadbkQaahaahaahaahaahcuScuScuScuScCtcCtcCtcCtcCtcCtaahahycIccJccJccJccIcahyahycJebRFbRhcaBbWGcJecKjcKjcKjcBIcBIcKkcKlcBIazDcKncKocKpcKqcKrcKscKtcKqcKucGedeccKvcEwcKwcKwcKwcCKahyahycwhczRcwhaahaahaahaahaahcxzcKxczecHScKyczecKzczgcKAcHScKBcKBcxzaahaahaahaahaahaahaahczicAbcziaahcKCcKCcNYcKEcKFcKCcKCcKCcKGcKHcKIcKCcKCcKCcKCcKCcKCcKCcKCaahcBgcHqcBgaahaahcrQcrQcQAcQBcQCcrQcQDcQEdDydDxcsYcsYcQGdDzcQGdDAcQGaahaahaahaahaahaahaahcHycKOcKPcKQcKRcKQcMzcMycKUcDAcwIcKVcMBcMAcKYcKZcKYcLacLbcHEcLccLdcLecLfcLecMCcMDcLicwWcHNcLjcLkcLlcLmcLncLmcLocLpcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccLqcLrcLscIcahyaahcJecdHcceccMdEXcJecLwcLxcLycLzcBIcLAcBIcCGcCGcLBcCGcLCcKqcLDcLEcLFcKqcLGcLGcLGcLGcLGcLGcLGcLGahyahyahycwhczRcwhcziaahaahaahaahcxzcxzcxzcxzcLHcLIcLJcLKcLLcxzcxzcxzcxzaahaahaahaahaahaahcziczicAbczicKCcKCcLMcLNcLOawvcLQcLRcLScLTcLUcLVcLWcLXcLYcLZcMacMbcMccKCcKCcBgcHqcBgahyaahaahcrQcrQcrQcrQcrQcrQcrQcrQcrQdDCdDBcQGcQGcQGcQGcQGaahaahaahaahaahaahaahcHycMidEYcMkcMlcMmcMndBWcHycyccydcHEdBYdBXdCadBZdCcdEZdCedCddCgdFadCidChdCkdCjdClcHIcyscAxdCodCncMEcMFcMGcMHdFbcMJcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQcIccMKcNZcMMcIcbkQcMNcMNcMNcMNcghcMOcKjcMQcMRcMScMTcMUcMVcMWdDDcoucMZcNacMUcNbcNccNdcNecrVcOpcNhcNicNjcTfcLGcNlcLGcLGahyahycwhcNmcNncziczicziczicziczicNocNpcxzcNqcxzcNrcxzcNqcxzcEDcEDcziczicziczicziczicziczicUqcXxcUucKCcNucLPcLPcNvcNwcNwcNxcNycNzcNAcNBcNCcNDcNEcNEcNEcNFcLPcNGcKCcZgdDEcBgahyahyaahaahaahaahaahaahaahaahcWudDFdbMdbMdDGcWuaahaahaahaahaahaahaahaahaahaahcHycHycHycHycHycHycHycHycHyczpcuAcHEcHEcHEcHEcHEcHEcHEcHEcHEcHIcHIcHIcHIcHIcHIcHIcHIcuLcBvcHOcHOcHOcHOcHOcHOcHOcHOcHOaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQbkQcOsahycOMbkQbkQcMNcOacObcOccjScOecOfcOgcOhcOicMTcOjcOkcOlcOlcOmcOncOocPFcOqcNccNdcNecOrcPPcOtcOtcyzdDHcOvcOtcOwcLGahyahycwhcOxcOycOzcOAcOBcOCcOCcOCcOCcOAcOAcOAcODcOEcOFcOAcOCcOCcOGcOCcOCcOCcOCcOCcOCcOCcOCdlDdBIdBHcKCcOKcLPcLPcOLcLPcLPcPYcONcOOcOPcOQcONcPYcLPcLPcLPcORcLPcLPcKCdBJcHqcBgahyahyahyaahaahaahaahaahaahaahcWudDIdbMdbMdDJcWuaahaahaahaahaahaahaahaahaahaahcPdcPecPfcPgcPhaGYcPjcPkcPdcPlcPmcPncuscPpcPpcPqcPpcutcPrcPscPpcPtcPpcPucPpcPpcvkcPncPwbfocPxcPycPzcPAaEycPCcPDcPEcPxaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahycQscPGcPGcPHcPGcPIcPJcPKcMNcPLcPMcPMckycPOcRfcPQcPRcPScMTcPTcPUcOocPVcPWcOocPXcRucPZcNccQacQbcQcdcEdDKdDMdDLdDNcQicQjcQkcLGahyahycwhcQlczQczicziczicziczicziczicziczicEDcEDcEEcNscEDczicziczicziczicziczicziczicziczicQmcEDdBKcKCcQocQocLPcQpcQqcQrcRJcQtcOOcQucQvcQwcRJcQxcQocLPcQycQqcQocKCdCRcHqcBgahyahyahyahyaahaahaahaahaahaahcWucWudDPbsUcWucWuaahaahaahaahaahaahaahaahaahaahcPdcQJcQKcQKcQLcQKcQKcQMcQNcQOcQPcQQcQRcQRcQRcQScQRcQTcQUcQVcQWcQXcQRcQYcQRcQRcQRcQQcQZarAcRbcRccRccRccRdcRccRccRecPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjbLjaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahycSAcRgcRhcRicRjcRkcRlcRmcRncRocRpcRqcRrcmbcRtcSLcRvcRwcRxcMTcRycPUcRzcRAcRBcRCcOlcRDcREcRFcRGcRHcRIcTadDQcRKcRLcRMcRNcROcRPcLGahyahycwhcRQcwhcziahyahyahyahyahyahyahycziczicziczicziczicziaahaahaahaahaahaahaahaahaahcziczicRRdCScKCcRTcRWcRVcLPcRWcRXcRJcRYcOOcOPcOQcRZcRJcRTcRWcLPcRVcRWcSacKCdCTcSccBgahyahyahyahyahyaahaahaahaahaahahydDRdbMdDUdDRahyaahaahaahaahaahcXGcXGcXGcXGaahcPdcSdcSecSfcSgcShcSicSjcSjcSkcSlcSmcSlcSlcSlcSncSlcSlcSlcSocSpcSqcSqcSrcSqcSqcSqcSscStarBcSucSucSvcSwcSxcSycSyarCcPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahbLjbLjaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQcTZcSBcSCcPMcSDcPMcSEcSFcSGcSHcPMcPMcSIcmmcSKcUlcSMcSNcSOcMTcSPcSQcSRcSScSTcSUcSVcSWcSXcSYcSZcNecRIcUscTbcOtcTccOtcTearDcTgcLGahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahczicThcRScKCcTicTjcTkcLPcTlcTjcRJcTmcTncTocOQcTmcRJcTjcTjcTpcLPcTlcTqcKCcSbcTrcBgahyahyahyahyahyahyahyahyahyahyahydDTdbMdDUdDTahyahyahyaahaahcXGcXGasfasecXGaahcPdcPdcTscTtcTucTvcTwcTxcPdcPncPncPncTycTzcTzcTAcTBcTCcTDcTEcTFcTGdCUcTHcTzcTzasgcPncTDashcPxcTJcTKasicTMcTNcTOcPxcPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcTZcSBcTPcTQcTRcTScTTcTUcTVcTWcPMcPMcTXcmncTYcKjcUvcUacUvcMTcUbcUccUdcUecUecUfcPXcPFcUgcUhcUicUjcRIcUkcUycUmcUodcLcUkcUkcUkcLGahyahycwhcUpcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahahyczidCVcRScKCcUrcLPcORcLPcLPcLPcUHcONcOOcOPcOQcONcUHcLPcLPcOLcLPcLPcUtcKCcSbdCWcBgahyahyahyahyahyahyahyahyahyahyahycWudDWdDVcWuahyahyahyahyaahcXGasjaskdaDcXGaahaahcPdcUIcUwcUwcUwcUxcPdcPdaahaahcPncPncUYcUzcUzcUAcPncUBcUCcUDcPncPncPncPncPncPncPncUBcPmcPxcPxcPxcPxcPxcPxcPxcPxaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccUEcUEcUFcUGcVucVgcUJcUKcULcUMcPMcUMcUNcUOcUPcUQcURcUScmocUUcUVcRqcUWcUXcVQcUZcOocOocOocOocOocVacRucVbcUhcVccNecVdcVecVfcWicVhcVicVjcVkcVlcVmahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahahyahyahyahyahyahyczicVncEDcKCcLPcLPcVocNEcNEcNEcNDcNCcVpcVqcVrcNycNxcNwcNwcVscLPcLPcLPcKCcGxcVtcBgahyahyahyahyahyahyahyahyahyahyahydDRdbMdbSdDRahyahyahyahyahycXGaslaskasmcXGahyahyahyahyahyahyahyahyaahaahaahaahaahahyahyahyahyahycWvcVvcVwcVxcPnaahaahaahaahaahabTasoasnabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccVycVzcVAcNZahycTZcVBcVCcVDcVEcVFcUMcVGcVHcVIcVJcVKcVKcnlcVMcVNcPMcVOcVPcWBcVRcVScVScVTcOocVUcVVcMTcVWcVXcVYcNecVZcWacWbcWicWccWdcWecWfcWgcVmcwhcwhcwhcRQcwhcWhcWhcWOcWjcWkcWhcWhcWOcWjcWkcWhcWhahyahyahyahyahyahyahyahyahyahyahyahycziczicWlczicKCcWmcWncWocWpcvtcLPcLRcONcOOcOOcOQcONcLRcLPcvtcWpcWqcWrcWscKCcBgcWtcBgcBgahyahyahyahyahyahyahyahyahyahydDTdbMdbSdDTahyahyahyahyahycXGcXGaspcXGcXGahyahyahyahyahyahyahyaahaahaahaahaahahyahyahyahyahyahycXncWwcWxcWycWuaahabTabTabTabTabTastasqabTabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccUEcUEcWzcWAcVucXucWCcWDcWEcWFcWGcWHcWIcWJcWJcWJcWFcWFcnmcWKcWLcPMcWMcWNcMTcMTcXycWPcwAcvvcXycWPcWScWTcWUcVYcNecWVcWWcWXcWicWYcWZcXacXbcXccVmdDXcXecXecXfczQcWhcXgcXhcXicXjcXkcXlcXhcXmcXhcXhcWhcWhcXHcXocXocXocXocXocXpcXqcXHcXpcXqcXqcXrcXscXtcKCcKCcNYcKEcKFcKCcKCcKCcYfcXvcXvcKIcYfcKCcKCcKCcNYcKEcKFcKCcKCcXtcXwdCXcXqcXqcZncXzcXzcXzcXAcWucWucWudDYcWucWwdDZcWucZncXzcXzcXAcWucWucXBasvdHkcWucWucWucWucZncXzcXzcXAcWucWucWucWucWucWucWucZncXzcXzcXAcWucXDcXEcXFcWuabTabTaswacwacwasxacuaeVaszasyacwacwabTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcZocXIcXJcVDcXKcXLcUMcUNcXMcXMcXNcUOcVEcnncXPcWFcXQcXRcXScXTcXUcXVcXWcXXcXYcXZcYacYbcYacYccYdcNecYecWacNcdaTcYgcYhcYicYjcYkcVmcRQczQcYlczQczQcYmcYncYocYpcYqcYncYrcYpcYscYtcYucYvcYwcYxcYycYxcYxcYzcYxcYAcYBcYxcYxcYCcYDcYEcYFcYGcYHcYCcYxcYIcYxcYycYJcYKcYxcYxcYxcYLcYxcYMcYNcYycYxcYxcYxcYCcYxcYGcYOcYPcYPcYQcYRcYScYRcYTcYRcYUcYVdCYcYRcYScYRbtlcYRcYRcYRcYWcYRcYXcYScYYasAcYZdCYcYXcYRcZacYRcYRcZbcYRcYRcZccYUdCYcYRcYRcZdcYRcYRcYScYRcYXcZecZfcXFasBasDasCacuacuacuasEasFaeVacuacuacuacuawwabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkcZlcZmdbDdbdcZpcZqcVMcZrcPMcUMcUNcZscZtcZucVGcVHcojcZqcZwcZxcZycZqcZzcZAcZBcZCcZDcZEcZFcZGcZHcZGcZIcZJcZKcZLdmbcZNcZOcZPcZQcZRcZScZTcVmcRQcwhcwhcZUcwhcZVcZWcZXcWhcZVcZWcZYcWhcZVcZZdaadabdacdaddaddaddaedaddaddafdaddaddaddagdaedahdaidajdakdagdaddajdaddaddaddaedaddaddaddaddaddafdaddaddaddaddaddagdakdajdaldaddaedagdamdamdamdandamdamdaodamdamdamdambujdamdamdamdapdamdaqdaodardasdatdaudaqdamdandamdamdaodamdamdamdamdamdamdamdavdamdamdaudamdaqdawdaxasUasSasWasVasXasXatbasZatdatcacJacuacuacuadKabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIcdaEdaFdaGcNZahycTZdaHdaIdaJdaKcTSdaLcUNdaMdaNaImcUNcPMcokcPMdaQcPMddBcoldaSdaSdbIdaUdaVdaWdbIdaUdaSdaXdaYdaZdbadbbdbcdbNdbedbfdbgdbNdbedbcdbccRQcwhdbhdbidbjcZVdbkdbldbmcWhdbndbldbocZVcWhdbpcXhdbqdbrdbrdbrdbsdbtdbrdbrdbudbrdbrdbvdbwdbxdbydbzdbAdbBdbCdcedbCdbCdbEdbFdbCdbCdbGdbCdbCdbCdbHdbCdbCdcfdbCdbBdbJdbzdbydbKdbLdbvdbMdcrdbMdbMdbMdbMdbOdbMdbVdbMdbMdbMdbMdbMdbMdbPdbMcWwdbQdbRdbScXEdbTcWwdbMdcrdbMdbMdbUdbMdbVdbMdbMdbMdbVdbMdbMdbMdbMdbWdbMcWwdbWdbXcXFdbYadCacuacuateatOatfatSatPacJacuacuacuatTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkdccdcddcDdczdcgdchdcidaPcPMcUMdcjdckdcldcmdcndcocpfcTQdcpdcmcpgcphdcJdcsdctdcudcvdcwdcxdcydcxddbdcAdcBdcCddndmkdcFdcGdcHdcIddtdcKczfdbcdcMcwhdcNdbidcOcZVdcPdcQdcRcWhdcSdcTdcUcZVcWhcWhcWhcWhcXHcXocXocXocXocXocXpdcVcXHcXpdcWdcXdpPdqIdpQdcXdcWddDdcVcXHcXocXocXocXocXpdcVcXHcXocXocXocXocXpdcVddDddcddddskdtrdstddddddddPddhcZncXzcXzcXzcXzcXAddhcZncXzcXzcXzcXzcXAddhddPddiddjdBAdBCdBBddjddiddPddhcZncXzcXzcXzcXzcXAddhcZncXzcXzcXzcXzcXAddhddPddodBEdBDdBFddsabTaezacuaeVacuacuatVatUacuacuacuacuaeCabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdducXJddvddwcTSddxcPMcUOcVFcVEcPMcPMcpkddzcWLddAdfwcpideedcsdcudcudcvdcwddEddEddFddGddHddIdcCddJddKddKddKddLddMddNddNdBGdbccRQcwhdekddQddRcZVddSddTddScWhddUddVddUcZVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqddXddYddZdeadebdeqaaaaaaaaaaaaaaadeddeddeddeddeddeddedaaaaaaaaaaaaaaadeWdefdegdehdeidejdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdeldemdendeodepdfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdetdeuddsatWatYatXauaatZaegacuaeXaubaciaeYabTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahbkQcIcdevdevdewcZmdbDdbddexcZqdeydezcVNcUMcPMdcjdclcVHcSHcPMcpKcWLcVIcVJcqacqEdeCdeDdcudeEdeFdeGcvzcuRdeJdeKdeLdeMdeNddJddKddKdeOdePdeQdeRddKdeSdbccRQcwhahyahyahycZVddSdeTddScWhddUdeUddUcZVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfhdeXdeYdeZdeadfadfmaaaaaaaaaaaadeddeddeddeddeddeddeddeddedaaaaaaaaaaaadfBdfddegdfedffdfgdfBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfIdfidfjdfkdeodfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdfndfoddsabTabTabTaflaflafmaflaflabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahahycIcdfpdfqdfrcNZahycTZdfscPMcUMcWLcVIdeydftcZqdfucZqdftcZqcrbcWLcPMcPMdhcdhddfydfzdcudcudfAaIndcucAvdfEddbdfFdfGdfHddndfXdfJdfKdfYdfMdfYdfNdbcdbccRQcwhahyahyahyahyddSdfOddScZVddUdfPddUdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgwdfRdfSdfTdfUdfVdfWdhgdcWaaaaacaaadeddeddeddeddeddeddeddeddeddeddedaaaaacaaaddcdhudfZdgadgbdgcddcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddidgddemdgedgfdggddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodghdgidgjdgkddsaahaflagBaflaudafBaueafDafEaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahahycIcdevdevdgldcddcDdczdgmcTSdgncWLcPMdgocTTcTSdgpcTScTScTScrcdgpdgqcPMdiccredaSdgtdcudgudgvdhzcAzcAvdgydgzdgAddIdgBdgCdgCdgCdgCdgCdgCdgCdgCdbcdgDdgEcwhcwhahyahyahydgFdgGdgHaaadgIdgJdgKdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgLdgMdgNdgOdgPdgQdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdgTdeidfgdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdfidemdgUdgVdfldfbaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdgWdgjdgXddsaahaflauPaflafPafQafRaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdgYcXJcPMcWLcPMcPMdgZdhacWLcPMcPMdhactkcthctsctpcuwcuvdaSdhedcudcucyNdhEdcucBZdhidgzdhjdfGdhkdhldhmdhndhodhpdhqdhrdhsczQczQdhtczQcwhahyahyaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdhIdfRdhvdfTdhwdhxdgRdhydfhaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadhMdhAdhBdgadhCdhDdhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadifdhFdemdgedhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdhKdhLddsaahaflagAaflagfaggaggaghafEaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQdiLdhNdhOdhPcVIdhQdhRdhSdhTdhUdhVdhWdhXdhYdhZdiadibcPMcuFdaSdiedcudcucyNdiYdcucAvdigdgzdfFdihdgBdiidijdikdildimdindiodipcXecXediqdircwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfmdeXddYddZdgRdfadfmaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadfBdfddgSdehdeidfgdfBaaaaaaaaaaaaaaadisditdiudiudiudivdiwaaaaaaaaaaaaaaadfIdfidemdendhGdfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdixdgXddsaahaflaflaflaflagqaflaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahahyahyahyahyahydjtdizdiAdiBdiCdiBdiDdiEdiCdiBdiFdiEdiCdiCdiDdiGcuKcuHdaSdiHdiIdiJdiKdjucCgcCadiOdgzdfFdihdgBdiidijdiPdiQdiRdijdhrdiSdiTdiUdiVdiWcwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjwddYdjcdjddjedcWaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaaddcdjfdjgdjhdeidjiddcaaaaaaaaaaaaaaadjjdjkdjkdjkdjkdjkdjjaaaaaaaaaaaaaaaddidjldemdjmdjndjoddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodjpdjqdjrdjsddsaahaahaahaflagyaggagzaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaaaaaaaaaahydkCdjxdbDdbDdkJdjxdkLdbDdkJdjxdkLdbDdkJdkUcOsbkQcuKcChdaSdgzdgzdgzdgzdgzdgzdjydgzdgzdjzdjAdjBdjCdjCdjCdjCdjCdjCdjCdjCdjCcxxdhtcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdehdeidfgdeWaaaaaaaaaaaaaaadjjdjDdjEdjkdjEdjDdjjaaaaaaaaaaaaaaadfbdfidemdendhGdfldfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdixdgXddsaahaahaahaflagyagLagzaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAaaadjFaaabkQcIcdjGcNZcMKcIcdjGcNZcMKcIcdjGcNZcMKcIccuKcCicCjdjHdjHdjIdjJcCpcDxcCqdjOdjPdjQdjRdjSdjCdjTdjUdjVdjWdjXdjYdjZdjCdjCdhtcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgwdfRdfSdkadfUddZdgRdebdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdejdgSdehdeidgSdhMaaaaaaaaaaaadisdkbdkcdkcdkddkcdkcdkbdiwaaaaaaaaaaaadifdhGdemdendhGdepdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiyderdesdixdgXddsddsaahaahaflaflaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaadaadaaaaadaadaadaaaaadaadaadaaaaadaadaadaaaacAaaddkeaadbkQcIcdkfdkgdkhcIcddrdcYdfQcIcdkldkmdkncIccuKcvwcDNdjHdkodkpdkrdksdlpdktdkudjPdkvdkwdkxdjCdkydkydkzdjXdjXdkAdkAdEbdjCdhtcwhdkYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkEdkFdkGdkHddZdkIdlEdfSdfRdkKdeddeddeddeddeddeddeddeddeddeddeddeddeddlUdkMdkNdkOdkPdehdeidfgdhMaaaaaadisdkcbwQdlWdHmdHldjkdHldHnbCYbEMdkcdiwaaaaaadifdfidemdendkTdlYdkVdkWdkXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmGdkZdladlbdlcdixdgXdldddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledlfdlgaaadledlfdlgaaadledlfdlgaaadledlfdlgaaaacAaadaadaaaaaacIcdlhdlidlhcIcdkjdkidkjcIcdlkdlldlkcIccuKcGMcGNdjHdlmdlndlodlpdlpdlqcHBdltdludlvdlwdlxdlydlzdlAdlzdlzdlBdlzdEcdjCdhtdDadoidlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhIdfRdhvdkadlGdlHdlIaOpdlKdlLaOrdeddeddeddeddeddeddeddeddeddeddeddeddeddlNdlOdlPaOsdlRdlSdlTdokdkNdkMdlVdjjbuAdjkdjkdjkdjkdjkdjkdjkdjkdjkbuAdjjdoEdkWdkVdkXdlZdmadDbdmcdmddmedmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmgdmhdmidmjdDcdixdgXdmlddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddledmmdlgaaddledmmdlgaaddledmmdlgaaddledmmdlgaadacOaaaaadaadaaacIcdlhdmndlhcIcdkjdkkdkjcIcdlkdmpdlkcIccuKcvwcHLdjHdlmdmqdlpdlpdlpdmrdmsdmudmvdmwdmxdmydmzdmAdmBdmCdmCdmDdlzdEddjCdhtczQdmFdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfmdeXddYddZdmHaOtdmJdmKaOudeddeddeddeddeddeddeddeddeddeddeddeddeddmMdmNdmOaPedmQdehdmRdmSdmTdgSdmSdkddjkdjkdjkdmUdmUdjkdmUdmUdjkdjkdjkdkddmVdhGdmWdmVdmXdendmYdmZdnadnbdncaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnddnednfdngdnhdixdgXdniddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaadaadcIccIccIccIccIccIccIccIccIccIccIccIccIccuKcChcHLdjHdkodkpdlodlpdlpdktdEedjPdfFdihdnkdjCdnldnmdnndnodnpdnqdnrdnsdjCdntczQdnudppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdnvddYddZdnwdlEdhvdfRdfTdeddeddeddeddeddeddeddeddeddeddeddeddeddokdkMdnxdkOdnydehdnzdokdnxdkMdkOdjjdqwdjkdjkdjkdjkdjkdjkdjkdjkdjkdqxdjjdlYdkWdnAdkXdnBdendnCdlYdnAdkWdkXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmGdkZdnDdlbdnEdixdgXdnFddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaaaaadaadaadaadaaaaaaaadaadaadaaabkQdnGdnGdnGcuKcvCcuKdjHdjHdnHdnIdnJcJfcHPdjHdjHdnNdnOdnPdjCdjCdnQdnodnRdnSdnTdnrdjCdjCdhtczQdnudppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUaaaaaaaaadeqdeXdnVdnWdgRdeXdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdnXdgSdnYdnZdnXdhMaaaaaadoadjkdmUdmUdmUdmUdjkdmUdmUdmUdmUdjkdoaaaaaaadifdocdoddoedhGdocdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydofdesdogdohddsddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaaaaaaaaddqrdojdojdojdojdnGdqLdoldnGdnGdomdomdoncvEcvKdjHdjHdjHdjHdjHdjHdjHdjHdoqdordosdotdoudjCdjCdjCdjCdjCdjCdjCdjCdjCdhtczQdovdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdgwdfRdfSdkadfUddZdgRdhydfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdhAdgSdehdeidowdhMaaaaaadoxdjkdjkdjkdjkdjkbvidjkdjkdjkdjkdjkdoxaaaaaadifdozdemdendhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdixdoAddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaadoDaaaaaaaaadqNdoFdoGdoHdoIdoJdoKdoLdoMdoNdoOdoPdoQdoQdoRcvQdoTdoUdoVdoWdoRdoOdoXdoYdoZdpadpbdpcdpddpedpfdpgdphdpidpjdpkdpldpmdpndhtdpodqTdpqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdprdpsdptdpudpvdpwdpxdeXdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdnXdpydpzdeidnXdhMaaaaaadpAdjkdmUdmUdmUdmUdjkdmUdmUdmUdmUdjkdpAaaaaaadifdocdemdpBdpCdocdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydofdpDdpEdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddpFdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGdpGdpGdpKdpLdpMdpNdpOcBhcAMdpRdpSdpTdpUdpVdpWdpXdpYdpZcvRcxKdqZcxXdosdoudoudqfdoudqgdoudqhdqidoudoudqjdoudqfdqkdqldqmdqndqodqpdqqcwhdqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdhIdfRdhvdkadqsdcZdqtdlEdfSdfRdfTdeddeddeddeddeddeddeddeddeddeddeddeddeddokdkMdkNdkOdquddfdqvdokdkNdkMdkOdjjdqwdjkdjkdjkdjkdjkdjkdjkdjkdjkdqxdjjdlYdkWdkVdkXdqyddldqzdlYdkVdkWdkXaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAaaaaaadmGdkZdladlbdqBdqCdqDddsaahaahaahdqEdqEdqEdqEdqEdqEdqEaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadaaaaaaaaadqNdoFdqGdqHcBPcBldojdnGdqJdqKdnGdnGdrxdoldqMdnGdrAdqOdqOczqdqOdqQdqRdqQdqSdrBdqUdqVdrBdqUdqSdqWdqXdsLdnGdqZdqZdnGdnGcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUaaaaaaaaadfmdeXddYddZdmHaPvdrbdrcaQTdeddeddeddeddeddeddeddeddeddeddeddeddedaQXdrfdrgaQYdmQdehdmRdmSdridgSdmSdkddjkdjkdjkdmUdmUdjkdmUdmUdjkdjkdjkdkddmVdhGdrjdmVdmXdendmYdrkdrldrmdrnaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadrodrpdrqdrrdnhdixdgXddsdqEdqEdqEdqEdrsdrtdrudrvdrsdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaddledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaaaaaddtkdojdojdojdojdnGdrydrzdtIaaadtXdrCdrDdrEdrFdqOdrGcAldrIdqQdrJdrKdrLdrMdrNdrOdrPdrQdrLdrRdrSdrTdnGdrUdrVdrWdtIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjbdrXdlHdrYaQZdsadsbaRNdeddeddeddeddeddeddeddeddeddeddeddeddedaWEdsedsfaWHdshdlSdsidokdnxdkMdlVdjjbuAbFIdlWdjkdjkdjkdjkdjkdlXbFIbuAdjjdoEdkWdnAdkXdsjdmadDddsldsmdsndsoaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadspdsqdsrdssdDedsudsvdswdBLdsydsydsydszdsAdszdsBdszdsydsxdsydsydsydsCdsDdsEdsFdsGdsHdqEdqEaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaadaadaaaaaaaaaaaaaaadnGdsJdsKdtZaaddtXdsMdsNdsOdsPdqOdsQcApdsSdqQdsTdsUdrLdsVdsWdsXdsYdsZdrLdtadtbdtcdnGdtddtedtfdtZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdtgdlEdhvdfRdkKdeddeddeddeddeddeddeddeddeddeddeddeddeddlUdkMdnxdkOdthdehdeidfgdhMaaaaaadujdkcbuldtidjkdHobuBdHpdjkdwfbumdkcdunaaaaaadifdfidemdendtldlYdnAdkWdkXaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadmGdkZdtmdtndtodtpdtqdtqdBMdtsdttdtudtvdtwdtxdtydtzdtwdtAdtBdtCdtDdtEdtBdtBdtBdtBdtFdtGdqEaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaacAaaaaaaaadaadaaaaaaaaaaaaaaaaaadnGdtHdtHdnGahydxKdoldtJdqLdoldqOdtKdtLdtMdtNdtOdtPdtQdtRdtSdtTdtUdtVdtWdxNdtYdxOduadubducdnGdnGaaddudduedueduedueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgwdfRdfSdkadufddZdgRdugdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMduhdgSdehdeiduidhMaaaaaaaaaaaadujdukduldumdumdumduldukdunaaaaaaaaaaaadifduodemdendhGdupdifaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaadiyduqdixdurddsdqEdqEdusdutduudqEdusdutduvdqEdusdqEdqEdqEdqEdqEdqEdqEdtBdtFdtBdqEaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddledrwdlgaaddledrwdlgaaddledrwdlgaaddledrwdlgaadacAaaaaadaadaaaaaaaaaaaaaaaaaaaaaduwduxduyduwbkQduzduAduBduAduzdqOduCduDduEdqQduFduGdrLduHduIduJduIduKdrLduLduMduNduaduOduPduQduRaaaaadaadaaaaaadueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduSduTduUduVduWduXdjddfadfmaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadfBdfddjgduYdeidfgdfBaaaaaaaaaaaaaaaaaadujdukdukdukdunaaaaaaaaaaaaaaaaaadfIdfidemduZdjndfldfIaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaadfLdvadvbdvcddsaahaahdqEdvddvedvfdqEdvgdvhdvidqEaahaahaahaahaahaahdvjdvjdvkdvjdvjaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaadledvldlgaaadledvldlgaaadledvldlgaaadledvldlgaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQdvmdvndvodvpdvmdvqdvrdvsdvtdqQdvudvvdrLdvwdvxdvydvzdvAdrLdvBdvCdvDduadvEdvFduQdvGaaaaadaadaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhIdfRdhvdkadvHdvIdgRdvJdcWaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaaddcdvKdgSdvLdeidjiddcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddidjldemdvMdhGdvNddiaaaaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaaaaaddodvOdvPdvQddsaahaahdqEdvRdvSdvTdqEdvUdvVdvWdqEaahaahaahaahaahaahdvjdvXdvYdvZdvjbvVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/polaris-2.dmm b/maps/polaris-2.dmm index a9f68d2953e..a1cd600a3b8 100644 --- a/maps/polaris-2.dmm +++ b/maps/polaris-2.dmm @@ -619,7 +619,7 @@ "alU" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) "alV" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area/space) "alW" = (/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/trade/centcom) -"alX" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) +"alX" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) "alY" = (/obj/machinery/light{dir = 4},/obj/structure/sign/kiddieplaque{desc = "A plaque commemorating the construction of the cargo ship Beruang."; name = "Beruang"; pixel_x = 32},/mob/living/simple_animal/corgi/tamaskan/spice,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/shuttle/trade/centcom) "alZ" = (/obj/machinery/door/airlock/silver{name = "Toilet"},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) "ama" = (/obj/machinery/door/airlock/silver{name = "Restroom"},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) @@ -1096,7 +1096,7 @@ "avd" = (/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "ave" = (/obj/machinery/computer/security/nuclear,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "avf" = (/obj/machinery/computer/shuttle_control/multi/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"avg" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"avg" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "avh" = (/obj/structure/table/standard,/obj/machinery/button/remote/blast_door{id = "syndieshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "avi" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "avj" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) @@ -1135,7 +1135,7 @@ "avQ" = (/obj/structure/closet/crate/medical,/obj/item/weapon/circular_saw,/obj/item/weapon/surgicaldrill,/obj/item/weapon/bonegel{pixel_x = 4; pixel_y = 3},/obj/item/weapon/bonesetter,/obj/item/weapon/scalpel,/obj/item/weapon/retractor{pixel_x = 0; pixel_y = 6},/obj/item/weapon/hemostat{pixel_y = 4},/obj/item/weapon/cautery{pixel_y = 4},/obj/item/weapon/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 = "dark"},/area/centcom/specops) "avR" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion"; dir = 8},/turf/space,/area/shuttle/specops/centcom) "avS" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 8},/obj/structure/window/reinforced{dir = 4; health = 1e+006},/turf/simulated/floor/airless,/area/shuttle/specops/centcom) -"avT" = (/obj/machinery/computer/security/telescreen{desc = ""; name = "Spec. Ops. Monitor"; network = list("ERT"); pixel_y = 30},/obj/machinery/computer/shuttle_control/specops,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) +"avT" = (/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{icon_state = "floor4"},/area/shuttle/specops/centcom) "avU" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "avV" = (/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"},/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) "avW" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/shuttle/specops/centcom) @@ -1145,7 +1145,7 @@ "awa" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/red/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) "awb" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 2; pixel_y = 3},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "awc" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"awd" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"awd" = (/obj/structure/frame/computer,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "awe" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "awf" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "awg" = (/obj/structure/closet/secure_closet/freezer/kitchen{req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) diff --git a/maps/polaris-3.dmm b/maps/polaris-3.dmm index 7b303c6b863..c0c85cada7c 100644 --- a/maps/polaris-3.dmm +++ b/maps/polaris-3.dmm @@ -20,7 +20,7 @@ "at" = (/obj/item/weapon/scalpel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "au" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 8},/area/derelict/ship) "av" = (/turf/simulated/shuttle/plating,/area/derelict/ship) -"aw" = (/obj/structure/frame{anchored = 1; frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) +"aw" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "ax" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship) "ay" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship) "az" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship) @@ -80,8 +80,8 @@ "bB" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bC" = (/obj/item/weapon/material/shard,/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bD" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bE" = (/obj/structure/cable,/obj/structure/frame{anchored = 1; frame_type = "computer"; icon_state = "computer_0"},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bF" = (/obj/structure/cable,/obj/structure/frame{anchored = 1; frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) +"bE" = (/obj/structure/cable,/obj/structure/frame/computer,/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) +"bF" = (/obj/structure/cable,/obj/structure/frame/computer,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bG" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bH" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bI" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) @@ -197,7 +197,7 @@ "dO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/tcomsat) "dP" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar South"},/turf/simulated/floor/airless,/area/tcomsat) "dQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/tcomsat) -"dR" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless,/area/AIsattele) +"dR" = (/obj/structure/frame/computer,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless,/area/AIsattele) "dS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/tcomsat) "dT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/tcomsat) "dU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/light,/turf/space,/area/tcomsat) diff --git a/maps/polaris-4.dmm b/maps/polaris-4.dmm index 1eca616230a..31b6b8106d6 100644 --- a/maps/polaris-4.dmm +++ b/maps/polaris-4.dmm @@ -8,296 +8,308 @@ "ah" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) "ai" = (/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor/airless,/area/mine/explored) "aj" = (/obj/structure/girder,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) -"ak" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/floor/airless,/area/mine/explored) +"ak" = (/obj/structure/frame/computer,/turf/simulated/floor/airless,/area/mine/explored) "al" = (/obj/machinery/teleport/station,/turf/simulated/floor/airless,/area/mine/explored) "am" = (/obj/machinery/teleport/hub,/turf/simulated/floor/airless,/area/mine/explored) "an" = (/turf/simulated/floor/tiled/white/airless,/area/mine/explored) "ao" = (/obj/structure/door_assembly/door_assembly_med,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) "ap" = (/obj/machinery/optable,/turf/simulated/floor/tiled/white/airless,/area/mine/explored) "aq" = (/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"ar" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"as" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"at" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"au" = (/obj/machinery/light,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"av" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eoutpost_main_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = -25; req_access = list(10)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"aw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"ax" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eoutpost_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(10)},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"ay" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"az" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_outer"; locked = 1; name = "Engineering Outpost"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"aA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"aB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"aC" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/storage) -"aD" = (/obj/machinery/cell_charger,/obj/structure/table/steel,/obj/structure/cable,/obj/item/frame/apc,/obj/item/weapon/module/power_control,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"aE" = (/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/structure/table/steel,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"aF" = (/obj/machinery/autolathe,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"aG" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/hallway) -"aH" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "eoutpost_main_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eoutpost_main_sensor"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"aI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"aJ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "eoutpost_main_pump"},/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"aK" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"aL" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/atmospherics) -"aM" = (/obj/machinery/telecomms/relay/preset/mining,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/telecomms) -"aN" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) -"aO" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eoutpost_main_airlock"; pixel_x = -25; pixel_y = 0; req_access = list(10); tag_airpump = "eoutpost_main_pump"; tag_chamber_sensor = "eoutpost_main_sensor"; tag_exterior_door = "eoutpost_main_outer"; tag_interior_door = "eoutpost_main_inner"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"aP" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"aQ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Airlock"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"aR" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"aS" = (/obj/machinery/pipedispenser,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"aT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/storage) +"ar" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/unexplored) +"as" = (/obj/item/weapon/ore,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/unexplored) +"at" = (/obj/structure/girder,/turf/simulated/floor/airless,/area/wreck/main) +"au" = (/turf/simulated/wall/skipjack,/area/wreck/main) +"av" = (/turf/simulated/floor/airless,/area/wreck/main) +"aw" = (/obj/effect/floor_decal/asteroid,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/unexplored) +"ax" = (/obj/item/stack/material/steel,/turf/simulated/floor/airless,/area/wreck/main) +"ay" = (/obj/item/stack/rods,/turf/simulated/floor/airless,/area/wreck/main) +"az" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/stack/rods,/turf/simulated/floor/airless,/area/wreck/main) +"aA" = (/obj/structure/frame/computer,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"aB" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/scalpel/laser3,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"aC" = (/obj/structure/table/steel_reinforced,/turf/simulated/floor/airless,/area/wreck/main) +"aD" = (/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"aE" = (/obj/effect/decal/mecha_wreckage/phazon,/turf/simulated/floor/airless,/area/wreck/main) +"aF" = (/obj/item/weapon/ore,/turf/simulated/floor/airless,/area/wreck/main) +"aG" = (/obj/item/weapon/circular_saw,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"aH" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/airless,/area/wreck/main) +"aI" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"aJ" = (/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"aK" = (/turf/simulated/floor/tiled/airless,/area/wreck/main) +"aL" = (/obj/effect/floor_decal/asteroid,/obj/effect/decal/cleanable/molten_item,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/unexplored) +"aM" = (/obj/effect/decal/mecha_wreckage/gygax/dark,/turf/simulated/floor/airless,/area/wreck/main) +"aN" = (/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/airless,/area/wreck/main) +"aO" = (/obj/structure/table/rack,/turf/simulated/floor/airless,/area/wreck/main) +"aP" = (/obj/structure/table/rack,/obj/item/stack/cable_coil/yellow,/turf/simulated/floor/airless,/area/wreck/main) +"aQ" = (/obj/effect/decal/cleanable/blood/gibs/robot/down,/turf/simulated/floor/airless,/area/wreck/main) +"aR" = (/obj/machinery/optable,/obj/effect/decal/remains/xeno,/obj/effect/decal/cleanable/blood/xeno,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"aS" = (/obj/item/weapon/material/shard/shrapnel,/turf/simulated/floor/airless,/area/wreck/main) +"aT" = (/obj/structure/table/rack,/turf/simulated/floor/tiled/airless,/area/wreck/main) "aU" = (/obj/machinery/door/airlock/glass_medical{name = "Medbay"; req_one_access = list(65,5)},/turf/simulated/floor/tiled/white/airless,/area/mine/explored) -"aV" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) -"aW" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/telecomms) -"aX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost TeleCommunications"; dir = 1},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) -"aY" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_inner"; locked = 1; name = "Engineering Outpost"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"aZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"ba" = (/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bb" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bc" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"aV" = (/obj/effect/decal/cleanable/blood/xeno,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"aW" = (/obj/item/weapon/ore,/obj/item/stack/rods,/turf/simulated/floor/airless,/area/wreck/main) +"aX" = (/obj/effect/overlay/wallrot,/turf/simulated/wall/skipjack,/area/wreck/main) +"aY" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"aZ" = (/obj/structure/window/phoronreinforced,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"ba" = (/obj/item/device/flashlight/flare,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bb" = (/obj/item/stack/material/wood,/obj/item/stack/material/wood,/obj/structure/ore_box,/obj/item/weapon/ore/iron,/obj/item/weapon/ore/iron,/obj/item/weapon/ore/iron,/turf/simulated/floor/airless,/area/wreck/main) +"bc" = (/obj/item/clothing/head/helmet/space/deathsquad,/obj/structure/table/rack,/obj/effect/decal/cleanable/molten_item,/turf/simulated/floor/tiled/airless,/area/wreck/main) "bd" = (/obj/structure/grille,/turf/simulated/floor/airless{icon_state = "white"},/area/mine/explored) -"be" = (/obj/machinery/floodlight,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_engineering{name = "Telecommunications"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/outpost/engineering/telecomms) -"bg" = (/obj/structure/sign/vacuum{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bh" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eoutpost_main_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(10)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bi" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bj" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bk" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bl" = (/obj/machinery/recharge_station,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bm" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bn" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bo" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bp" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bq" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (NORTHEAST)"; icon_state = "intact-scrubbers"; dir = 5},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"br" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bs" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) -"bt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bu" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bv" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bw" = (/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bx" = (/obj/structure/cable{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,/area/outpost/engineering/storage) -"by" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bz" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bA" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bB" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bC" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bD" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bE" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bF" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bG" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bH" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bJ" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/stack/cable_coil/yellow,/obj/item/stack/cable_coil,/obj/item/weapon/module/power_control,/obj/item/weapon/module/power_control,/obj/item/clothing/gloves/yellow,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bK" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/stack/cable_coil/yellow,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bL" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bM" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"bN" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bO" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bP" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bQ" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bS" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bU" = (/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/wood{amount = 30},/obj/item/stack/material/plastic{amount = 10},/obj/structure/table/steel,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bV" = (/obj/structure/table/rack,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/shoes/magboots,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/item/weapon/storage/briefcase/inflatable,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"bW" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"bX" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) -"bY" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"bZ" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"ca" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cb" = (/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/structure/table/steel,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"cc" = (/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/structure/table/steel,/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Storage"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"cd" = (/obj/machinery/floodlight,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"ce" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_o2_sensor"},/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) -"cf" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{dir = 4; frequency = 1441; id_tag = "outpost_o2_out"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) -"cg" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"ch" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"ci" = (/obj/machinery/atmospherics/omni/mixer{tag_east = 0; tag_east_con = null; tag_north = 2; tag_south = 1; tag_south_con = 0.79; tag_west = 1; tag_west_con = 0.21},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"cj" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"ck" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cl" = (/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cm" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cn" = (/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) -"co" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/power/emitter,/turf/simulated/floor/tiled/dark,/area/outpost/engineering/hallway) -"cp" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/solars) -"cq" = (/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) -"cr" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "outpost_o2_in"; pixel_y = 1; use_power = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) -"cs" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"ct" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 10},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"cu" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"cv" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"cw" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"cx" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/wall/r_wall,/area/outpost/engineering/atmospherics) -"cy" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -20},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cz" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cA" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cB" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cC" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cD" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"cE" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"cF" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Power Supply"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"cG" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 1.5e+007; cur_coils = 3; input_attempt = 1; input_level = 750000; input_level_max = 750000; output_level = 750000; output_level_max = 750000; RCon_tag = "Outpost - Main"},/turf/simulated/floor,/area/outpost/engineering/solars) -"cH" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"cI" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"cJ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/engineering/atmospherics) -"cK" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"cL" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"cM" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"cN" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"cO" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) -"cP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cQ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cR" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cV" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"cW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Outpost Solars"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"cX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"cY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"cZ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"da" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"db" = (/obj/structure/table/reinforced,/obj/item/stack/material/phoron{amount = 10},/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/stack/material/phoron{amount = 10},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dc" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/atmospherics) -"dd" = (/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) -"de" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "outpost_n2_in"; pixel_y = 1; use_power = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) -"df" = (/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Atmospherics"; dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'COMPRESSED GAS'."; name = "COMPRESSED GAS"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"dg" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"dh" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"di" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"dj" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"dk" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"dl" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"dm" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"dn" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"do" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Hallway East"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"dp" = (/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dq" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"ds" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dt" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"du" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_n2_sensor"},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) -"dv" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{dir = 4; frequency = 1441; id_tag = "outpost_n2_out"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) -"dw" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"dx" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Atmospherics"; dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"dy" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/light,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"dz" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"dA" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Hallway Central"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"dB" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/rest) -"dC" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Airlock"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"dD" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/hallway) -"dE" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dG" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable/yellow,/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dH" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/kitchen) -"dI" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"dJ" = (/obj/structure/table/steel,/obj/machinery/cell_charger,/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"dK" = (/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"dL" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"dM" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -20},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dN" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"dO" = (/obj/machinery/door/airlock/engineering{name = "Restrooms"; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"dP" = (/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"dQ" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"dR" = (/obj/machinery/light{dir = 1},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Kitchen"; dir = 9},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"dS" = (/obj/machinery/computer/atmos_alert,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"dT" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"dU" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"dV" = (/obj/structure/closet,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"dW" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dX" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dY" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"dZ" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"ea" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"eb" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"ec" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"ed" = (/obj/machinery/computer/shuttle_control/engineering,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"ee" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"ef" = (/obj/structure/flora/pottedplant{tag = "icon-plant-21"; icon_state = "plant-21"},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Break Room"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"eg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"eh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"ei" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/kitchen) -"ej" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"be" = (/obj/machinery/crystal,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced,/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/turf/simulated/floor/reinforced/phoron,/area/wreck/main) +"bf" = (/obj/machinery/compressor{dir = 4},/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/turf/simulated/floor/reinforced/phoron,/area/wreck/main) +"bg" = (/obj/item/device/gps,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bh" = (/obj/structure/ore_box,/turf/simulated/floor/airless,/area/wreck/main) +"bi" = (/obj/item/weapon/circuitboard/broken,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bj" = (/obj/structure/closet/acloset,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bk" = (/obj/item/weapon/ore,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"bl" = (/obj/structure/bed,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"bm" = (/obj/item/clothing/under/color/pink,/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"bn" = (/obj/structure/table/rack,/obj/item/weapon/tank/jetpack/void,/obj/item/clothing/suit/space/syndicate/green,/obj/item/clothing/head/helmet/space/syndicate/green,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bo" = (/obj/effect/wingrille_spawn/phoron,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bp" = (/obj/structure/table/rack,/obj/item/weapon/material/shard/shrapnel,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bq" = (/obj/item/broken_device,/obj/structure/bed/chair{dir = 8},/obj/effect/decal/remains/robot,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"br" = (/obj/effect/decal/cleanable/blood/oil/streak,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bs" = (/obj/item/weapon/tank/oxygen/yellow,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bt" = (/obj/effect/decal/cleanable/blood/gibs/robot/down,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bu" = (/obj/structure/bed/chair/comfy/brown{dir = 8},/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bv" = (/obj/effect/decal/cleanable/vomit,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bw" = (/obj/structure/AIcore,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bx" = (/obj/item/frame/apc,/obj/item/weapon/module/power_control,/obj/item/weapon/material/shard/shrapnel,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"by" = (/obj/item/device/flashlight/glowstick,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bz" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bA" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bB" = (/obj/item/robot_parts/head,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bC" = (/obj/item/stack/material/steel,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bD" = (/obj/item/clothing/under/color/lightblue,/obj/structure/bed,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"bE" = (/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"bF" = (/obj/item/clothing/under/color/lightpurple,/obj/structure/bed,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"bG" = (/obj/structure/dispenser{oxygentanks = 0; phorontanks = 0},/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bH" = (/obj/item/stack/material/glass{amount = 50; pixel_x = -2; pixel_y = 2},/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bI" = (/obj/item/stack/cable_coil/yellow,/turf/simulated/floor/airless,/area/wreck/main) +"bJ" = (/obj/machinery/crystal,/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (EAST)"; icon_state = "phoronrwindow"; dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel,/turf/simulated/floor/reinforced/phoron,/area/wreck/main) +"bK" = (/obj/machinery/compressor{dir = 4},/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (WEST)"; icon_state = "phoronrwindow"; dir = 8},/obj/structure/window/phoronreinforced,/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/turf/simulated/floor/reinforced/phoron,/area/wreck/main) +"bL" = (/obj/structure/largecrate,/turf/simulated/floor/airless,/area/wreck/main) +"bM" = (/obj/effect/decal/cleanable/molten_item,/turf/simulated/floor/airless,/area/wreck/main) +"bN" = (/obj/structure/window/phoronreinforced{tag = "icon-phoronrwindow (NORTH)"; icon_state = "phoronrwindow"; dir = 1},/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bO" = (/turf/simulated/shuttle/wall{icon_state = "swall_s"; dir = 4},/area/wreck/main) +"bP" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 4},/area/wreck/main) +"bQ" = (/turf/simulated/shuttle/wall{icon_state = "swall_straight"; dir = 1},/area/wreck/main) +"bR" = (/obj/structure/largecrate/hoverpod,/turf/simulated/floor/airless,/area/wreck/main) +"bS" = (/obj/item/stack/material/wood,/obj/item/stack/material/wood,/obj/item/stack/material/wood,/obj/effect/decal/mecha_wreckage/hoverpod,/turf/simulated/floor/airless,/area/wreck/main) +"bT" = (/obj/item/stack/material/steel,/obj/item/stack/material/steel,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bU" = (/obj/structure/table/rack,/obj/item/clothing/glasses/welding,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"bV" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/airless,/area/wreck/main) +"bW" = (/obj/item/frame/light,/turf/simulated/floor/airless,/area/wreck/main) +"bX" = (/obj/effect/decal/mecha_wreckage/mauler,/obj/item/weapon/material/shard/shrapnel,/turf/simulated/floor/airless,/area/wreck/main) +"bY" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/airless,/area/wreck/main) +"bZ" = (/obj/item/stack/material/steel,/obj/item/stack/rods,/turf/simulated/floor/airless,/area/wreck/main) +"ca" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/airless,/area/wreck/main) +"cb" = (/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) +"cc" = (/obj/machinery/teleport/station,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"cd" = (/obj/structure/frame/computer,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"ce" = (/obj/machinery/teleport/hub,/turf/simulated/floor/tiled/airless,/area/wreck/main) +"cf" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/airless,/area/wreck/main) +"cg" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 8},/area/wreck/main) +"ch" = (/turf/simulated/floor/airless,/turf/simulated/shuttle/wall{dir = 2; icon_state = "swall_c"},/area/wreck/main) +"ci" = (/turf/simulated/floor/airless,/turf/simulated/shuttle/wall{dir = 4; icon_state = "swall_c"},/area/wreck/main) +"cj" = (/turf/simulated/shuttle/wall{icon_state = "swall_s"; dir = 1},/area/wreck/main) +"ck" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/airless,/area/wreck/main) +"cl" = (/turf/simulated/shuttle/wall{icon_state = "swall15"; dir = 2},/area/wreck/main) +"cm" = (/obj/structure/shuttle/engine/propulsion,/turf/space,/area/wreck/main) +"cn" = (/obj/structure/shuttle/engine/propulsion{icon_state = "burst_l"},/turf/space,/area/wreck/main) +"co" = (/turf/space,/area/mine/unexplored) +"cp" = (/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/abandoned) +"cq" = (/turf/simulated/wall/r_wall,/area/outpost/abandoned) +"cr" = (/turf/simulated/floor/airless,/area/outpost/abandoned) +"cs" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/material/shard,/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/airless,/area/outpost/abandoned) +"ct" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"cu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"cv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"cw" = (/turf/simulated/floor,/area/outpost/abandoned) +"cx" = (/obj/item/weapon/material/shard/shrapnel,/turf/simulated/floor/airless,/area/outpost/abandoned) +"cy" = (/turf/simulated/floor/tiled,/area/outpost/abandoned) +"cz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"cA" = (/obj/machinery/door/airlock/external,/turf/simulated/floor,/area/outpost/abandoned) +"cB" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"cC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"cD" = (/obj/machinery/floodlight,/turf/simulated/floor,/area/outpost/abandoned) +"cE" = (/obj/machinery/door/firedoor/border_only,/obj/structure/door_assembly/door_assembly_eng,/turf/simulated/floor,/area/outpost/abandoned) +"cF" = (/obj/structure/sign/vacuum{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"cG" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"cH" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor,/area/outpost/abandoned) +"cI" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor,/area/outpost/abandoned) +"cJ" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/frame,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"cK" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/abandoned) +"cL" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"cM" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor,/area/outpost/abandoned) +"cN" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (NORTHEAST)"; icon_state = "intact-scrubbers"; dir = 5},/turf/simulated/floor,/area/outpost/abandoned) +"cO" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/abandoned) +"cP" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/turf/simulated/floor/plating,/area/outpost/abandoned) +"cQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{dir = 1},/turf/simulated/floor,/area/outpost/abandoned) +"cR" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"cS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"cT" = (/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"cU" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"cV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/outpost/abandoned) +"cW" = (/obj/structure/cable{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,/area/outpost/abandoned) +"cX" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"cY" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor,/area/outpost/abandoned) +"cZ" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/outpost/abandoned) +"da" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/outpost/abandoned) +"db" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/outpost/abandoned) +"dc" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/abandoned) +"dd" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"de" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"df" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/outpost/abandoned) +"dg" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/turf/simulated/floor,/area/outpost/abandoned) +"dh" = (/obj/structure/table/rack,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"di" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/item/stack/cable_coil/yellow,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dj" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/outpost/abandoned) +"dk" = (/obj/machinery/recharge_station,/turf/simulated/floor,/area/outpost/abandoned) +"dl" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/abandoned) +"dm" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8},/turf/simulated/floor,/area/outpost/abandoned) +"dn" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1},/turf/simulated/floor,/area/outpost/abandoned) +"do" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dp" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dr" = (/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ds" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/plating,/area/outpost/abandoned) +"dt" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"du" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dv" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dw" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_o2_sensor"},/turf/simulated/floor/reinforced/oxygen,/area/outpost/abandoned) +"dx" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/outpost/abandoned) +"dy" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{dir = 4; frequency = 1441; id_tag = "outpost_o2_out"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/oxygen,/area/outpost/abandoned) +"dz" = (/obj/machinery/atmospherics/omni/mixer{tag_east = 0; tag_east_con = null; tag_north = 2; tag_south = 1; tag_south_con = 0.79; tag_west = 1; tag_west_con = 0.21},/turf/simulated/floor,/area/outpost/abandoned) +"dA" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"dB" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dC" = (/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dD" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/dark,/area/outpost/abandoned) +"dE" = (/turf/simulated/floor/reinforced/oxygen,/area/outpost/abandoned) +"dF" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"dG" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "outpost_o2_in"; pixel_y = 1; use_power = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/oxygen,/area/outpost/abandoned) +"dH" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/turf/simulated/floor,/area/outpost/abandoned) +"dI" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 10},/turf/simulated/floor,/area/outpost/abandoned) +"dJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/outpost/abandoned) +"dK" = (/obj/structure/girder/displaced,/turf/simulated/floor,/area/outpost/abandoned) +"dL" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dM" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dN" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dO" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dP" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"dQ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/outpost/abandoned) +"dR" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/item/frame/apc,/obj/item/weapon/module/power_control,/turf/simulated/floor,/area/outpost/abandoned) +"dS" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable,/turf/simulated/floor,/area/outpost/abandoned) +"dT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'COMPRESSED GAS'."; name = "COMPRESSED GAS"; pixel_x = -32; pixel_y = 0},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor,/area/outpost/abandoned) +"dU" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"dV" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/abandoned) +"dW" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"dX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/outpost/abandoned) +"dY" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/outpost/abandoned) +"dZ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ea" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eb" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ec" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ed" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ee" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ef" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Outpost Solars"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eg" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/outpost/abandoned) +"eh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ei" = (/obj/structure/table/reinforced,/obj/item/stack/material/phoron{amount = 10},/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/stack/material/phoron{amount = 10},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ej" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor,/area/outpost/abandoned) "ek" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/grille,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"el" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/engineering/kitchen) -"em" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/vacuum{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"en" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"eo" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"ep" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"eq" = (/obj/machinery/door/airlock/glass_engineering{name = "Break Room"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"er" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"es" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"et" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Airlock"},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"eu" = (/obj/structure/cable{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,/area/outpost/engineering/rest) -"ev" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"ew" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"ex" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"ey" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eoutpost_solar_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"ez" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"eA" = (/obj/machinery/power/solar_control,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) -"eB" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"eC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"eD" = (/obj/machinery/door/airlock/glass_engineering{name = "Break Room"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"eE" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "edock_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = -25; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"eF" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"eG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"eH" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"eI" = (/obj/machinery/vending/cigarette,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"eJ" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_solar_inner"; locked = 1; name = "Solar Access"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor,/area/outpost/engineering/solars) -"eK" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) -"eL" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) -"eM" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"eN" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"eO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"eP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"eQ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "edock_inner"; locked = 1; name = "Engineering Dock Airlock"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"eR" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"eS" = (/obj/machinery/computer/crew,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"eT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) -"eU" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/engineering/solars) -"eV" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "eoutpost_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eoutpost_solar_airlock"; pixel_x = 30; pixel_y = 0; req_access = list(10); tag_airpump = "eoutpost_solar_pump"; tag_chamber_sensor = "eoutpost_solar_sensor"; tag_exterior_door = "eoutpost_solar_outer"; tag_interior_door = "eoutpost_solar_inner"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eoutpost_solar_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Solar Access"},/turf/simulated/floor,/area/outpost/engineering/solars) -"eW" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) -"eX" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/kitchen) -"eY" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"eZ" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) -"fa" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"fb" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"fc" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "eoutpost_solar_sensor"; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"fe" = (/obj/machinery/sleep_console,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) -"ff" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/rest) -"fg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor,/area/outpost/engineering/solars) -"fh" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "eoutpost_solar_pump"},/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor,/area/outpost/engineering/solars) -"fi" = (/obj/machinery/light/small{dir = 8; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "edock_pump"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"fj" = (/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Elevator"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "edock_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "edock_airlock"; pixel_x = 30; pixel_y = 0; req_access = list(10); tag_airpump = "edock_pump"; tag_chamber_sensor = "edock_sensor"; tag_exterior_door = "edock_outer"; tag_interior_door = "edock_inner"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"fk" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) -"fl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_solar_outer"; locked = 1; name = "Solar Access"},/turf/simulated/floor,/area/outpost/engineering/solars) -"fm" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) -"fn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"fo" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "edock_outer"; locked = 1; name = "Engineering Dock Airlock"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "edock_airlock"; name = "exterior access button"; pixel_x = -26; pixel_y = 0; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"fp" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"fq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) -"fr" = (/obj/machinery/light{dir = 4},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) -"fs" = (/obj/machinery/light{dir = 8},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) -"fu" = (/turf/simulated/wall,/area/outpost/engineering/hallway) -"fv" = (/turf/space,/area/shuttle/constructionsite/site) -"fw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) -"fx" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/outpost/engineering/solarsoutside/aft) +"el" = (/turf/simulated/floor/reinforced/nitrogen,/area/outpost/abandoned) +"em" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "outpost_n2_in"; pixel_y = 1; use_power = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/abandoned) +"en" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/meter,/turf/simulated/floor,/area/outpost/abandoned) +"eo" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 9},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/abandoned) +"ep" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor,/area/outpost/abandoned) +"eq" = (/obj/structure/girder/reinforced,/turf/simulated/floor,/area/outpost/abandoned) +"er" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"es" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"et" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eu" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ev" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ew" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ex" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/outpost/abandoned) +"ey" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ez" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eA" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/outpost/abandoned) +"eB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eC" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_n2_sensor"},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/abandoned) +"eD" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"eE" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{dir = 4; frequency = 1441; id_tag = "outpost_n2_out"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/abandoned) +"eF" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/light,/turf/simulated/floor,/area/outpost/abandoned) +"eG" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eH" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eI" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eJ" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Airlock"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eK" = (/obj/structure/cable,/turf/simulated/floor,/area/outpost/abandoned) +"eL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eM" = (/obj/structure/frame/computer,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eN" = (/obj/structure/table/steel,/obj/machinery/cell_charger,/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eO" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eP" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eR" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eS" = (/obj/structure/closet,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eT" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eU" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eV" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eW" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eX" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eY" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fc" = (/obj/structure/disposalpipe/broken{dir = 4},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"fd" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/vacuum{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fe" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/abandoned) +"ff" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fg" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fh" = (/obj/machinery/door/airlock/glass_engineering{name = "Break Room"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"fi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"fj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"fk" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Airlock"},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/outpost/abandoned) +"fl" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor,/area/outpost/abandoned) +"fm" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fo" = (/obj/structure/table/standard,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fp" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/outpost/abandoned) +"fq" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/frame/computer,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fs" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"ft" = (/obj/machinery/door/airlock/glass_engineering{name = "Break Room"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/outpost/abandoned) +"fu" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor,/area/outpost/abandoned) +"fv" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/external,/turf/simulated/floor,/area/outpost/abandoned) +"fx" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) "fy" = (/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) -"fz" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) -"fA" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) -"fB" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) -"fC" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) -"fD" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) -"fE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) -"fF" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/outpost/engineering/solarsoutside/aft) -"fG" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) +"fz" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"fA" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/motor,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fB" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fC" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"fD" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"fE" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/regular,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fF" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/abandoned) +"fG" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"fH" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) "fI" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) +"fJ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/floor/airless,/area/outpost/abandoned) +"fK" = (/obj/structure/closet/emcloset,/turf/simulated/floor,/area/outpost/abandoned) "fL" = (/obj/structure/grille,/turf/space,/area/space) "fM" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) "fN" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) -"fO" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) -"fP" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) -"fQ" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 9},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"fR" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; icon_state = "intact"; tag = "icon-intact (NORTHEAST)"},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) -"fS" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/item/roller,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"fO" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"fP" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"fQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/outpost/abandoned) +"fR" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/outpost/abandoned) +"fT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/abandoned) +"fU" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/abandoned) +"fV" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/abandoned) +"fW" = (/turf/simulated/wall,/area/outpost/abandoned) +"fX" = (/obj/item/stack/flag/yellow,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) +"fY" = (/obj/machinery/light{dir = 4},/turf/simulated/mineral/floor/ignore_mapgen,/area/outpost/abandoned) +"fZ" = (/obj/machinery/light{dir = 8},/turf/simulated/mineral/floor/ignore_mapgen,/area/outpost/abandoned) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -438,43 +450,43 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahabababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababahahahahafaiafacacacajababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababahahahahahafafafafafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababahahahabahahahahafafafafahafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababahahahahahabahahahahahajafahafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahahahahahahahahababababahahahabahahahabahahahahahahafafahafahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahababababahahahahahahahahahahahahabababahahajahahahahahafafafafafahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababahahahahahahahahahababababababahahahahahababahafakalamafacahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababahahahahahababahacacajajajacahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababahahahahahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababababababahahahahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababananananabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahabababababababababababababahahabananananabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahabababababababababababahaoahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahabababababababababahahahabananananahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahabababababahahahabababananananajababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahahahabababababanapananajababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababajababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababarararararabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababararararasarararaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababatatauauauauavavarararawawarararaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababavayaxatazaBaAaDaCauavavavawasarararawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaEaFavavavaHaGaJaIaJaKaHavavavavavaLararaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaMaNaFaOaOauaJaJaJaJaJauaPaOavavavavasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaQaFavauauauaJaJaRaJaJauauauavavavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaSavavavauauaTauaJaJaVaJaJauaTauauavavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaWavavauauaKaKauaKaJaJaJaKaHaKaKauauavavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaxauauaKaKaKauauaYaXaKaZaubaaKaKauaubbavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaFaubcaKaJaJaJaJaJaubfbeaubgaKaKaKaubhbhavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababauauauauauauaKaJaKaKaKaKauauauauauauaKaKauauauauauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababahahahahafaiafacacacajababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababauaCbiaKbjauauaYauauaJbkaJbmblaDblauaKaKaKbobnbpauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababahahahahahafafafafafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababataAbqbraKaKaKaJaAauaJaKaKaKaJaKaJauaKaKaKbobsaKauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababahahahabahahahahafafafafahafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababataAbtaKbubvaKaJbwaubxaKauaKaJaJaJauaKbyaKbzaKaKaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababahahahahahabahahahahahajafahafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababauaAbAbBaKaKaKaJaAauaJaKaKaKaJaKaJauaKaKaKboaKaKauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahahahahahahahahababababahahahabahahahabahahahahahahafafahafahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaybCbjauauaYauauaJaJaJbEbDaDbFauaKaKaKbobGaKauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahababababahahahahahahahahahahahahabababahahajahahahahahafafafafafahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababataubHaJaKaKaKaKauauauauauauaKaKauauauauauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababahahahahahahahahahababababababahahahahahababahafakalamafacahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbIayaJaJaJaJaJaubKbJauaKaKaKaKaubLavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababahahahahahababahacacajajajacahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbMaKaKauauaYaubNbNauaKaKaKauaubLavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabObPbPbPababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababahahahahahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababataKaKauaKaJaJaJaKaHaKaKauaubLavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQavbRbSavabababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababababababahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababataubTauaJaJaJaJaJaubUauauavavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQbVavavavbWbQababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbXauauauaJaJaJaJaJauauauavbMavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQavavavavavbYababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbZaOaOauaJaJaJaJaJaucaaOavavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQavavavavavbYababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababavavaHaKcbaJaJaKaHavavavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQavavavavavbQababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaybMauaCcdccceaCauavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQavavavavavbYababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababavauauauauauauauavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQavavavavavbYababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQbVavavavcfbQababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgchavavavciabababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjclckckckclabababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababananananabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacncmcmcmabababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahabababababababababababababahahabananananabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacoararababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahabababababababababababahaoahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaararabababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahabababababababababahahahabananananahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaararabababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahabababababahahahabababananananajababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaararababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahahahabababababanapananajababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababajababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -483,52 +495,52 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababahahahahahahahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababahahahahababababababababahahahahahahahacajaoajajacacahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababahahahahahahabababababababahahahahahananananananananacahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababaqarasasasataqahahahabababababahahahahajanananahahahananananahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababauaqavaqauaqawaqaqahahahababababahahahahahananananananananananahahahahahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaGayazaAaBaCaDaEaqaqahahahahajajahahanahanananananananananananahahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababaGaGaGaGaHaIaJaKaCaCaCaqaqaqaqahahananananahanahananananananananananacahahahahahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababaLaLaGaMaNaGaOaPaQaKaRaSaCaTaCaqaqaqahaUananahananananananahahanananananajahahahabababahahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaLaLaLaVaWaXaGayaYaAaZbababbbcaCaCaqaqaqbdananananananananananahanananananajahahahabababahahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababaLaLbeaLaGbfaGaGbgbhbiaCbjbkbabaaFaCaCaqahajajacahanahanananananananananananacahahahabababababababahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababaLbPbnbobpbqbrbsbtbubvbwbxbybabababzaCaqabababahahahahacananananananananahahahahahahabababababababahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababaLaLbAbBbmbnbCbDaLbEbFbGaCbHbIbJbKbabLaCaCabababahahahahacajajahahahahahahahahahahababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababaLblbNbOcKbQbQbQaLbRbSbTaCbUbabababababVaCabababahahahahahahahahahahahahahahabababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababaLaLaLaLbWbXaLaLaLaLbYbZcaaCaCcbccbabacdaCaCaCababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababaLcecfcgchcicjcjaLckclbFbGcmaCaCaCcncnaCaCcocpcpcpcpcpcpabababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababaqaqaLcqcrcsctcucvcwcxcycAczcPbibYclcBclclcCclclcpcDcEcFcGcpcpababababababababababababababababababababababahahabababababaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababcHcIcIcIcIcIcIcIcJcJcJdfcLcMbOcNcOeGcQaGcRcScTbtbtbtbtcUbtcVcWcXcYcZdadbcpababababababababababababababababababababababahahahaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcababababababaqaLdddecsfQdgfRdhcxdidjdkdldmbYdnclclcldoclaIcpdpdqdrdsdtcpabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaLdudvdwdxdydzdzaLckclfPbGdAdBdBdBdCdCdBdBdDcpcpcpdEdFdGcpabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababdHdHdHdHdHdHdHdHdHdHbYbZcadBdBdIdJdKdKdLdBdBdBabcpdMdFdpcpababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababdHdNdOdPdPdQdPdRdHbRbSbTdBdSdTdUdKdKdKdVdBababcpdWdXdYcpababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabahahababababdHdHdHdPdZeaebecdHedbFeedBefdKegdKdKdLdBdBababcpehdXdYcpababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeiejejejejejejekelemdPdZeneoepeqbtereseteuevewdKdKexdBabababcpeyezeAcpabababababababababahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahabdHdHeBdPeCdPdPeDcleEeFdCdKdKeHdKeIdBdBababahcpeJeKeLcpabababababababababahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahdHdHbMeNdPdPeOePeQaAaBdKdKfSeSdBdBabababaheTeUeVeWabababababababahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahdHeXdHeYeZaKfafbfcaKeMfedBffdBabababahaheWfgfheWababababababahahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahdHdHdHaKficlfjaKdBdBdBaqaqahahahahahfkfleKfmahahahahahahahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahahaGfnePfofpfqaGaqaqaqahahahahahaheRaxaqahahahahahahahahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahfufvfvfvfvfvfuahahahahahahahahahahfwahahahahahahahadahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahaheRfvfvfvfvfveRahahadahfxfxfxfxfxahfwahfxfxfxfxfxahadahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahaqfvfvfvfvfvaqahahadfyfzfAfAfAfAfBfCfBfDfDfDfDfEfyadahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahaqfvfvfvfvfvaqahahadahfFfFfFfFfFahfGahfFfFfFfFfFahadahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahaafvfvfvfvfvaqahahadahahahahahahahfGahahahahfyahahfIahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahaaaafvfvfvfvfvaqahahadahfxfxfxfxfxahfGahfxfxfxfxfxahadahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahfracfvfvfvfvfvacfsahfyfyfzfAfAfAfAfBfCfBfDfDfDfDfEfyadahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahfyacaqaqaqacfyahahadahfFfFfFfFfFahfGahfFfFfFfFfFahadahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahadahahahahahahahfGahahahahfyahahfyahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahadahfxfxfxfxfxahfGahfxfxfxfxfxahadahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahadfyfzfAfAfAfAfBfCfBfDfDfDfDfEfyadahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahfIahfFfFfFfFfFahfGahfFfFfFfFfFahadahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahadahahahahahahahfGahahahahahahahadahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahadahfxfxfxfxfxahfGahfxfxfxfxfxahadahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfyfzfAfAfAfAfBfCfBfDfDfDfDfEfyadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafLaefFfFfFfFfFahfGahfFfFfFfFfFaafLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafMaaaaaaaaaaahahfGahahahahahaaaafMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafLfLfLfLaeaefMaafGaaaefNfNfNfNfLfLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNaefOaefNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNaaaeaafNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNfNfNfNfNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababaqaqaqaqaqaqaqahahahabababababahahahahajanananahahahananananahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababcpaqaqaqcpaqaqaqaqahahahababababahahahahahananananananananananahahahahahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababcqcscrcuctcqaqaqaqaqahahahahajajahahanahanananananananananananahahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababcqcqcqcqcrcrcrcvcqcqcqaqaqaqaqahahananananahanahananananananananananacahahahahahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababcqcqcqcwcwcqcrcxcrcvcycycqczcqaqaqaqahaUananahananananananahahanananananajahahahabababahahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababcqcqcqcwcwcwcqcBcAcucCcycycycycqcqaqaqaqbdananananananananananahanananananajahahahabababahahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababcqcqcDcqcqcEcqcqcFcwcGcqcIcHcycycJcqcqaqahajajacahanahanananananananananananacahahahabababababababahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababcqcKcMcLcOcNcQcPcScRcUcTcWcVcycycycXcqaqabababahahahahacananananananananahahahahahahabababababababahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababcqcqcYdacZcMdbdccqcydddecqdgdfdidhcycycqcqabababahahahahacajajahahahahahahahahahahababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababcqdkdjdmdldndndncqdpdodqcqdrcycycycycydhcqabababahahahahahahahahahahahahahahabababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababcqcqcqcqcwdscqcqcqcqdudtdvcqcqdrdrcycycycqcqcqababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababcqdwdydxdAdzcwcwcqcwcydddedBcqcqcqdCdCcqcqdDcqcqcqcqcqcqabababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababcqdEdGdFdIdHcwcwdKdJdMdLdqcGducydNcycydOcycycqdPdRdQdScqcqababababababababababababababababababababababahahabababababaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababcqcqcqdTdVdUdmdWdYdXdZcqebeaeccScScScSedcSeeefcSehegejeicqababababababababababababababababababababababahahahaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababcqelemdFeoencwcweqepesereuetduevcycycyewcyexcqcyezeyeBeAcqabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababcqeCeEeDdAeFcwcwcqeGcyeHdeeIcqcqcqeJeJcqcqeKcqcqcqeteLcwcqabababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababcqcqcqcqcqcqcqcqcqcqdudtdvcqcqeMeNcycyeOcqcqcqabcqcyeLcycqababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababcqePcwcycycGcycycqdpdoeQcqcyeRcGcycycyeScqababcqeTeVeUcqababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabahabababababcqcqcqcyeWeYeXcwcqeMddeZcqcIcyfacycyeOcqcqababcqfbeVeUcqababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahabababfcekfefdcyeWfgfffifhfjcRflfkcWfmfncycyfocqabababcqfpfrfqcqabababababababababahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahabcqcqfscyetcycwftcwfueweJcycyetcyfvcqcqababahcqfwfzfxcqabababababababababahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahcqcqfAfBcycyfCfDcAcuctcycyfEcycqcqabababahfGfFcwfHabababababababahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahcqfJcqcycycvcwcwcwcvcwcwcqcBcqabababahahfHfFcwfHababababababahahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahcqcqcqcvfKcycwcvcqcqcqaqaqahahahahahfOfwfzfPahahahahahahahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahahcqfQfDfRfTfScqaqaqaqahahahahahahfVfUcpahahahahahahahahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahfWahahahahahfWahahahahahahahahahfXaqahahahahahahahadahahahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahfVahahahahahfVahahadahaqaqaqaqaqahaqahaqaqaqaqaqahadahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahaqahahahahahaqahahadfyaqaqaqaqaqaqaqaqaqaqaqaqaqfyadahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahaqahahahahahaqahahadahaqaqaqahahahaqahaqaqaqaqaqahadahahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahahahaqahahadahahahahahahahahahahahahfyahahfIahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahahahahahadahaqaqaqaqaqahaqahaqaqaqaqaqahadahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahfYfWahahahahahfWfZahfyfyaqaqaqaqaqaqaqaqaqaqaqaqaqfyadahahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahfyfWaqaqaqfWfyahahadahaqahahaqaqahaqahaqaqaqaqaqahadahahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahahahadahahahahahahahaqahahahahfyahahfyahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahahadahahahaqaqaqahaqahaqaqahahaqahadahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahahadfyaqaqaqaqaqahahaqaqahahahaqfyadahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahahfIahaqaqaqaqaqahahahahahahaqaqahadahahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahahahadahahahahahahahaqahahahahahahahadahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahahahadahaqaqaqaqaqahaqahaqahahaqaqahadahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfyaaaqaqaqaqaqaqaqaqaqahahaqfyadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafLaeaaaaaaaqaqahaqahaqaqaqaaaaaafLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafMaaaaaaaaaaahahaqahahahahahaaaafMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaefNfNfNfNfLfLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/polaris-5.dmm b/maps/polaris-5.dmm index e76b033e4ec..5871c0d1c77 100644 --- a/maps/polaris-5.dmm +++ b/maps/polaris-5.dmm @@ -129,6 +129,7 @@ "cy" = (/obj/machinery/embedded_controller/radio/airlock/airlock_controller{tag_airpump = "tox_airlock_pump"; tag_exterior_door = "tox_airlock_exterior"; id_tag = "tox_airlock_control"; tag_interior_door = "tox_airlock_interior"; pixel_x = -24; pixel_y = 0; tag_chamber_sensor = "tox_airlock_sensor"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/tvalve/bypass{dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/mixing) "cz" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/mixing) "cA" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/white,/area/outpost/research/mixing) +"cB" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_outpost_outer"; locked = 1; name = "Research Dock Airlock"; req_access = list(10,13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "research_outpost_dock"; name = "exterior access button"; pixel_x = -6; pixel_y = -26; req_one_access = list(13,65)},/turf/simulated/floor/tiled,/area/outpost/research/dock) "cC" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/purple{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway) "cD" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/effect/floor_decal/corner/purple,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway) "cE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/toxins_hallway) @@ -734,11 +735,11 @@ "og" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/hallway/starboard) "oh" = (/obj/effect/floor_decal/industrial/warning/dust/corner{tag = "icon-warningcorner_dust (WEST)"; icon_state = "warningcorner_dust"; dir = 8},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) "oi" = (/obj/machinery/light/small{dir = 1},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) -"oj" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_outpost_outer"; locked = 1; name = "Research Dock Airlock"; req_access = list(10,13)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1380; master_tag = "research_outpost_airlock"; name = "exterior access button"; pixel_x = -6; pixel_y = -26; req_one_access = list(13,65)},/turf/simulated/floor/tiled,/area/outpost/research/dock) +"oj" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "research_outpost_dock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_one_access = list(13,65)},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) "ok" = (/turf/simulated/floor/tiled,/area/outpost/research/dock) "ol" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/research/dock) "om" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "research_outpost_inner"; locked = 1; name = "Research Outpost Dock"},/turf/simulated/floor/tiled,/area/outpost/research/dock) -"on" = (/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "research_outpost_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 26; req_one_access = list(13,65)},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) +"on" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) "oo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) "op" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) "oq" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) @@ -876,7 +877,7 @@ "qS" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "qT" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "qU" = (/obj/effect/floor_decal/corner/beige{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) -"qV" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/solution_trays,/obj/effect/floor_decal/corner/beige/full{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) +"qV" = (/obj/structure/table/glass,/obj/effect/floor_decal/corner/beige/full{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "qW" = (/obj/effect/floor_decal/corner/purple/full,/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/white,/area/outpost/research/dock) "qX" = (/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly) "qY" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) @@ -894,14 +895,14 @@ "rk" = (/obj/structure/table/rack,/obj/item/weapon/storage/belt/archaeology,/obj/item/clothing/suit/space/anomaly,/obj/item/clothing/head/helmet/space/anomaly,/obj/item/clothing/mask/breath,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/westleft,/turf/simulated/floor/tiled/dark,/area/outpost/research/eva) "rl" = (/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/effect/floor_decal/corner/beige/full,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "rm" = (/obj/item/weapon/reagent_containers/glass/beaker/large,/obj/item/weapon/reagent_containers/dropper{pixel_y = -4},/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) -"rn" = (/obj/item/weapon/reagent_containers/glass/beaker/water,/obj/item/weapon/reagent_containers/glass/beaker/fuel,/obj/item/weapon/reagent_containers/glass/bottle/toxin,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric{name = "beaker 'sulphuric acid'"},/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) +"rn" = (/obj/item/weapon/reagent_containers/glass/bottle/toxin,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric{name = "beaker 'sulphuric acid'"},/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "ro" = (/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "rp" = (/obj/machinery/door/window/southright{name = "Spectrometry Lab"; req_access = list(65)},/obj/effect/floor_decal/corner/beige{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "rq" = (/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Hallway Starboard 2"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/outpost/research/hallway/starboard) "rr" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "rs" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_south = 2; tag_west = 3},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "rt" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) -"ru" = (/obj/effect/floor_decal/corner/purple{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/landmark{name = "bluespacerift"},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) +"ru" = (/obj/effect/floor_decal/corner/purple{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) "rv" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly) "rw" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "rx" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) @@ -914,8 +915,8 @@ "rE" = (/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/eva) "rF" = (/obj/effect/floor_decal/corner/purple/full{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/outpost/research/eva) "rG" = (/obj/effect/floor_decal/corner/purple{dir = 1},/obj/machinery/light{dir = 8},/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/research/eva) -"rH" = (/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/eva) -"rI" = (/obj/item/weapon/storage/box/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"rH" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/research/eva) +"rI" = (/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/weapon/wrench,/obj/item/device/measuring_tape,/obj/item/stack/flag/yellow,/obj/structure/table/steel,/turf/simulated/floor/tiled,/area/outpost/research/eva) "rJ" = (/obj/structure/dispenser/oxygen,/obj/effect/floor_decal/corner/purple{dir = 6},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled,/area/outpost/research/eva) "rK" = (/obj/machinery/light/small,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) "rL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/analysis) @@ -1006,9 +1007,9 @@ "ts" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "tt" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "tu" = (/obj/machinery/portable_atmospherics/powered/scrubber/huge,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) -"tv" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/door/airlock/research{name = "Isolation Room 1"; req_access = list(65)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/research/anomaly) -"tw" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Isolation Room 2"; req_access = list(65)},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) -"tx" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Isolation Room 3"; req_access = list(65)},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) +"tv" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/door/airlock/research{name = "Isolation Room 1"; req_access = list(65)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/research/isolation_a) +"tw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/isolation_a) +"tx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/outpost/research/isolation_a) "ty" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable/blue{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) "tz" = (/obj/machinery/disposal/deliveryChute{dir = 1},/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/window/reinforced{dir = 8; health = 1e+006},/turf/simulated/floor,/area/outpost/research/anomaly) "tA" = (/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/outpost/research/power) @@ -1024,23 +1025,23 @@ "tK" = (/obj/structure/cable/blue,/obj/machinery/power/smes/buildable/outpost_substation{charge = 500000; input_attempt = 1; input_level = 150000; output_level = 150000; RCon_tag = "Outpost - Research"},/turf/simulated/floor/plating,/area/outpost/research/power) "tL" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/turf/simulated/floor/plating,/area/outpost/research/power) "tM" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/plating,/area/outpost/research/power) -"tN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Isolation Cell 1"; dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) -"tO" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) -"tP" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_one"; dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) -"tQ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Isolation Cell 2"; dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) +"tN" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Isolation Room 2"; req_access = list(65)},/turf/simulated/floor/tiled,/area/outpost/research/isolation_b) +"tO" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/isolation_b) +"tP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/outpost/research/isolation_b) +"tQ" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/research{name = "Isolation Room 3"; req_access = list(65)},/turf/simulated/floor/tiled,/area/outpost/research/isolation_c) "tR" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) -"tS" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Isolation Cell 3"; dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) -"tT" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_three"; dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) +"tS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/research/isolation_c) +"tT" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/outpost/research/isolation_c) "tU" = (/turf/simulated/wall/r_wall,/area/outpost/research/power) "tV" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/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/plating,/area/outpost/research/power) "tW" = (/obj/machinery/light/small{dir = 8},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) -"tX" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) +"tX" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_a) "tY" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) -"tZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/outpost/research/anomaly) +"tZ" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_a) "ua" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) -"ub" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) -"uc" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) -"ud" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) +"ub" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_a) +"uc" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_b) +"ud" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_b) "ue" = (/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) "uf" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) "ug" = (/turf/simulated/wall,/area/outpost/mining_main/north_hall) @@ -1227,7 +1228,7 @@ "xF" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/obj/machinery/light/small,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/mining_main/refinery) "xG" = (/obj/machinery/floodlight,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/unexplored) "xH" = (/obj/machinery/atmospherics/portables_connector{dir = 4},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) -"xI" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/research/anomaly) +"xI" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_b) "xJ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/obj/machinery/alarm{frequency = 1441; pixel_y = 22},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "xK" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "xL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "meoutpost_main_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = 25; req_access = newlist(); req_one_access = list(10,48,65)},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) @@ -1249,9 +1250,9 @@ "yb" = (/turf/simulated/wall/r_wall,/area/outpost/mining_main/refinery) "yc" = (/turf/simulated/wall,/area/outpost/mining_main/refinery) "yd" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) -"ye" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_two"; dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) +"ye" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_c) "yf" = (/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) -"yg" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) +"yg" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_c) "yh" = (/obj/structure/cable/blue{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "yi" = (/obj/machinery/door/airlock/atmos{req_one_access = list(10,48,65)},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{dir = 4},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics) "yj" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{tag = "icon-intact-supply (NORTHWEST)"; icon_state = "intact-supply"; dir = 9},/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{dir = 1},/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics) @@ -1285,7 +1286,7 @@ "yL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "yM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "yN" = (/obj/structure/table/standard,/obj/item/weapon/flame/lighter/random,/obj/item/weapon/crowbar,/obj/machinery/newscaster{layer = 3.3; pixel_x = -30; pixel_y = 0},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly) -"yO" = (/obj/machinery/artifact_analyser,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) +"yO" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable/blue{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/research/isolation_c) "yP" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics) "yQ" = (/obj/machinery/reagentgrinder,/obj/structure/table/glass,/obj/structure/window/reinforced,/obj/effect/floor_decal/corner/beige/full{dir = 4},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Sample Preparation"; dir = 8},/obj/machinery/status_display{layer = 4; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis) "yR" = (/obj/machinery/portable_atmospherics/canister/air,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/outpost/engineering/mining/atmospherics) @@ -1566,7 +1567,7 @@ "Eg" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) "Eh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) "Ei" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/mining_main/eva) -"Ej" = (/obj/structure/bed,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/anomaly) +"Ej" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_a) "Ek" = (/obj/machinery/shieldwallgen,/obj/machinery/atmospherics/pipe/manifold4w/hidden,/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "El" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) "Em" = (/obj/machinery/shieldwallgen,/obj/structure/extinguisher_cabinet{pixel_x = 7; pixel_y = -32},/turf/simulated/floor/tiled,/area/outpost/engineering/mining/hallway) @@ -1590,6 +1591,324 @@ "EE" = (/obj/structure/bed/chair/office/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) "EF" = (/obj/machinery/recharger/wallcharger{pixel_x = 32},/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) "EG" = (/obj/machinery/light{dir = 1},/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled,/area/outpost/research/xenobiology) +"EH" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Isolation Cell 1"; dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_a) +"EI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_one"; dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_a) +"EJ" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_b) +"EK" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Isolation Cell 2"; dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_b) +"EL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_two"; dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_b) +"EM" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"EN" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; use_power = 0},/obj/machinery/camera/network/research_outpost{c_tag = "OPR - Isolation Cell 3"; dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"EO" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8},/obj/machinery/alarm/monitor/isolation{alarm_id = "isolation_three"; dir = 8; pixel_x = 22; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"EP" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_a) +"EQ" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_a) +"ER" = (/obj/machinery/artifact_analyser,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_a) +"ES" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_b) +"ET" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_b) +"EU" = (/obj/machinery/artifact_analyser,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_b) +"EV" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"EW" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"EX" = (/obj/structure/bed,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/outpost/research/isolation_c) +"EY" = (/turf/simulated/wall,/area/mine/unexplored) +"EZ" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"Fa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"Fb" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"Fc" = (/obj/machinery/light,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/kitchen) +"Fd" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eoutpost_main_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = -25; req_access = list(10)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) +"Fe" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHWEST)"; icon_state = "warning_dust"; dir = 9},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) +"Ff" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"Fg" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/obj/machinery/light/small,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/engineering/kitchen) +"Fh" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/hallway) +"Fi" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_outer"; locked = 1; name = "Engineering Outpost"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Fj" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"Fk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"Fl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"Fm" = (/obj/machinery/cell_charger,/obj/structure/table/steel,/obj/structure/cable,/obj/item/frame/apc,/obj/item/weapon/module/power_control,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"Fn" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/storage) +"Fo" = (/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/structure/table/steel,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"Fp" = (/obj/structure/table/steel,/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) +"Fq" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/kitchen) +"Fr" = (/obj/effect/floor_decal/industrial/warning/dust,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/engineering/kitchen) +"Fs" = (/obj/effect/floor_decal/industrial/warning/dust,/obj/machinery/light/small{dir = 8; pixel_x = 0},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/engineering/kitchen) +"Ft" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Fu" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "eoutpost_main_pump"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eoutpost_main_sensor"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Fv" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"Fw" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 2; frequency = 1379; id_tag = "eoutpost_main_pump"},/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Fx" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/engineering/kitchen) +"Fy" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/engineering/kitchen) +"Fz" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/atmospherics) +"FA" = (/obj/machinery/telecomms/relay/preset/mining,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/telecomms) +"FB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) +"FC" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"FD" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eoutpost_main_airlock"; pixel_x = -25; pixel_y = 0; req_access = list(10); tag_airpump = "eoutpost_main_pump"; tag_chamber_sensor = "eoutpost_main_sensor"; tag_exterior_door = "eoutpost_main_outer"; tag_interior_door = "eoutpost_main_inner"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"FE" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Airlock"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"FF" = (/obj/machinery/pipedispenser,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"FG" = (/obj/machinery/pipedispenser/disposal,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"FH" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/storage) +"FI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/telecomms) +"FJ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) +"FK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost TeleCommunications"; dir = 1},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid{name = "Mainframe Base"; nitrogen = 82.1472; oxygen = 21.8366; temperature = 293.15},/area/outpost/engineering/telecomms) +"FL" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_main_inner"; locked = 1; name = "Engineering Outpost"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"FM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"FN" = (/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"FO" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"FP" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"FQ" = (/obj/machinery/floodlight,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"FR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/airlock/glass_engineering{name = "Telecommunications"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/outpost/engineering/telecomms) +"FS" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eoutpost_main_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = 25; req_access = list(10)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"FT" = (/obj/structure/sign/vacuum{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"FU" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"FV" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"FW" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"FX" = (/obj/machinery/autolathe,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"FY" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"FZ" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/atmospherics/binary/pump/on{dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Ga" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Gb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/visible/supply,/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (NORTHEAST)"; icon_state = "intact-scrubbers"; dir = 5},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Gc" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Gd" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) +"Ge" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Gf" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Gg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Gh" = (/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"Gi" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Gj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"Gk" = (/obj/structure/cable{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,/area/outpost/engineering/storage) +"Gl" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"Gm" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Gn" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Go" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Gp" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Gq" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Gr" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Gs" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Gt" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Gu" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"Gv" = (/obj/structure/table/rack,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/obj/item/weapon/pickaxe,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"Gw" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/stack/cable_coil/yellow,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"Gx" = (/obj/structure/table/rack,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/stack/cable_coil/yellow,/obj/item/stack/cable_coil,/obj/item/weapon/module/power_control,/obj/item/weapon/module/power_control,/obj/item/clothing/gloves/yellow,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"Gy" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"Gz" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (EAST)"; icon_state = "warning_dust"; dir = 4},/obj/machinery/light/small,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/engineering/kitchen) +"GA" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/obj/machinery/light/small,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/engineering/kitchen) +"GB" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"GC" = (/obj/machinery/recharge_station,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"GD" = (/obj/machinery/atmospherics/pipe/manifold/visible/cyan{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"GE" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"GF" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"GG" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"GH" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"GI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"GJ" = (/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/wood{amount = 30},/obj/item/stack/material/plastic{amount = 10},/obj/structure/table/steel,/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"GK" = (/obj/structure/table/rack,/obj/item/clothing/head/helmet/space/void/engineering,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/shoes/magboots,/obj/machinery/firealarm{dir = 4; layer = 3.3; pixel_x = 26},/obj/item/weapon/storage/briefcase/inflatable,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"GL" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) +"GM" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"GN" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"GO" = (/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"GP" = (/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"GQ" = (/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/structure/table/steel,/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"GR" = (/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/structure/table/steel,/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Storage"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"GS" = (/obj/machinery/floodlight,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"GT" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_o2_sensor"},/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) +"GU" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"GV" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{dir = 4; frequency = 1441; id_tag = "outpost_o2_out"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) +"GW" = (/obj/machinery/atmospherics/omni/mixer{tag_east = 0; tag_east_con = null; tag_north = 2; tag_south = 1; tag_south_con = 0.79; tag_west = 1; tag_west_con = 0.21},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"GX" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"GY" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"GZ" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Ha" = (/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Hb" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Hc" = (/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/engineering/storage) +"Hd" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/power/emitter,/turf/simulated/floor/tiled/dark,/area/outpost/engineering/hallway) +"He" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/solars) +"Hf" = (/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) +"Hg" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Hh" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "outpost_o2_in"; pixel_y = 1; use_power = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/oxygen,/area/outpost/engineering/atmospherics) +"Hi" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Hj" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 10},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Hk" = (/obj/machinery/atmospherics/pipe/manifold/visible,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Hl" = (/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Hm" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -20},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Hn" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/wall/r_wall,/area/outpost/engineering/atmospherics) +"Ho" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Hp" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 1; icon_state = "map"; tag = "icon-manifold-f (NORTH)"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Hq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Hr" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Hs" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Ht" = (/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Hu" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Power Supply"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Hv" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Hw" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/smes/buildable{charge = 1.5e+007; cur_coils = 3; input_attempt = 1; input_level = 750000; input_level_max = 750000; output_level = 750000; output_level_max = 750000; RCon_tag = "Outpost - Main"},/turf/simulated/floor,/area/outpost/engineering/solars) +"Hx" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (WEST)"; icon_state = "warning_dust"; dir = 8},/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) +"Hy" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) +"Hz" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (SOUTHEAST)"; icon_state = "warning_dust"; dir = 6},/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) +"HA" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTHWEST)"; icon_state = "warning_dust"; dir = 9},/obj/effect/floor_decal/industrial/warning/dust,/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) +"HB" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 6},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"HC" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/engineering/atmospherics) +"HD" = (/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Atmospherics"; dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'COMPRESSED GAS'."; name = "COMPRESSED GAS"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"HE" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"HF" = (/obj/machinery/atmospherics/omni/filter{power_rating = 15000; tag_east = 1; tag_north = 3; tag_south = 4; tag_west = 2},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"HG" = (/obj/machinery/atmospherics/pipe/simple/visible/universal{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"HH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"HI" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers{tag = "icon-intact-scrubbers (EAST)"; icon_state = "intact-scrubbers"; dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Atmospherics"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/outpost/engineering/atmospherics) +"HJ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"HK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"HL" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"HM" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"HN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"HO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"HP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"HQ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Outpost Solars"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"HR" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"HS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"HT" = (/obj/structure/table/reinforced,/obj/item/stack/material/phoron{amount = 10},/obj/random/powercell,/obj/random/tech_supply,/obj/random/tech_supply,/obj/item/stack/material/phoron{amount = 10},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"HU" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"HV" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"HW" = (/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) +"HX" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 4; frequency = 1441; icon_state = "map_injector"; id = "outpost_n2_in"; pixel_y = 1; use_power = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) +"HY" = (/obj/machinery/atmospherics/pipe/simple/visible/blue,/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"HZ" = (/obj/machinery/atmospherics/pipe/simple/visible/black{dir = 9},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Ia" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/atmospherics/pipe/manifold/visible{dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Ib" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 6; icon_state = "intact"; tag = "icon-intact (NORTHEAST)"},/obj/machinery/meter,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Ic" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Id" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Ie" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"If" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Ig" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Ih" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Ii" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Hallway East"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Ij" = (/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Ik" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Il" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Im" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"In" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Io" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "outpost_n2_sensor"},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) +"Ip" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Iq" = (/obj/machinery/atmospherics/unary/vent_pump/siphon/on/atmos{dir = 4; frequency = 1441; id_tag = "outpost_n2_out"},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/reinforced/nitrogen,/area/outpost/engineering/atmospherics) +"Ir" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/obj/machinery/light,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Is" = (/obj/machinery/atmospherics/pipe/simple/visible/blue{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Atmospherics"; dir = 1},/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"It" = (/obj/machinery/atmospherics/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor,/area/outpost/engineering/atmospherics) +"Iu" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/effect/landmark{name = "bluespacerift"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Iv" = (/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Hallway Central"; dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Iw" = (/turf/simulated/wall/r_wall,/area/outpost/engineering/rest) +"Ix" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Airlock"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"Iy" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled/dark,/area/outpost/engineering/hallway) +"Iz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"IA" = (/obj/machinery/power/port_gen/pacman,/obj/structure/cable/yellow,/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"IB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"IC" = (/obj/effect/floor_decal/industrial/warning/dust,/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/mine/explored) +"ID" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"IE" = (/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"IF" = (/obj/structure/table/steel,/obj/machinery/cell_charger,/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"IG" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"IH" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -20},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"II" = (/obj/machinery/door/airlock/engineering{name = "Restrooms"; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"IJ" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"IK" = (/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"IL" = (/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"IM" = (/obj/machinery/light{dir = 1},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Kitchen"; dir = 9},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"IN" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"IO" = (/obj/machinery/computer/atmos_alert,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"IP" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"IQ" = (/obj/structure/closet,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"IR" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 6; icon_state = "intact"; tag = "icon-intact-f (SOUTHEAST)"},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"IS" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"IT" = (/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact-f (EAST)"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"IU" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"IV" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"IW" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"IX" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"IY" = (/obj/machinery/computer/shuttle_control/engineering,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"IZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Ja" = (/obj/structure/flora/pottedplant{tag = "icon-plant-21"; icon_state = "plant-21"},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Break Room"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"Jb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"Jc" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Jd" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/grille,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"Je" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"Jf" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/structure/sign/vacuum{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"Jg" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/outpost/engineering/kitchen) +"Jh" = (/obj/structure/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"Ji" = (/obj/structure/table/standard,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"Jj" = (/obj/machinery/door/airlock/glass_engineering{name = "Break Room"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"Jk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"Jl" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Jm" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Airlock"},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"Jn" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Jo" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"Jp" = (/obj/structure/cable{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,/area/outpost/engineering/rest) +"Jq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"Jr" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"Js" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "eoutpost_solar_airlock"; name = "interior access button"; pixel_x = 25; pixel_y = -25; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Jt" = (/obj/machinery/power/solar_control,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Ju" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/engineering/solars) +"Jv" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"Jw" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"Jx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"Jy" = (/obj/machinery/door/airlock/glass_engineering{name = "Break Room"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"Jz" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "edock_airlock"; name = "interior access button"; pixel_x = -26; pixel_y = -25; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"JA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"JB" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"JC" = (/obj/machinery/vending/cigarette,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"JD" = (/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_solar_inner"; locked = 1; name = "Solar Access"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor,/area/outpost/engineering/solars) +"JE" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) +"JF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) +"JG" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"JH" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"JI" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"JJ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "edock_inner"; locked = 1; name = "Engineering Dock Airlock"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"JK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"JL" = (/obj/machinery/computer/crew,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"JM" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/o2{pixel_x = 4; pixel_y = 4},/obj/item/weapon/storage/firstaid/regular,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -28},/obj/item/roller,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"JN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/outpost/engineering/solars) +"JO" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) +"JP" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) +"JQ" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "eoutpost_solar_pump"},/obj/machinery/embedded_controller/radio/airlock/airlock_controller{frequency = 1379; id_tag = "eoutpost_solar_airlock"; pixel_x = 30; pixel_y = 0; req_access = list(10); tag_airpump = "eoutpost_solar_pump"; tag_chamber_sensor = "eoutpost_solar_sensor"; tag_exterior_door = "eoutpost_solar_outer"; tag_interior_door = "eoutpost_solar_inner"},/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eoutpost_solar_sensor"; pixel_x = 0; pixel_y = 25},/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Solar Access"},/turf/simulated/floor,/area/outpost/engineering/solars) +"JR" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/kitchen) +"JS" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"JT" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled,/area/outpost/engineering/kitchen) +"JU" = (/obj/machinery/atmospherics/pipe/manifold/hidden,/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"JV" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"JW" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "eoutpost_solar_sensor"; pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"JX" = (/obj/machinery/sleep_console,/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"JY" = (/obj/machinery/sleeper{dir = 8},/turf/simulated/floor/tiled,/area/outpost/engineering/rest) +"JZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/rest) +"Ka" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/turf/simulated/floor,/area/outpost/engineering/solars) +"Kb" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "eoutpost_solar_pump"},/obj/machinery/light/small{dir = 4; pixel_y = 8},/turf/simulated/floor,/area/outpost/engineering/solars) +"Kc" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/obj/effect/floor_decal/industrial/warning/dust,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/engineering/kitchen) +"Kd" = (/obj/effect/floor_decal/industrial/warning/dust{tag = "icon-warning_dust (NORTH)"; icon_state = "warning_dust"; dir = 1},/obj/effect/floor_decal/industrial/warning/dust,/obj/machinery/light/small{dir = 8; pixel_x = 0},/turf/simulated/floor/tiled/asteroid_steel/airless,/area/outpost/engineering/kitchen) +"Ke" = (/obj/machinery/light/small{dir = 8; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "edock_pump"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Kf" = (/obj/machinery/camera/network/engineering_outpost{c_tag = "ENG - Outpost Elevator"; dir = 1},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; frequency = 1380; id_tag = "edock_pump"},/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "edock_airlock"; pixel_x = 30; pixel_y = 0; req_access = list(10); tag_airpump = "edock_pump"; tag_chamber_sensor = "edock_sensor"; tag_exterior_door = "edock_outer"; tag_interior_door = "edock_inner"},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Kg" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/external{frequency = 1379; icon_state = "door_locked"; id_tag = "eoutpost_solar_outer"; locked = 1; name = "Solar Access"},/turf/simulated/floor,/area/outpost/engineering/solars) +"Kh" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) +"Ki" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/solars) +"Kj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"Kk" = (/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "edock_outer"; locked = 1; name = "Engineering Dock Airlock"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "edock_airlock"; name = "exterior access button"; pixel_x = -26; pixel_y = 0; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/hallway) +"Kl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/sign/securearea{desc = "A warning sign which reads 'KEEP CLEAR OF DOCKING AREA'."; name = "KEEP CLEAR: DOCKING AREA"; pixel_y = 0},/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"Km" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/outpost/engineering/hallway) +"Kn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eoutpost_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(10)},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/kitchen) +"Ko" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/kitchen) +"Kp" = (/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/kitchen) +"Kq" = (/turf/space,/area/shuttle/constructionsite/site) +"Kr" = (/turf/simulated/wall,/area/outpost/engineering/hallway) +"Ks" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) +"Kt" = (/obj/structure/grille,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) +"Ku" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/outpost/engineering/solarsoutside/aft) +"Kv" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) +"Kw" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) +"Kx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) +"Ky" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) +"Kz" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) +"KA" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) +"KB" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/turf/space,/area/space) +"KC" = (/obj/structure/disposaloutlet,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/kitchen) +"KD" = (/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/outpost/engineering/solarsoutside/aft) +"KE" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) +"KF" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 140; external_pressure_bound_default = 140; icon_state = "map_vent_out"; pressure_checks = 1; pressure_checks_default = 1; use_power = 1},/turf/simulated/floor/airless,/area/outpost/engineering/atmospherics) +"KG" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) +"KH" = (/obj/machinery/light{dir = 4},/turf/simulated/mineral/floor/ignore_mapgen,/area/outpost/engineering/kitchen) +"KI" = (/obj/machinery/light{dir = 8},/turf/simulated/mineral/floor/ignore_mapgen,/area/outpost/engineering/kitchen) +"KJ" = (/obj/structure/grille,/turf/space,/area/space) +"KK" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) +"KL" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) +"KM" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1714,7 +2033,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamcmEmEmEmEmEjrmemFmgmgmgmGjrjrjzjAmHjrjtqclImJmKlLjPjCmLmMjCmLmMjCmNmOjtmPmQmRmSmPjvqomUmVmWmYmXjvmZnakZkZmbdldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaanbmEmEmEmEmEncndnenfmgmgjrjrngnhninjnkjtjtjtjCkhkikjjCjtjtjCjCjCjCjtjtjtnlnmnnnonpjvjvjvnqnrnsntnumPnvnwkZmbdldldldldldldldldldldldldldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEnxnynznxnAmgqFqEnBlFnCnDnEmgnFnGnHnInJnKnLnMnNqKnPnQqppXnFnTnUnVnWnXnTnTnYrqoamRobocodoeofogohmbdldldldldldldldldldldldldldldldldldldldldldldldldldldldldloidldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEojokolomonooopopoqrujrosotouovowoxoyoyozoyoAoBoCoDoDoEoDoFoGoHoImPoJoKoGoLCMoMoNoOoPoQoRoSoToUmboVoVoVoVoVdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEcBokolomojoooponoqrujrosotouovowoxoyoyozoyoAoBoCoDoDoEoDoFoGoHoImPoJoKoGoLCMoMoNoOoPoQoRoSoToUmboVoVoVoVoVdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNmEmEmEmEmEoWoXoYoWoZpapbpcpbpdpepfpgmgnFphpisKpkpkplnMpmpnpopppqprpstnpupvpwpxpyptpzpApBpCpDEdodpFpGpHpImboVoVoVoVoVdloVoVoVoVdldloVdldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlpJmEmEmEmEmEpKndndpLpMpNpMpMpOpPmglFpQpRpRpRpSpSpTpUpVpRpWqBpWpSpSpRpRpRpYpZqaqbvNqdqdqdqeqeqfqgnumPnvqhqiqjoVoVdldldloVoVoVdloVoVoVdloVoVdldldloVdldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlmcmEmEmEmEmEpMqkqlqlqmqnvRpMjrqWqqqrjrpRqsqtquqvqwqxqyqzqArbqCqDxYxWqDpRmPqGqHqImPqdqJyuqLqLqMqNqdqOoVoVoVoVoVdldldldldldldldldldldldloVoVoVdloVoVdldldldldloVdldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1723,10 +2042,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlrLrMrNrOrPrQrRrSrTrUrVpWrWrXrXrXrYrZsasbscsdtcrZsfrZrtsgshsisjskslsmsnsospqLsqsrssoVoVoVdldldlrKacacacacacacacacacacacacacacacjWdldldldldldldldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlstsusvswsxsyszsAsBrXsCsDrXrXrYsfsEsFsFsFDGsFtdsFsEsHrtsIsJpWzfsLsMsNsOqLsPsqsQsRsSoVoVacacdldljWacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldloidldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMsTsUsVszsAsWsXsXsYrXrXsZtatbtftethtgtItytRtJtYtisIzLtjtjtktltjtmsqAitoqdqdoVoVtpacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMpMtqszsAtrtsttpWtutupRpWtvtZpRpWtwtZpRpWtxtZpRuatztjtAtBtCtjtDtEqdqdqdoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMpMsAtFtGtHpSpRpRpRuducxIpRuducxIpRuducxIpRpRpRtjtKtLtMtjqdqdqdoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldlpMpMpRpWpRpRpRdlpRtNtOtPpRtQtOyepRtStOtTpRdlpRtUtUtVtUtUqdoVoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjWtWdldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlaaaaaaaaaaaaaaaaaaaaaaaaaadlaadldldldldldldldldldldldldlpRtXygyOpRtXygyOpRubtXEjpRdldldldlueufoVoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMpMtqszsAtrtsttpWtutupRtwtvtxpRtOtNtPpRtStQtTpRuatztjtAtBtCtjtDtEqdqdqdoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlpMpMpMsAtFtGtHpSpRpRpRtZtXubpRuducxIpRygyeyOpRpRpRtjtKtLtMtjqdqdqdoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldlpMpMpRpWpRpRpRdlpREHEjEIpREKEJELpRENEMEOpRdlpRtUtUtVtUtUqdoVoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjWtWdldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlaaaaaaaaaaaaaaaaaaaaaaaaaadlaadldldldldldldldldldldldldlpREQEPERpRETESEUpREWEVEXpRdldldldlueufoVoVoVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagNuguhgNdlgNuhuggNdlaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldldldldldldlpRpRpRpRpRpRpRpRpRpRpRpRpRdldldldlueoVoVoVoVdlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadlugujujujujujujujugdldlaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlueoVoVdlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldlwaujujujujujujujwadldldldlaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldldldldldldldldldldldldldldldldldldldldldlukuloVdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -1761,65 +2080,65 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSBSDfDgCf aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacBSBSBSDnDoDhDpDpCkBPDqDrBOBOBOdldldloVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacBSBSBSDhDsDtDuBPBOBOBOdldldldldloVoVdlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacBSBSDvDwDxBOBOacdldldldldldloVoVdlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacoVoVDyoVacacdldldldldldloVoVdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacoVoVDzoVacacdldldldldldloVoVdlDHjWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacoVDBacacacacdldldldldloVoVoVdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacoVacacacacacdldldldldloVoVdldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjWdldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacdldloVoVoVoVdldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdloidldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacdldldldloVdldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacdldldldloVdloVoVoVdldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacdldldldldldldldldloVoVoVdldldldldldldldldldldldldloidlacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCaaaaDCaaaaaaDCaaaaaaaaaaDCaaaaaaDCaaaaDCaaaaaaaaaaaaaaaaacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacjWdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCaaaaaaDCDCDCDCDCDCDCaaaaaaDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacdldldlrKdldldldloVdldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacoidldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCaaaaDCDCDCDCDCDCDCDCDCaaaaDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacjWdldldldldldldldldldldloVdldldldldldldldldldldldldldldldldldlacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCaaaaDCDCDCDCDCDCDCDCDCaaaaDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlrKdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldlrKdldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjWdldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacoVoVDyoVacacdldldldldldloVoVdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjWdldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacoVoVDzoVacacdldldldldldloVoVdlDHjWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdloidldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacoVDBacacacacdldldldldloVoVoVdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldlacacdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacoVacacacacacdldldldldloVoVdldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldlacacdldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacdldloVoVoVoVdldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldlacacacdldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacdldldldloVdldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacdldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacdldldldloVdloVoVoVdldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacEYdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacdldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacdldldldldldldldldloVoVoVdldldldldldldldldldldldldloidlacacacacacacacacacdldlacacacacacacacacacoidldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacdldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCaaaaDCaaaaaaDCaaaaaaaaaaDCaaaaaaDCaaaaDCaaaaaaaaaaaaaaaaacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacdldldlacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCaaaaaaDCDCDCDCDCDCDCaaaaaaDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacdldldlrKdldldldloVdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlrKdldlacacacacacacacacacacacacacacacacacacacacacacdldlacdldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCaaaaDCDCDCDCDCDCDCDCDCaaaaDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacjWdldldldldldldldldldldloVdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldljWacacacacacacacacacacacacacacacacacacacacacacacacacacacdldlacdldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCaaaaDCDCDCDCDCDCDCDCDCaaaaDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldlacacacdldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacoVoVoVacacacacacacdldldlacacacacacacacacacacacacacacacacacacacacacacoVoVoVoVEZFaFaFaFboVdldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdldldldldldldldldldldldldldlrKdldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVoVFcFeFdkvFcoVFfoVoVdldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjWacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVoVFeFgktktktktktktktktktktktktktktktktktFgkvoVoVoVoVoVoVoVoVoVoVoVoVoVFhFjFiFlFkFnFmFooVoVdldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVFqFpFpqiqiqiqiqiFrFqFsqiqiqiqiqiFpFpFqmboVacacacacoVoVoVoVoVFhFhFhFhFuFtFwFvFnFnFnoVoVoVoVdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVFxaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaaFymboVacacacacoVoVoVFzFzFhFAFBFhFDFCFEFvFGFFFnFHFnoVoVoVdlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVmbaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaavVmboVacacacoVoVoVFzFzFzFJFIFKFhFjFLFlFMFNFNFPFOFnFnoVdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdloVvVmbaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaavVmboVacacacoVoVFzFzFQFzFhFRFhFhFTFSFUFnFWFVFNFNFXFnFndldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdloVvVmbaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaavVmboVacacoVoVoVFzFYGaFZGcGbGeGdGgGfGiGhGkGjFNFNFNGlFndlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVmbaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaavVmboVacacoVoVFzFzGmGoGnGaGpGqFzGsGrGtFnGvGuGxGwFNGyFnFnacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVGzaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaaGAmboVdloVoVoVFzGCGBGEGDGFGFGFFzGHGGGIFnGJFNFNFNFNFNGKFnacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVFqaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaaFqmboVdloVoVFzFzFzFzGMGLFzFzFzFzGOGNGPFnFnGQGRFNFNGSFnFnFnacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVFxaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaaFymboVdloVoVFzGTGVGUGXGWGYGYFzGZHaGrGtHbFnFnFnHcHcFnFnHdHeHeHeHeHeHeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCDCDCaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVmbaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaavVmboVdloVoVFzHfHhHgHjHiHlHkHnHmHpHoHqFUGOHaHrHaHaHsHaHaHeHtHvHuHwHeHeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDCDCDCDCDCDCDCaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVHxqiHyHzaaaaaaaaaaaaaaaaaaaaaaaaaaHAHyqiqjoVdloVHBHCHCHCHDHFHEGEHGHIHHHJFhHLHKHMGgGgGgGgHNGgHOHQHPHSHRHUHTHeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVoVoVoVoVaaaaaaaaaaaaaaaaaaaaaaaaaaoVoVoVoVoVdloVHVFzHWHXHgHZHYIbIaHnIcIeIdIgIfGOIhHaHaHaIiHaFtHeIjIlIkInImHeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVoVoVoVoVaaaaaaaaaaaaaaaaaaaaaaaaaaoVoVoVoVoVacacHVFzIoIqIpIsIrItItFzGZHaIuGtIvIwIwIwIxIxIwIwIyHeHeHeIzIBIAHeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVFektICHzaaaaaaaaaaaaaaaaaaaaaaaaaaHAHyktkvoVacacHVFqFqFqFqFqFqFqFqFqFqGOGNGPIwIwIDIFIEIEIGIwIwIwacHeIHIBIjHeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVGzaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaaGAmboVacacHVacFqIJIIIKIKILIKIMFqGHGGGIIwIOINIPIEIEIEIQIwacacHeIRITISHeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVFqaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaaFqmboVacacHVacFqFqFqIKIUIWIVIXFqIYGrIZIwJaIEJbIEIEIGIwIwacacHeJcITISHeacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVvVFxaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaaFymboVdldlHVJeJdJgJfIKIUJiJhJkJjGgJlJnJmJpJoJqIEIEJrIwacacacHeJsJuJtHeacacacacacacacacacacdldlacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacoVHxqiHyHzaaaaaaaaaaaaaaaaaaaaaaaaaaHAHyqiqjoVdldlHVJvacFqFqJwIKJxIKIKJyHaJzJAIxIEIEJBIEJCIwIwacacdlHeJDJFJEHeacacacacacacacacacdldldldlacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdloVoVoVoVoVaaaaaaaaaaaaaaaaaaaaaaaaaaoVoVoVoVoVdldlHVJvdldlFqFqJGJHIKIKJIJKJJFlFkIEIEJMJLIwIwacacacdlJOJNJQJPacacacacacacacdldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacdloVoVoVoVoVaaaaaaaaaaaaaaaaaaaaaaaaaaoVoVoVoVoVdldlHVJvdldldlFqJRFqJSJTFvJVJUJWFvJYJXIwJZIwacacacdldlJPKaKbJPacacacacacacdldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacHAKcFqKdHzaaaaaaaaaaaaaaaaaaaaaaaaaaHAKcFqKdHzdldlHVJvdldldldldlFqFqFqFvKeHaKfFvIwIwIwoVoVdldldldldlKhKgJFKidldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacgPgPaaaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaaaagNdldldlHVJvdldldldldldldlFhKjJKKkKmKlFhoVoVoVdldldldldldlKoKnKpdldldldldldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaagPgPaagPaaaaaaaaaaaaaaaaaaaaaaaaaagPaagPgPdldldlHVJvdldldldldldldlKrKqKqKqKqKqKrdldldldldldldldldldlKsdldldldldldldlKtdldldldldldldlacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaagPgPgPaaaaaaaaaaaaaaaaaaaaaaaaaagPgPgPaaaadldlHVJvdldldldldldldlKoKqKqKqKqKqKodldlKtdlKuKuKuKuKudlKsdlKuKuKuKuKudlKtdldldldldlaaacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaagPgPgPgPgPgPgPgPgPgPgPgPgPgPgPaaaaaaaaaadlHVJvdldldldldldldloVKqKqKqKqKqoVdldlKtgNKvKwKwKwKwKyKxKyKzKzKzKzKAgNKtdldldldldlaaacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPKBKCdldldldldldldloVKqKqKqKqKqoVdldlKtdlKDKDKDKDKDdlKEdlKDKDKDKDKDdlKtdldldldldlaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPKFgPaadldldldldldlaaKqKqKqKqKqoVdldlKtdldldldldldldlKEdldldldlgNdldlKGdldldldlaaaaaaaaacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPgPgPaaaadldldldlaaaaKqKqKqKqKqoVdldlKtdlKuKuKuKuKudlKEdlKuKuKuKuKudlKtdldldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlKHjWKqKqKqKqKqjWKIdlgNgNKvKwKwKwKwKyKxKyKzKzKzKzKAgNKtdldldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlgNjWoVoVoVjWgNdldlKtdlKDKDKDKDKDdlKEdlKDKDKDKDKDdlKtdldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldldldlKtdldldldldldldlKEdldldldlgNdldlgNdldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldlKtdlKuKuKuKuKudlKEdlKuKuKuKuKudlKtdldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldlKtgNKvKwKwKwKwKyKxKyKzKzKzKzKAgNKtdldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldlKGdlKDKDKDKDKDdlKEdlKDKDKDKDKDdlKtdldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldlKtdldldldldldldlKEdldldldldldldlKtdlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlKtdlKuKuKuKuKudlKEdlKuKuKuKuKudlKtdlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKtgNKvKwKwKwKwKyKxKyKzKzKzKzKAgNKtaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKJgPKDKDKDKDKDdlKEdlKDKDKDKDKDaaKJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKKaaaaaaaaaadldlKEdldldldldlaaaaKKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKJKJKJKJgPgPKKaaKEaagPKLKLKLKLKJKJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKLgPKMgPKLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKLaagPaaKLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaKLKLKLKLKLaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/nano/templates/atmo_control.tmpl b/nano/templates/atmo_control.tmpl index 5e68b8cd66a..d3c61758e72 100644 --- a/nano/templates/atmo_control.tmpl +++ b/nano/templates/atmo_control.tmpl @@ -16,7 +16,7 @@ {{if value.sensor_data.temperature}}
    Temperature:
    -
    {{:value.sensor_data.temperature}} kPa
    +
    {{:value.sensor_data.temperature}} K
    {{/if}} {{if value.sensor_data.oxygen || value.sensor_data.nitrogen || value.sensor_data.carbon_dioxide || value.sensor_data.phoron}} @@ -221,4 +221,4 @@ {{:helper.link('Search', 'search', {'refresh_status' : 1})}}
    {{/if}} -{{/if}} \ No newline at end of file +{{/if}} diff --git a/nano/templates/identification_computer.tmpl b/nano/templates/identification_computer.tmpl index e783d9e3af4..d37ea009e95 100644 --- a/nano/templates/identification_computer.tmpl +++ b/nano/templates/identification_computer.tmpl @@ -137,7 +137,7 @@
    diff --git a/polaris.dme b/polaris.dme index e2e62ef971e..a66d16b9930 100644 --- a/polaris.dme +++ b/polaris.dme @@ -21,7 +21,6 @@ #include "code\__defines\admin.dm" #include "code\__defines\appearance.dm" #include "code\__defines\atmos.dm" -#include "code\__defines\btime.dm" #include "code\__defines\chemistry.dm" #include "code\__defines\damage_organs.dm" #include "code\__defines\dna.dm" @@ -38,6 +37,7 @@ #include "code\__defines\targeting.dm" #include "code\__defines\turfs.dm" #include "code\__defines\unit_tests.dm" +#include "code\__defines\xenoarcheaology.dm" #include "code\_compatibility\509\_JSON.dm" #include "code\_compatibility\509\JSON Reader.dm" #include "code\_compatibility\509\JSON Writer.dm" @@ -152,7 +152,6 @@ #include "code\controllers\Processes\ticker.dm" #include "code\controllers\Processes\turf.dm" #include "code\controllers\Processes\vote.dm" -#include "code\controllers\ProcessScheduler\core\_stubs.dm" #include "code\controllers\ProcessScheduler\core\process.dm" #include "code\controllers\ProcessScheduler\core\processScheduler.dm" #include "code\datums\ai_law_sets.dm" @@ -419,7 +418,6 @@ #include "code\game\gamemodes\technomancer\core_obj.dm" #include "code\game\gamemodes\technomancer\equipment.dm" #include "code\game\gamemodes\technomancer\instability.dm" -#include "code\game\gamemodes\technomancer\presets.dm" #include "code\game\gamemodes\technomancer\spell_objs.dm" #include "code\game\gamemodes\technomancer\spell_objs_helpers.dm" #include "code\game\gamemodes\technomancer\technomancer.dm" @@ -548,7 +546,7 @@ #include "code\game\machinery\requests_console.dm" #include "code\game\machinery\robot_fabricator.dm" #include "code\game\machinery\seed_extractor.dm" -#include "code\game\machinery\Sleeper.dm" +#include "code\game\machinery\sleeper.dm" #include "code\game\machinery\spaceheater.dm" #include "code\game\machinery\status_display.dm" #include "code\game\machinery\status_display_ai.dm" @@ -1276,6 +1274,10 @@ #include "code\modules\economy\price_list.dm" #include "code\modules\economy\retail_scanner.dm" #include "code\modules\economy\TradeDestinations.dm" +#include "code\modules\error_handler\_defines.dm" +#include "code\modules\error_handler\error_handler.dm" +#include "code\modules\error_handler\error_viewer.dm" +#include "code\modules\error_handler\~defines.dm" #include "code\modules\events\apc_damage.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" @@ -1311,12 +1313,14 @@ #include "code\modules\examine\stat_icons.dm" #include "code\modules\examine\descriptions\armor.dm" #include "code\modules\examine\descriptions\atmospherics.dm" +#include "code\modules\examine\descriptions\containers.dm" #include "code\modules\examine\descriptions\devices.dm" #include "code\modules\examine\descriptions\engineering.dm" #include "code\modules\examine\descriptions\machines.dm" #include "code\modules\examine\descriptions\medical.dm" #include "code\modules\examine\descriptions\mobs.dm" #include "code\modules\examine\descriptions\paperwork.dm" +#include "code\modules\examine\descriptions\smokeables.dm" #include "code\modules\examine\descriptions\stacks.dm" #include "code\modules\examine\descriptions\structures.dm" #include "code\modules\examine\descriptions\telecomms.dm" @@ -1718,6 +1722,7 @@ #include "code\modules\overmap\ships\computers\shuttle.dm" #include "code\modules\overmap\ships\engines\engine.dm" #include "code\modules\overmap\ships\engines\thermal.dm" +#include "code\modules\paperwork\adminpaper.dm" #include "code\modules\paperwork\carbonpaper.dm" #include "code\modules\paperwork\clipboard.dm" #include "code\modules\paperwork\faxmachine.dm" @@ -1895,62 +1900,6 @@ #include "code\modules\research\rdmachines.dm" #include "code\modules\research\research.dm" #include "code\modules\research\server.dm" -#include "code\modules\research\xenoarchaeology\chemistry.dm" -#include "code\modules\research\xenoarchaeology\geosample.dm" -#include "code\modules\research\xenoarchaeology\manuals.dm" -#include "code\modules\research\xenoarchaeology\master_controller.dm" -#include "code\modules\research\xenoarchaeology\misc.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact_autocloner.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact_crystal.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact_gigadrill.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact_replicator.dm" -#include "code\modules\research\xenoarchaeology\artifact\artifact_unknown.dm" -#include "code\modules\research\xenoarchaeology\artifact\effect.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_affect_cold.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_badfeeling.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_cellcharge.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_celldrain.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_dnaswitch.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_emp.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_forcefield.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasco2.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasnitro.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasoxy.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasplasma.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gassleeping.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_goodfeeling.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heal.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heat.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_hurt.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_radiate.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_roboheal.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_robohurt.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_sleepy.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_stun.dm" -#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_teleport.dm" -#include "code\modules\research\xenoarchaeology\finds\finds.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_defines.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_eguns.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_fossils.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_misc.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_special.dm" -#include "code\modules\research\xenoarchaeology\finds\finds_talkingitem.dm" -#include "code\modules\research\xenoarchaeology\machinery\artifact_analyser.dm" -#include "code\modules\research\xenoarchaeology\machinery\artifact_harvester.dm" -#include "code\modules\research\xenoarchaeology\machinery\artifact_scanner.dm" -#include "code\modules\research\xenoarchaeology\machinery\coolant.dm" -#include "code\modules\research\xenoarchaeology\machinery\geosample_scanner.dm" -#include "code\modules\research\xenoarchaeology\tools\ano_device_battery.dm" -#include "code\modules\research\xenoarchaeology\tools\anomaly_suit.dm" -#include "code\modules\research\xenoarchaeology\tools\gearbelt.dm" -#include "code\modules\research\xenoarchaeology\tools\suspension_generator.dm" -#include "code\modules\research\xenoarchaeology\tools\tools.dm" -#include "code\modules\research\xenoarchaeology\tools\tools_anoscanner.dm" -#include "code\modules\research\xenoarchaeology\tools\tools_coresampler.dm" -#include "code\modules\research\xenoarchaeology\tools\tools_depthscanner.dm" -#include "code\modules\research\xenoarchaeology\tools\tools_locater.dm" -#include "code\modules\research\xenoarchaeology\tools\tools_pickaxe.dm" #include "code\modules\scripting\Errors.dm" #include "code\modules\scripting\IDE.dm" #include "code\modules\scripting\Options.dm" @@ -2057,6 +2006,58 @@ #include "code\modules\virus2\helpers.dm" #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" +#include "code\modules\xenoarcheaology\boulder.dm" +#include "code\modules\xenoarcheaology\effect.dm" +#include "code\modules\xenoarcheaology\manuals.dm" +#include "code\modules\xenoarcheaology\master_controller.dm" +#include "code\modules\xenoarcheaology\misc.dm" +#include "code\modules\xenoarcheaology\sampling.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact.dm" +#include "code\modules\xenoarcheaology\artifacts\artifact_find.dm" +#include "code\modules\xenoarcheaology\artifacts\autocloner.dm" +#include "code\modules\xenoarcheaology\artifacts\crystal.dm" +#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm" +#include "code\modules\xenoarcheaology\artifacts\replicator.dm" +#include "code\modules\xenoarcheaology\effects\badfeeling.dm" +#include "code\modules\xenoarcheaology\effects\cellcharge.dm" +#include "code\modules\xenoarcheaology\effects\celldrain.dm" +#include "code\modules\xenoarcheaology\effects\cold.dm" +#include "code\modules\xenoarcheaology\effects\dnaswitch.dm" +#include "code\modules\xenoarcheaology\effects\emp.dm" +#include "code\modules\xenoarcheaology\effects\forcefield.dm" +#include "code\modules\xenoarcheaology\effects\gasco2.dm" +#include "code\modules\xenoarcheaology\effects\gasnitro.dm" +#include "code\modules\xenoarcheaology\effects\gasoxy.dm" +#include "code\modules\xenoarcheaology\effects\gasphoron.dm" +#include "code\modules\xenoarcheaology\effects\gassleeping.dm" +#include "code\modules\xenoarcheaology\effects\goodfeeling.dm" +#include "code\modules\xenoarcheaology\effects\heal.dm" +#include "code\modules\xenoarcheaology\effects\heat.dm" +#include "code\modules\xenoarcheaology\effects\hurt.dm" +#include "code\modules\xenoarcheaology\effects\radiate.dm" +#include "code\modules\xenoarcheaology\effects\roboheal.dm" +#include "code\modules\xenoarcheaology\effects\robohurt.dm" +#include "code\modules\xenoarcheaology\effects\sleepy.dm" +#include "code\modules\xenoarcheaology\effects\stun.dm" +#include "code\modules\xenoarcheaology\effects\teleport.dm" +#include "code\modules\xenoarcheaology\finds\eguns.dm" +#include "code\modules\xenoarcheaology\finds\find_spawning.dm" +#include "code\modules\xenoarcheaology\finds\finds.dm" +#include "code\modules\xenoarcheaology\finds\finds_defines.dm" +#include "code\modules\xenoarcheaology\finds\fossils.dm" +#include "code\modules\xenoarcheaology\finds\misc.dm" +#include "code\modules\xenoarcheaology\finds\special.dm" +#include "code\modules\xenoarcheaology\finds\talking.dm" +#include "code\modules\xenoarcheaology\tools\ano_device_battery.dm" +#include "code\modules\xenoarcheaology\tools\artifact_analyser.dm" +#include "code\modules\xenoarcheaology\tools\artifact_harvester.dm" +#include "code\modules\xenoarcheaology\tools\artifact_scanner.dm" +#include "code\modules\xenoarcheaology\tools\coolant_tank.dm" +#include "code\modules\xenoarcheaology\tools\equipment.dm" +#include "code\modules\xenoarcheaology\tools\geosample_scanner.dm" +#include "code\modules\xenoarcheaology\tools\suspension_generator.dm" +#include "code\modules\xenoarcheaology\tools\tools.dm" +#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm" #include "code\modules\xenobio2\_xeno_setup.dm" #include "code\modules\xenobio2\controller.dm" #include "code\modules\xenobio2\machinery\core_extractor.dm"
    [severity_to_string[severity]][worldtime2text(max(EC.next_event_time, world.time))][worldtime2stationtime(max(EC.next_event_time, world.time))][round(next_event_at / 600, 0.1)]" html += "--" @@ -178,7 +178,7 @@ html += "
    [severity_to_string[EM.severity]][EM.name][worldtime2text(ends_at)][worldtime2stationtime(ends_at)][ends_in]Stop
    Special - {{:helper.link("Captain", '', {'choice' : 'assign', 'assign_target' : 'Captain'}, data.target_rank == 'Captain' ? 'disabled' : null)}} + {{:helper.link("Station Administrator", '', {'choice' : 'assign', 'assign_target' : 'Station Administrator'}, data.target_rank == 'Station Administrator' ? 'disabled' : null)}} {{:helper.link("Custom", '', {'choice' : 'assign', 'assign_target' : 'Custom'})}}