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/__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/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/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..836d2124bd4 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,11 @@
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
+ // There are two newlines here, because handling desc sucks
+ e.desc = " Caught by process: [name]\n\n" + e.desc
+ world.Error(e, e_src = thrower)
+ 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 +357,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/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/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/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/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 23bd46243ee..0275f70b282 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 = 2
required_enemies = 1
end_on_antag_death = 0
antag_scaling_coeff = 10
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index 72dfd6ec5c3..3953caa5252 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -37,6 +37,7 @@
for(var/limb in H.organs_by_name)
var/obj/item/organ/external/current_limb = H.organs_by_name[limb]
current_limb.undislocate()
+ current_limb.open = 0
C.halloss = 0
C.shock_stage = 0 //Pain
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/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/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..7b0379cbc2b 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 = 1
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/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..5c2cfed4ddd 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 = 1
required_enemies = 1
end_on_antag_death = 0
antag_tags = list(MODE_WIZARD)
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index c02048450b6..6b2a40a8aaa 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -133,7 +133,7 @@
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)
@@ -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")
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/medical.dm b/code/game/jobs/job/medical.dm
index 08faeff78b0..4a58377fc72 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -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/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 70720249454..684589fabce 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -410,7 +410,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"]]"
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index ea730a4a9ff..2922cbea335 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/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/guestpass.dm b/code/game/machinery/computer/guestpass.dm
index b3f97657464..4c0f0591b24 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)
@@ -207,13 +207,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..6868f233437 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)
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..e6f19b8588e 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)
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/cryopod.dm b/code/game/machinery/cryopod.dm
index dcf6571a29a..6a4353702e2 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -466,8 +466,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]")
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 7bfe32d7191..4c1198838a4 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
diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm
index 8b0d78cb968..2c4a2cefbb9 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -150,7 +150,7 @@
return 1
if(STATUS_DISPLAY_TIME)
message1 = "TIME"
- message2 = worldtime2text()
+ message2 = stationtime2text()
update_display(message1, message2)
return 1
return 0
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index d28cb2444c7..2cf5347edb5 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -314,7 +314,7 @@
T.amount = "[currently_vending.price]"
T.source_terminal = src.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
@@ -337,7 +337,7 @@
T.amount = "[currently_vending.price]"
T.source_terminal = src.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)
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index f304404a6d4..43c47d135ca 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 d0abc7a338e..4d649450fbb 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/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/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 cd8e4e0e6d0..7df8fc65748 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\]"
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index b2c9e82e279..80c5228bb42 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -484,6 +484,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/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/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/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/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 08c7c56f4f2..f7de0b46f6a 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -271,7 +271,8 @@
/obj/item/weapon/anodevice,
/obj/item/clothing/glasses,
/obj/item/weapon/wrench,
- /obj/item/weapon/storage/box/excavation,
+ /obj/item/weapon/storage/excavation,
/obj/item/weapon/anobattery,
- /obj/item/device/ano_scanner
+ /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/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/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/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/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/hub.dm b/code/hub.dm
index 9bd4fae1d8a..a9d8b0c7d76 100644
--- a/code/hub.dm
+++ b/code/hub.dm
@@ -1,8 +1,8 @@
/world
hub = "Exadv1.spacestation13"
- //hub_password = "SORRYNOPASSWORD"
- hub_password = "kMZy3U5jJHSiBQjr"
+ hub_password = "SORRYNOPASSWORD"
+ //hub_password = "kMZy3U5jJHSiBQjr"
name = "Space Station 13"
/* This is for any host that would like their server to appear on the main SS13 hub.
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 45cc570cb6e..c7d5ec16703 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -97,7 +97,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,
@@ -306,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..9ee3d10b6b3 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,26 @@ 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(!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/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 StatusRound 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 261c95515a7..335241d15e7 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1386,86 +1386,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/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/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/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/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index ae064dd2a89..a8a65a9873a 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -91,9 +91,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"]."
+ if(open)
+ usr << "It's equipped with [english_list(installed_modules)]."
+
/obj/item/weapon/rig/New()
..()
diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm
index 270d21cfebd..10994ea57b3 100644
--- a/code/modules/clothing/spacesuits/rig/suits/station.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/station.dm
@@ -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/rig/suits/station_vr.dm b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm
index c5d25f84f65..7a159fe36d1 100644
--- a/code/modules/clothing/spacesuits/rig/suits/station_vr.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/station_vr.dm
@@ -15,7 +15,7 @@
/obj/item/weapon/rig/eva
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/toolbox,/obj/item/weapon/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/weapon/rcd,/obj/item/weapon/storage/backpack)
/obj/item/weapon/rig/hazmat
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/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,/obj/item/weapon/storage/backpack)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/stack/flag,/obj/item/weapon/storage/excavation,/obj/item/weapon/pickaxe,/obj/item/device/healthanalyzer,/obj/item/device/measuring_tape,/obj/item/device/ano_scanner,/obj/item/device/depth_scanner,/obj/item/device/core_sampler,/obj/item/device/gps,/obj/item/device/beacon_locator,/obj/item/device/radio/beacon,/obj/item/weapon/pickaxe/hand,/obj/item/weapon/storage/bag/fossils,/obj/item/weapon/storage/backpack)
/obj/item/weapon/rig/ce
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd,/obj/item/weapon/storage/backpack)
/obj/item/weapon/rig/medical
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..37a93f2c2ef 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -131,7 +131,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 +260,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 +302,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 +322,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 +350,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 +375,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 +387,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 +410,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 += ""
R.info += ""
@@ -486,7 +486,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/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 += "| [severity_to_string[severity]] | "
- html += "[worldtime2text(max(EC.next_event_time, world.time))] | "
+ html += "[worldtime2stationtime(max(EC.next_event_time, world.time))] | "
html += "[round(next_event_at / 600, 0.1)] | "
html += ""
html += "--"
@@ -178,7 +178,7 @@
html += " |
"
html += "| [severity_to_string[EM.severity]] | "
html += "[EM.name] | "
- html += "[worldtime2text(ends_at)] | "
+ html += "[worldtime2stationtime(ends_at)] | "
html += "[ends_in] | "
html += "Stop | "
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/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/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 d61d47ba9fb..dc08557ff96 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 7f4dc972c4f..6b8a3c43b3c 100644
--- a/code/modules/mob/living/carbon/breathe.dm
+++ b/code/modules/mob/living/carbon/breathe.dm
@@ -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/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 24f810a49b8..a53363e586f 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
@@ -933,9 +937,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()
@@ -1421,6 +1424,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 3779e791cc5..ad6d078869a 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -37,6 +37,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 f6d1b6f74f5..84683ce44d2 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -343,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(5))
+ 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]
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 bd296caba32..8dbb1d8a5d7 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/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm
index ebc3956bd5c..dd9fe95fb55 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -97,8 +97,8 @@
burn_mod = 1.15
// gluttonous = 1 // Vorestation edit. Redundant feature.
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/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
index 68904d0b8a2..8e57ec1363f 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm
@@ -319,3 +319,6 @@
icobase = 'icons/mob/human_races/r_human_vr.dmi'
deform = 'icons/mob/human_races/r_def_human_vr.dmi'
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_EYE_COLOR
+
+/datum/species
+ holder_type = /obj/item/weapon/holder/micro //This allows you to pick up crew
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 871a873fe4c..e93f63261f7 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 b9bf50a51c4..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)
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/mob.dm b/code/modules/mob/mob.dm
index 2e9df5eec8c..75f061e2e13 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -655,8 +655,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 51deceb68d3..c2b83551ec8 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -369,7 +369,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/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/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/paper.dm b/code/modules/paperwork/paper.dm
index 1e85563ee80..ba80dbb6147 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\]", "")
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index ec0d7acf19f..4d0e22f1860 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -165,7 +165,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 +196,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 +217,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/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/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/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/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/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/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm
index 0391b03e403..06daf449ca6 100644
--- a/code/modules/vore/resizing/resize_vr.dm
+++ b/code/modules/vore/resizing/resize_vr.dm
@@ -82,7 +82,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
return 1
/**
- * Attempt to scoop up this mob up into M's hands, if the size difference is large enough.
+ * Attempt to scoop up this mob up into H's hands, if the size difference is large enough.
* @return false if normal code should continue, 1 to prevent normal code.
*/
/mob/living/proc/attempt_to_scoop(var/mob/living/carbon/human/H)
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_unknown_vr.dm b/code/modules/xenoarcheaology/artifacts/artifact_vr.dm
similarity index 100%
rename from code/modules/research/xenoarchaeology/artifact/artifact_unknown_vr.dm
rename to code/modules/xenoarcheaology/artifacts/artifact_vr.dm
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/xenoarcheaology/artifacts/autocloner.dm
similarity index 72%
rename from code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
rename to code/modules/xenoarcheaology/artifacts/autocloner.dm
index 9d3f03cd798..9008ab8d2b8 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."
@@ -31,17 +30,16 @@
) // Vorestation Edits
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()
@@ -49,17 +47,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)
@@ -80,7 +78,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_eguns_vr.dm b/code/modules/xenoarcheaology/finds/eguns_vr.dm
similarity index 100%
rename from code/modules/research/xenoarchaeology/finds/finds_eguns_vr.dm
rename to code/modules/xenoarcheaology/finds/eguns_vr.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/research/xenoarchaeology/misc_vr.dm b/code/modules/xenoarcheaology/misc_vr.dm
similarity index 100%
rename from code/modules/research/xenoarchaeology/misc_vr.dm
rename to code/modules/xenoarcheaology/misc_vr.dm
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 99%
rename from code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
rename to code/modules/xenoarcheaology/tools/geosample_scanner.dm
index ed23b965dfe..dde5a3058e8 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."
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/research/xenoarchaeology/tools/tools_pickaxe_vr.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe_vr.dm
similarity index 100%
rename from code/modules/research/xenoarchaeology/tools/tools_pickaxe_vr.dm
rename to code/modules/xenoarcheaology/tools/tools_pickaxe_vr.dm
diff --git a/code/world.dm b/code/world.dm
index 1d439428d26..672715baf52 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -157,8 +157,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 a8a7b461710..094778be218 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -53,6 +53,89 @@
-->
+
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:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 4bc9e3273b5..3934efa625c 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2648,3 +2648,96 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
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:
+ - 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.
diff --git a/html/changelogs/HarpyEagle-burns.yml b/html/changelogs/Hubblenaut - bottles.yml
similarity index 90%
rename from html/changelogs/HarpyEagle-burns.yml
rename to html/changelogs/Hubblenaut - bottles.yml
index f7fce8e5fe9..b12e6cde371 100644
--- a/html/changelogs/HarpyEagle-burns.yml
+++ b/html/changelogs/Hubblenaut - bottles.yml
@@ -22,7 +22,7 @@
#################################
# Your name.
-author: HarpyEagle
+author: Hubblenaut
# 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:
- - rscadd: "Severe enough burn damage now causes one-time blood loss due to blistering and body fluid cook-off."
\ No newline at end of file
+ - bugfix: "Bottles will now actually sell for their set prices."
\ No newline at end of file
diff --git a/html/changelogs/Sin4 - miscfixes.yml b/html/changelogs/Hubblenaut - penlight.yml
similarity index 87%
rename from html/changelogs/Sin4 - miscfixes.yml
rename to html/changelogs/Hubblenaut - penlight.yml
index ae61151c33b..dd742e44c6a 100644
--- a/html/changelogs/Sin4 - miscfixes.yml
+++ b/html/changelogs/Hubblenaut - penlight.yml
@@ -22,7 +22,7 @@
#################################
# Your name.
-author: Sin4
+author: Hubblenaut
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
@@ -33,5 +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: "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."
+ - tweak: "Chief Medical Officer and Medical Doctors now spawn with a health analyzer instead of a penlight."
diff --git a/html/changelogs/Kasuobes-ShowMeTheModules.yml b/html/changelogs/Kasuobes-ShowMeTheModules.yml
new file mode 100644
index 00000000000..8b65bfad529
--- /dev/null
+++ b/html/changelogs/Kasuobes-ShowMeTheModules.yml
@@ -0,0 +1,6 @@
+author: Haswell
+
+delete-after: True
+
+changes:
+ - 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."
\ No newline at end of file
diff --git a/html/changelogs/Sin4 - bugfixbugaloo.yml b/html/changelogs/Sin4 - bugfixbugaloo.yml
new file mode 100644
index 00000000000..188ec32683e
--- /dev/null
+++ b/html/changelogs/Sin4 - bugfixbugaloo.yml
@@ -0,0 +1,42 @@
+################################
+# 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: Sin4
+
+# 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: "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."
diff --git a/html/changelogs/Yoshax - Telecrystals.yml b/html/changelogs/Yoshax - IDs.yml
similarity index 68%
rename from html/changelogs/Yoshax - Telecrystals.yml
rename to html/changelogs/Yoshax - IDs.yml
index 25e6a390864..e2b6ecf24d7 100644
--- a/html/changelogs/Yoshax - Telecrystals.yml
+++ b/html/changelogs/Yoshax - IDs.yml
@@ -33,7 +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:
- - 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."
+ - bugfix: "IDs can now actually be put onto your ears."
diff --git a/html/changelogs/Yoshax - rupturelungs.yml b/html/changelogs/Yoshax - rupturelungs.yml
new file mode 100644
index 00000000000..1df064bd6fd
--- /dev/null
+++ b/html/changelogs/Yoshax - rupturelungs.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: Yoshax
+
+# 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: "Lungs will now once again rupture when you are in an area where you cannot breathe. This has a relatively small chance to happen."
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index 9eaa1546e40..18c6f0e46c3 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.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/items/lefthand_storage.dmi b/icons/mob/items/lefthand_storage.dmi
index 80c8a703028..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 0b5b26bba6c..9aede7781a4 100644
Binary files a/icons/mob/items/righthand_storage.dmi and b/icons/mob/items/righthand_storage.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 7a5326775bf..cf1c7b343c0 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm
index a010896198d..2e1be078c92 100644
--- a/maps/polaris-1.dmm
+++ b/maps/polaris-1.dmm
@@ -539,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)
@@ -555,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)
@@ -573,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)
@@ -588,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)
@@ -598,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)
@@ -625,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)
@@ -652,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)
@@ -675,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)
@@ -1168,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)
@@ -1278,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)
@@ -2522,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)
@@ -2599,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)
@@ -2637,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)
@@ -2850,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)
@@ -2897,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)
@@ -2975,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)
@@ -3022,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)
@@ -4506,7 +4506,6 @@
"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/maintenance{req_one_access = list(12,5)},/turf/simulated/floor,/area/maintenance/pool)
"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)
@@ -4652,7 +4651,6 @@
"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/random/powercell,/obj/random/powercell,/obj/random/powercell,/obj/random/powercell,/obj/random/toolbox,/obj/effect/decal/cleanable/molten_item,/mob/living/simple_animal/hostile/mimic/crate,/turf/simulated/floor,/area/maintenance/medbay_fore)
"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)
@@ -4763,6 +4761,7 @@
"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)
"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)
@@ -4864,6 +4863,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)
@@ -4909,7 +4909,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/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"},/turf/simulated/floor,/area/engineering/atmos/storage)
"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)
@@ -4940,6 +4942,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)
@@ -4963,6 +4966,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)
@@ -5223,6 +5227,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)
@@ -5425,6 +5430,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,/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)
@@ -5505,6 +5511,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)
@@ -5585,6 +5592,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)
@@ -5714,6 +5722,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/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,/turf/simulated/floor,/area/engineering/atmos/storage)
"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)
@@ -6193,7 +6202,6 @@
"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)
"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)
@@ -6670,7 +6678,6 @@
"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)
"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)
@@ -7042,8 +7049,6 @@
"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)
"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)
@@ -7162,7 +7167,6 @@
"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)
"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)
@@ -7215,9 +7219,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)
@@ -7278,8 +7279,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)
@@ -8175,7 +8174,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)
@@ -9454,7 +9452,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)
@@ -9630,7 +9627,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)
@@ -9795,18 +9791,18 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTuaRPaTvaTwaTwaSXaTxaTyaTzaTAaSvaSwaRfaahaahaahaahaahaahaahaahaahaSxaTBaTCaTDaTEaTFaTGaRTahyahyaTfaTfaQraTIaQraTfaTfaTfaTJaTKaTJaTfaTfahyahyaahaahaahaahahyahyahyahyahyahyahyahyahyaTfaTfaTfaTfaTfaahaahaahaahaTfatNaTLatNaTfaahaahaahahyahyahyavCavCaTMaTNaTMavCaToaToaTOaTPaTQaToaToaCjaTRaCjaCjaahaahaahaahahyahyahyahyahyahyahyahyahyaFpaDpaQVaDraQkaClaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaDtaTSaTTaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTuaRPaRPaRPaTUaTUaRPaRPaRPaRPaTVaRfaahaahaahaahaahaTWaTWaTWaTWaSxaTXaTYaTZaSxaRTaUaaRTaUbaUcaTfaUdaTkaTkaTkaUeaTfaUfaTkaUgaTkaUhaTfaUiaUjaTfaTfaTfaTfaTgaThaThaThaThaThaThaThaTiaTfaUkaUlaUmaTfaTfaTfaTfaTfaTfaUnaUoaUpaTfaTfaTfaTfaTfaUqaUraTfaUsaTkaTlaTkaUtaToaUuaUvaUvaUwaUxaToaUyaUzaUAaClaClaClaClaClaClaUBaUCaUCaUCaUCaUCaUCaUDaClaGIaUEaCnaCoaClaClcllcllcllcllcllcllaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaTWaDtaDtaUFaUGaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaRfaRfaRfaRfaUHaUHaRfaRfaRfaRfaRfaRfaUIaUIaUIaUIaUIaUIaUJaUKaULaSxaTcaUMaSxaSxawqaUOaUPaUNaUNaUQaTkaURaUSaUTaUTaUUaUVaUTaUWaUTaUTaUUaUTaUTaUTaUXaUYaUTaUZaUTaUTaUTaUTaUSaUTaUTaUTaUUaUTaVaaUSaUUaUTaUTaVbaVcaVdaUTaVeaTkaTJaTkaVfaTkaVgaTkaTkaVhaTkaTkaTlaTkaTkaViaVjaUvaUvaVkaVlaVmaVnaVoaVnaVpaVqaVraZQaVsaVtaVnaVnaVuaVvaVnaVnaVwaVxaVyaVnaVnaVzaVAaLIaUAcpZcmkcmlakuaktaktaDtaVCaYcaYdaYeaDtaDtaDtaDtaDtaDtaDtaDtaDtaVBaVCaFJaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaVDaVEaVFaVGaVHaVIaVJaVKaVLaVMaVNaVOaVPaVQaVKaVKaVRaVSaVTaVKaVUaVKaVPaVVaVWaVVaVRaVKaVXaVYaVZaIxaVYaVYaWbaWcaWdaWeaWdaWfaWbaWdaWdaWdaWgaWhaWdaWdaWiaWdaWdaWfaWcaWdaWdaWaaWbaWdaWjaWcaWbaWqaWdaWgaWdaWkaWhaWlaWdaWbaWdaWiaWdaWcaWdaWdaWmaWdaWfaWnaTkaTkaViaWoaWpbhcaWraWsaWtaWuaWvaWuaWwaWuaWuaWuaWuaWxaWyaWuaObaWuaWuaWuaWzaWAaWAaWAaWBaWCaWDaWDaWFakvakxakwakBakyakyakDaWGakIaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWGaWJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaWKaWLaWMaWNaWLaWOaWPaUNaWQaUNaWRaUNaWSaUNaWTaWUaWVaWWaWXaWYaWZaXaaXbaXcaXdaXeaXfaXgaXhaXiaXjaXkaXlaXmaXnaXmaXmaXmaXmaXoaXnaXmaXmaXpaXmaXqaXmaXmaXraXmaXmaXsaXtaXuaXmaXvaXnaXwaXxaXyaXzaXyaXyaXyaXAaXBaXCaXDaXEaXFaXGaXHaXmaXIaXtaXJaXKaTkaXLaTkaTkaTkaViaUvaXMaXNaXOaXPaXQaXRaXSaLIaLIaXTaLIaLIaXVaSfaXWaLIaLJaLIaXXaLIaXYaXZaXVaXUaYaaYbaLIaLIaUAcpZakLakKakPakMcomaDtaDtaDtaDtaDtaDtaDtaDtaVCaVCaDtaDtaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaRfaYfaYgaYhaYiaYjaRfaRfaRfaRfaYkaYlaYmaRfaUIaUIaUIaUIaUIaUIaUbaYnaYnaYnaUcaUIaUIaYhaTfaYoaYpaYqaYraYsaTfaYtaTkaTkaTkaYuaTfaTfaTfaTfaTfaTfaYvaYwaUgaYxaYvaTfaTfaTfaTfaTfaTfaYyaYzaYAaTfaUqaYBaUraTfaTfaUqaYBaUraTfaYCaYDaYEaTfaUqaYBaUraTfaTfaUqaYBaUraToaRjaYGaYHaUwaYIaToaClaYJaYKaYLaClaYJaYKaYLaClaClaClaYMaUAaClaClaClaClaClaClaUAaYNaUAaClaClcllakTakSakVakUakWdEoakYakXalaakZalcalbdEoaVCaVCaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaRfaRfaRfaRfaRfaRfaRfaahaahaRfaYOaYOaYOaRfaahaahaahaahaYPaYQaYRaYRaYRaYRaYRbewaYPahyaTfaTfaYTaYUaYVaTfaTfaTfaYWaYXaYYaTfaTfaahaahaahaahaahaYZaZaaZbaZcaYZaahaahaahaahaahaTfaZdaZeaZdaTfahyahyahyahyahyahyahyahyaZfaZgaZhaZiaZfahyahyahyahyahyahyahyahyaToaToaZjaZkaZlaToaToahyahyahyahyahyahyahyahyahyahyaClaYMaUAaClaahaahaahaahaZmaZmaZnaZmaZmaahcllclldEoalddEodEodEoakYalealgalfaloalbdEoaVCadfaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpaZqaZraZoaahaahaahaahaYPaZsaZtaZuaZvaZwaZxaYRaYPahyahyaZyaZzaZAaZBaZyahyaTfaUiaThaTiaTfaahaahaZCaZCaZCaZCaZDaZDaZEaZDaZDaZFaZFaZFaZFaahaZdaZGaZHaZdahyahyahyahyaZIaZJaZKaZLaZIaZIaZMaZNaZOaZIaZIaZJaZKaZLaZIahyahyahyahyaZPaYGaYHaUwbaAaZRaZRaZSaZTaZUaZRaZSaZTaZUaZRaZRaZRaZVaZRaZRaahaahaahaahaahaZmaZWaZXaZmaahaahdEoalpalsalralualtalxalwalzalyalyalAdEobIKaDtaTWaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZYaZZbaaaZoaahaahaahaahaYPbabbacbadbaebafbagbahaYPahyahybaibajbakbalbamahyahyahyahyahyaahaahaahaZCbanbaobapaZDbaqbarbasaZDbatbaubavaZFaahaZdaZGbaxaZdahyahyahybayaZLbKzaYFaTHbaCbKMbaEbaFbaGbaHbaIbawbazbhAaZJbaMahyahyahybaNaYGaYHaUwbdwbaLbaBbaPbaObaRbaQbaPbaSbaRbaTbaWbaVbcPbaXaZRaZRaahaahaahaahaZmbbbbbcaZmaahaahdEoalBalCalyalLalDalyalPalZalyambamadEobdOaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdaaaaaabbdaaaaaaaaabbdaaaaaaaaaaaaaaabbdaaaaaaaaabbdaaaaaabbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobbebbfdGNaZoaahaahaahaahaYPbbhbacbbibbjbbkbagbblaYPbbmbbnbbobbpbbqbbrbamahyahyahyaahaahaahaahaahaZCbbsbbtbbubbvbbwbbxbbybbzbbAbbBbbCaZFaahaZdaZdaZHaZdahyahybaybbDbbEbMcbfMbdCbdCdCqbbGbbHbbGbgHccSblCdCpbbLbbEbbMbaMahyahybbNbbObbPbbQbbRbbabaYbbTbbSbbTbbUbbWbbVbbWbcabcIbbXbbYbbZbcJaZRaahaahaahaahaZmaZWbcbaZmaahaahdEodEBamdamcamgameamAamhamCamBamDamadEobdOaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobccbcdbceaZoaahaahaahaahaYPbcfbcgbchbchbchbcibfvbcjbckbclbclbcmbcnbcobamahyahyaahaahaahaahaahaahaZCbcpbcqbcraZDbcsbctbcuaZDbcvbcwbcxaZFaahaahaZdaZHaZdahyaZIbcybbEbbFbfMdCqbbGbbGbczbcAbcBbcCbcDbbGbbGbgHdCrbbLbbEbcyaZIahyaTobcEbcFbcGbcHbcLbcKbcNbcMbcNbcQbdzbdybdzdCsbdDbcObaZdCtbdEaZRbcRbcRbcRbcRaZmbcSbcTaZmaahaahdEodEBamFamEamWamVanaamZdEodEodEodEodEobdOaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnbdobdpaZFaahaahaZdaZHaZdahybdqbaJbbFbfMdCqbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbgHdCrbdsbaKbdqahyaTobdubdvaUwbdwbaLbdFbfkbdGbLZbdIbWObNGbiVbYuaZRccRcsWdCucwuaZRbdJbdKbdLbcRbdMbdNbdOaZmaahaahaZmaZmaZmanbaZmaZmaZmaZmaZmaahaahaahaZmbdOaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPaRtbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbeibeUbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbfMdCqbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbgHdCvbiFbejahyaZPbesbetaUwaToaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRbkjbevbuJbcRbdMbdNbdOaZmaahaZmaZmbexbeyaZWantbdObezbeAaZmaZmaahaahaZmbdObIUaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahbegbegbdlbdlbehbeTbeUbeTbeSbdlbdlbegbegaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfaaFLbeZbfcbfdbfedGObfgbfhbfibfjbcRbkhbevbevbflbdMbdNbfmaZmaZmaZmbfnbfobfodGGbfobfobfobfobfpaZmaZmaZmaZmbdObdObLAaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfucxEbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahbegbegbdlbfGbeTbfHbfIbfJbeTbfKbdlbegbegaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbjlbfPbfQbbGbbGdCAbfSaZIahybbNaYGbetaUwaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMbgibfobfobfobfobgjbgkbgkbgkbgkbgkbgkbgkbglbfobfobfobfobfobfpbdOaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaVDaVEaVFaVGaVHaVIaVJaVKaVLaVMaVNaVOaVPaVQaVKaVKaVRaVSaVTaVKaVUaVKaVPaVVaVWaVVaVRaVKaVXaVYaVZaIxaVYaVYaWbaWcaWdaWeaWdaWfaWbaWdaWdaWdaWgaWhaWdaWdaWiaWdaWdaWfaWcaWdaWdaWaaWbaWdaWjaWcaWbaWqaWdaWgaWdaWkaWhaWlaWdaWbaWdaWiaWdaWcaWdaWdaWmaWdaWfaWnaTkaTkaViaWoaWpbhcaWraWsaWtaWuaWvaWuaWwaWuaWuaWuaWuaWxaWyaWuaObaWuaWuaWuaWzaWAaWAaWAaWBakvaWuaWuakxakwakyakyakLakBakMakDaWGakIaWGaWGaWGaWGaWGakSaWGaWGaWGaWGaWGaWGaWGaWJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaWKaWLaWMaWNaWLaWOaWPaUNaWQaUNaWRaUNaWSaUNaWTaWUaWVaWWaWXaWYaWZaXaaXbaXcaXdaXeaXfaXgaXhaXiaXjaXkaXlaXmaXnaXmaXmaXmaXmaXoaXnaXmaXmaXpaXmaXqaXmaXmaXraXmaXmaXsaXtaXuaXmaXvaXnaXwaXxaXyaXzaXyaXyaXyaXAaXBaXCaXDaXEaXFaXGaXHaXmaXIaXtaXJaXKaTkaXLaTkaTkaTkaViaUvaXMaXNaXOaXPaXQaXRaXSaLIaLIaXTaLIaLIaXVaSfaXWaLIaLJaLIaXXaLIaXYaXZaXVaXUaYaaLIaLIaLIaUAcpZakTakKakPakUcomaDtaDtaDtaDtaDtaDtaDtaDtaFJaVCaDtaDtaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaRfaYfaYgaYhaYiaYjaRfaRfaRfaRfaYkaYlaYmaRfaUIaUIaUIaUIaUIaUIaUbaYnaYnaYnaUcaUIaUIaYhaTfaYoaYpaYqaYraYsaTfaYtaTkaTkaTkaYuaTfaTfaTfaTfaTfaTfaYvaYwaUgaYxaYvaTfaTfaTfaTfaTfaTfaYyaYzaYAaTfaUqaYBaUraTfaTfaUqaYBaUraTfaYCaYDaYEaTfaUqaYBaUraTfaTfaUqaYBaUraToaRjaYGaYHaUwaYIaToaClaYJaYKaYLaClaYJaYKaYLaClaClaClaYMaUAaClaClaClaClaClaClaUAaUAaUAaClaClcllaldakValCalsakWdEoakYakXalaakZalcalbdEoaFJaVCaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaRfaRfaRfaRfaRfaRfaRfaahaahaRfaYOaYOaYOaRfaahaahaahaahaYPaYQaYRaYRaYRaYRaYRbewaYPahyaTfaTfaYTaYUaYVaTfaTfaTfaYWaYXaYYaTfaTfaahaahaahaahaahaYZaZaaZbaZcaYZaahaahaahaahaahaTfaZdaZeaZdaTfahyahyahyahyahyahyahyahyaZfaZgaZhaZiaZfahyahyahyahyahyahyahyahyaToaToaZjaZkaZlaToaToahyahyahyahyahyahyahyahyahyahyaClaYMaUAaClaahaahaahaahaZmaZmaZnaZmaZmaahcllclldEoamddEodEodEoakYalealgalfaloalbdEoaFJadfaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpaZqaZraZoaahaahaahaahaYPaZsaZtaZuaZvaZwaZxaYRaYPahyahyaZyaZzaZAaZBaZyahyaTfaUiaThaTiaTfaahaahaZCaZCaZCaZCaZDaZDaZEaZDaZDaZFaZFaZFaZFaahaZdaZGaZHaZdahyahyahyahyaZIaZJaZKaZLaZIaZIaZMaZNaZOaZIaZIaZJaZKaZLaZIahyahyahyahyaZPaYGaYHaUwbaAaZRaZRaZSaZTaZUaZRaZSaZTaZUaZRaZRaZRaZVaZRaZRaahaahaahaahaahaZmbdOaZXaZmaahaahdEoalpamEalralualtalxalwalzalyalyalAdEoamFaDtaTWaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZYaZZbaaaZoaahaahaahaahaYPbabbacbadbaebafbagbahaYPahyahybaibajbakbalbamahyahyahyahyahyaahaahaahaZCbanbaobapaZDbaqbarbasaZDbatbaubavaZFaahaZdaZGbaxaZdahyahyahybayaZLbKzaYFaTHbaCbKMbaEbaFbaGbaHbaIbawbazbhAaZJbaMahyahyahybaNaYGaYHaUwbdwbaLbaBbaPbaObaRbaQbaPbaSbaRbaTbaWbaVbcPbaXaZRaZRaahaahaahaahaZmanbbbcaZmaahaahdEoalBaWCalyalLalDalyalPalZalyambamadEoaZWaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdaaaaaabbdaaaaaaaaabbdaaaaaaaaaaaaaaabbdaaaaaaaaabbdaaaaaabbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobbebbfdGNaZoaahaahaahaahaYPbbhbacbbibbjbbkbagbblaYPbbmbbnbbobbpbbqbbrbamahyahyahyaahaahaahaahaahaZCbbsbbtbbubbvbbwbbxbbybbzbbAbbBbbCaZFaahaZdaZdaZHaZdahyahybaybbDbbEbMcbfMbdCbdCdCqbbGbbHbbGbgHccSblCdCpbbLbbEbbMbaMahyahybbNbbObbPbbQbbRbbabaYbbTbbSbbTbbUbbWbbVbbWbcabcIbbXbbYbbZbcJaZRaahaahaahaahaZmbdObcbaZmaahaahdEodEBaWDamcamgameamAamhamCamBamDamadEoaZWaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobccbcdbceaZoaahaahaahaahaYPbcfbcgbchbchbchbcibfvbcjbckbclbclbcmbcnbcobamahyahyaahaahaahaahaahaahaZCbcpbcqbcraZDbcsbctbcuaZDbcvbcwbcxaZFaahaahaZdaZHaZdahyaZIbcybbEbbFbfMdCqbbGbbGbczbcAbcBbcCbcDbbGbbGbgHdCrbbLbbEbcyaZIahyaTobcEbcFbcGbcHbcLbcKbcNbcMbcNbcQbdzbdybdzdCsbdDbcObaZdCtbdEaZRbcRbcRbcRbcRaZmaWFbcTaZmaahaahdEodEBaYbalyamWamVanaamZdEodEodEodEodEoaZWaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnbdobdpaZFaahaahaZdaZHaZdahybdqbaJbbFbfMdCqbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbgHdCrbdsbaKbdqahyaTobdubdvaUwbdwbaLbdFbfkbdGbLZbdIbWObNGbiVbYuaZRccRcsWdCucwuaZRbdJbdKbdLbcRbdMaYNbdOaZmaahaahaZmaZmaZmbcSaZmaZmaZmaZmaZmaahaahaahaZmaZWaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPaRtbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbeibeUbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbfMdCqbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbgHdCvbiFbejahyaZPbesbetaUwaToaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRbkjbevbuJbcRbdMaYNbdOaZmaahaZmaZmbexbeybdOantbdObezbeAaZmaZmaahaahaZmaZWbIUaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahbegbegbdlbdlbehbeTbeUbeTbeSbdlbdlbegbegaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfaaFLbeZbfcbfdbfedGObfgbfhbfibfjbcRbkhbevbevbflbdMaYNbfmaZmaZmaZmbdObdObdObdObdObdObdObdObdOaZmaZmaZmaZmaZWbdObdNaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfucxEbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahbegbegbdlbfGbeTbfHbfIbfJbeTbfKbdlbegbegaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbjlbfPbfQbbGbbGdCAbfSaZIahybbNaYGbetaUwaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMbdObdObdObdObdObdObgkbgkbgkbgkbgkbgkbgkbdObdObdObdObdObglbfpbdOaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbgnbfrbgobdPbgpbgqbgrbdTaahaahaahaahahyahyahyahyahyahyahyahyahyahybbobbobgsbcnbgtbeebefbgubgvbgwbgxbefaahaahbegbegbdlbgybeTbeibgzbeibeTbgAbdlbegbegaahaZdaZdaZHaZdahyaZIbgBdCBbfRbbGbgCbbGbbGdCCbgDbgEbgFdCDbbGbbGbgCbbGbgGbgHdCEaZIaZfaTobgIbgJbgKaToaToaahbeZbgLbgMbgNbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgYbgYbgYbgYbgYbgYbgZbgZbgZbgZbgZbgkbhabhbbmzbhdbhebgkbhfbhfbhfbhfbhfbhfbglbfpaZmaahaahaahaahaahbgmbgmbhgbhhbhibhhbhjbgmbgmaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbhkbhlbhkbdPbhmbfubhnbhobhobhobhoaahaahaahahyahyahyahyahyahyahyahyaZycrkbajbhqbhrbhsbefbhtbgvbgwbhubefaahaahbegbegbdlbhvbhybhxblrbhwbeTbhvbdlbegbegaahaZdaZGaZHaZdahybdqbaUdCFbbGbbGbbGbbGdCGbgDbhAbhAbhAbgFdCFbbGbbGbbGbhBbbGbhCbhDbhEbhFbhGbetaUwbhHaToaahbeZbhIbhJbgNbhKbhLbhLbhLbhLbhMbhNbgVbhObhPbgYbhQbhRbhSbhTbgYbhUbhVbhVbhWbgZbhXbhYbhYbhZbhZbhYbiabhfbibbicbidbiebhfbdOaZWaZmaahaahaahaahaahbgmbifbigbihbiibijbikbifbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahbilbilbilbilbilbilbilbilbilbimbinbiobipbeEbfubinbhobiqbirbhobhobhoaahaahahyahyahyahyahyahyahybambisaZzbitbiubdebivbiwbixbgwbhubefaahaahbegbegbdlbiyblsbizbiAbiBbltbiCbdlbegbegaahaZdbiDaZHaZdahybejbdrdCFbbGbbGbbGbbGdCGbiFbhAbdtbhAbiHdCFbbGbbGbbGbiIbiJbiJbiKbiLbiMbiNbiObiPbiQaToaahbeZbfTbiRbiSbeZbiTbiUblObiWbxjbfhbzjbhObiYbgYbiZbjabjbbjcbgYbSjbjebjfbjgbgZbjhbjibjjbjkbpybjmbjnbhfbibbjobjpbjqbhfbjrbjsaZmaahaahaahaahaahbgmbjtbjubjvbjwbjvbjubjxbgmaahaahbgmbgmbgmbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -9853,27 +9849,27 @@ 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
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacHHcGCcGDcGEcGEcGFcGGcGGcGGcGGcGHcGIcGIcGJcGKcGLcCtbkQbkQahyahyahybkQbkQaahaahaahcxrcIdcIecxrcxraahaahcBIcFgcGPcFFcBIcGRcHRcCGcCGcwdcGTcCIcGUcGVcGWcGWcGWcGXcGXcGXcGXcGYcCKahyahycwhczRcwhaahaahaahaahaahcxzcGZczecABcHaczVcCPcCQcHbcHSczecGkcxzaahaahaahaahaahaahaahczicAbczicziaahcBacHdcHedmEcHgcHfcHccHicHjcHkcHlcHmcHncHocHmcHpcHmaahcBgcBgcHqcGxcGxdnjcOUdBScFVcMfcrQcrQcMgcMhdhfcHwcGzdBVdDhdDgdDjdDidDkcQGaahaahaahaahaahaahaahaahaahaahcHycHzcKTazzcHycHCcHDcHEazAcKWcIzcHEaahaahaahaahaahaahaahcHIcHJcLgazBcHIcHMcLhcHOazCcHQcJtcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacJwcGCcDXcHTcDXcHUcHVcxgcxgcHWcCtcHXcGKcHYcHZcIacCtbkQcIbcIccIccIccIcbkQaahcJecJecJgbgicJgcJgaahaahaahcBIcBQcIfcGOcBIcIhcIicIjcIkcwdcIlcImcIncCKcGecIocGecEwcGecEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcIpczecIqcAVcIrcIscItcAWcIuczecGkcxzaahaahaahaahaahaahaahczicAbcziaahaahcBacIvcIwcHhcFXcIycKDcrOcrPcIAcDicHmcIBcICcIDcIEcHmaahaahcBgcHqcBgcOTdDlcNKcNTcNLcNNctzcNOcNPcNQdDmcNScNTdDncQGdDodDqdDpdDrcQGaahaahaahaahaahaahcHycHycHycHycHycIIcMpdHhcHyczpcuAcHEcMqcIMcINcHEcHEcHEcHEcHEcHIcHIcHIcHIcIOcMrdHicHIcuLcBvcHOcMtcIScITcHOcHOcHOcHOcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadcvMcvMcvMcvMcvMaadaadaadcuScuScuScuScuScuScuScIUcIVcIWcIXcIYcIZddOcJbcCtcCtahycIccJccJdcJccIcahyahycJebPGbNIbQCbQAcJeaahaahaahcBIcBQcJhcJicJjcJkcJlcJmcJmcwdcJncJocJpcCKcJqcGecEwcEwcEwcEwcJrcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcJsczecMLcJuczVcJvczXczYcNgczeczecxzaahaahaahaahaahaahaahczicAbcziaahaahcBacJxcJycIxcGScJAcJBcJCcJDcJEcJFcHmcJGcJHcJIcJJcHmaahaahcBgcGycBgcBgcBgcrQdFdcsYcOWdHjcrQcHtdDscOYdDtcsYdDucQGdDvcQGdDwcQGcQGaahaahaahaahaahaahcHycJOcJPcJQcHycHycMucHycHycJScvAcHEcMvcJTcHEcHEcJUcJVcJWcHEcJXcJYcJZcHIcHIcMwcHIcHIcvHcMxcHOcHOcKccHOcHOcKdcKecKfcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaadbkQaahaahaahaahaahcuScuScuScuScCtcCtcCtcCtcCtcCtaahahycIccJccJccJccIcahyahycJebRFbRhcaBbWGcJecKjcKjcKjcBIcBIcKkcKlcBIazDcKncKocKpcKqcKrcKscKtcKqcKucGedeccKvcEwcKwcKwcKwcCKahyahycwhczRcwhaahaahaahaahaahcxzcKxczecHScKyczecKzczgcKAcHScKBcKBcxzaahaahaahaahaahaahaahczicAbcziaahcKCcKCcNYcKEcKFcKCcKCcKCcKGcKHcKIcKCcKCcKCcKCcKCcKCcKCcKCaahcBgcHqcBgaahaahcrQcrQcQAcQBcQCcrQcQDcQEdDydDxcsYcsYcQGdDzcQGdDAcQGaahaahaahaahaahaahaahcHycKOcKPcKQcKRcKQcMzcMycKUcDAcwIcKVcMBcMAcKYcKZcKYcLacLbcHEcLccLdcLecLfcLecMCcMDcLicwWcHNcLjcLkcLlcLmcLncLmcLocLpcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccLqcLrcLscIcahyaahcJecdHccecghdEXcJecLwcLxcLycLzcBIcLAcBIcCGcCGcLBcCGcLCcKqcLDcLEcLFcKqcLGcLGcLGcLGcLGcLGcLGcLGahyahyahycwhczRcwhcziaahaahaahaahcxzcxzcxzcxzcLHcLIcLJcLKcLLcxzcxzcxzcxzaahaahaahaahaahaahcziczicAbczicKCcKCcLMcLNcLOawvcLQcLRcLScLTcLUcLVcLWcLXcLYcLZcMacMbcMccKCcKCcBgcHqcBgahyaahaahcrQcrQcrQcrQcrQcrQcrQcrQcrQdDCdDBcQGcQGcQGcQGcQGaahaahaahaahaahaahaahcHycMidEYcMkcMlcMmcMndBWcHycyccydcHEdBYdBXdCadBZdCcdEZdCedCddCgdFadCidChdCkdCjdClcHIcyscAxdCodCncMEcMFcMGcMHdFbcMJcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQcIccMKcNZcMMcIcbkQcMNcMNcMNcMNcMPcMOcKjcMQcMRcMScMTcMUcMVcMWdDDcoucMZcNacMUcNbcNccNdcNecrVcOpcNhcNicNjcTfcLGcNlcLGcLGahyahycwhcNmcNncziczicziczicziczicNocNpcxzcNqcxzcNrcxzcNqcxzcEDcEDcziczicziczicziczicziczicUqcXxcUucKCcNucLPcLPcNvcNwcNwcNxcNycNzcNAcNBcNCcNDcNEcNEcNEcNFcLPcNGcKCcZgdDEcBgahyahyaahaahaahaahaahaahaahaahcWudDFdbMdbMdDGcWuaahaahaahaahaahaahaahaahaahaahcHycHycHycHycHycHycHycHycHyczpcuAcHEcHEcHEcHEcHEcHEcHEcHEcHEcHIcHIcHIcHIcHIcHIcHIcHIcuLcBvcHOcHOcHOcHOcHOcHOcHOcHOcHOaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQbkQcOsahycOMbkQbkQcMNcOacObcOccOdcOecOfcOgcOhcOicMTcOjcOkcOlcOlcOmcOncOocPFcOqcNccNdcNecOrcPPcOtcOtcyzdDHcOvcOtcOwcLGahyahycwhcOxcOycOzcOAcOBcOCcOCcOCcOCcOAcOAcOAcODcOEcOFcOAcOCcOCcOGcOCcOCcOCcOCcOCcOCcOCcOCdlDdBIdBHcKCcOKcLPcLPcOLcLPcLPcPYcONcOOcOPcOQcONcPYcLPcLPcLPcORcLPcLPcKCdBJcHqcBgahyahyahyaahaahaahaahaahaahaahcWudDIdbMdbMdDJcWuaahaahaahaahaahaahaahaahaahaahcPdcPecPfcPgcPhaGYcPjcPkcPdcPlcPmcPncuscPpcPpcPqcPpcutcPrcPscPpcPtcPpcPucPpcPpcvkcPncPwbfocPxcPycPzcPAaEycPCcPDcPEcPxaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahycQscPGcPGcPHcPGcPIcPJcPKcMNcPLcPMcPMcPNcPOcRfcPQcPRcPScMTcPTcPUcOocPVcPWcOocPXcRucPZcNccQacQbcQcdcEdDKdDMdDLdDNcQicQjcQkcLGahyahycwhcQlczQczicziczicziczicziczicziczicEDcEDcEEcNscEDczicziczicziczicziczicziczicziczicQmcEDdBKcKCcQocQocLPcQpcQqcQrcRJcQtcOOcQucQvcQwcRJcQxcQocLPcQycQqcQocKCdCRcHqcBgahyahyahyahyaahaahaahaahaahaahcWucWudDPbsUcWucWuaahaahaahaahaahaahaahaahaahaahcPdcQJcQKcQKcQLcQKcQKcQMcQNcQOcQPcQQcQRcQRcQRcQScQRcQTcQUcQVcQWcQXcQRcQYcQRcQRcQRcQQcQZarAcRbcRccRccRccRdcRccRccRecPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjbLjaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahycSAcRgcRhcRicRjcRkcRlcRmcRncRocRpcRqcRrcRscRtcSLcRvcRwcRxcMTcRycPUcRzcRAcRBcRCcOlcRDcREcRFcRGcRHcRIcTadDQcRKcRLcRMcRNcROcRPcLGahyahycwhcRQcwhcziahyahyahyahyahyahyahycziczicziczicziczicziaahaahaahaahaahaahaahaahaahcziczicRRdCScKCcRTcRWcRVcLPcRWcRXcRJcRYcOOcOPcOQcRZcRJcRTcRWcLPcRVcRWcSacKCdCTcSccBgahyahyahyahyahyaahaahaahaahaahahydDRdbMdDUdDRahyaahaahaahaahaahcXGcXGcXGcXGaahcPdcSdcSecSfcSgcShcSicSjcSjcSkcSlcSmcSlcSlcSlcSncSlcSlcSlcSocSpcSqcSqcSrcSqcSqcSqcSscStarBcSucSucSvcSwcSxcSycSyarCcPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahbLjbLjaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQcTZcSBcSCcPMcSDcPMcSEcSFcSGcSHcPMcPMcSIcSJcSKcUlcSMcSNcSOcMTcSPcSQcSRcSScSTcSUcSVcSWcSXcSYcSZcNecRIcUscTbcOtcTccOtcTearDcTgcLGahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahczicThcRScKCcTicTjcTkcLPcTlcTjcRJcTmcTncTocOQcTmcRJcTjcTjcTpcLPcTlcTqcKCcSbcTrcBgahyahyahyahyahyahyahyahyahyahyahydDTdbMdDUdDTahyahyahyaahaahcXGcXGasfasecXGaahcPdcPdcTscTtcTucTvcTwcTxcPdcPncPncPncTycTzcTzcTAcTBcTCcTDcTEcTFcTGdCUcTHcTzcTzasgcPncTDashcPxcTJcTKasicTMcTNcTOcPxcPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/maps/polaris-2.dmm b/maps/polaris-2.dmm
index a9f68d2953e..4f41567e0d0 100644
--- a/maps/polaris-2.dmm
+++ b/maps/polaris-2.dmm
@@ -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)
diff --git a/maps/polaris-5.dmm b/maps/polaris-5.dmm
index c4ad365ec22..5871c0d1c77 100644
--- a/maps/polaris-5.dmm
+++ b/maps/polaris-5.dmm
@@ -877,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)
@@ -895,7 +895,7 @@
"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)
@@ -915,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)
diff --git a/maps/virgo-5.dmm b/maps/virgo-5.dmm
index ab8100448fa..f95e2c974ed 100644
--- a/maps/virgo-5.dmm
+++ b/maps/virgo-5.dmm
@@ -906,7 +906,7 @@
"rv" = (/obj/item/weapon/stool/padded,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/analysis)
"rw" = (/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)
"rx" = (/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)
-"ry" = (/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)
+"ry" = (/obj/structure/table/glass,/obj/item/weapon/storage/box/beakers,/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)
"rz" = (/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)
"rA" = (/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly)
"rB" = (/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)
@@ -925,7 +925,7 @@
"rO" = (/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)
"rP" = (/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)
"rQ" = (/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)
-"rR" = (/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)
+"rR" = (/obj/item/weapon/reagent_containers/glass/beaker,/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)
"rS" = (/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)
"rT" = (/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)
"rU" = (/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)
@@ -945,8 +945,8 @@
"si" = (/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)
"sj" = (/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)
"sk" = (/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)
-"sl" = (/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)
-"sm" = (/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)
+"sl" = (/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)
+"sm" = (/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)
"sn" = (/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)
"so" = (/obj/machinery/light/small,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
"sp" = (/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)
@@ -1591,7 +1591,7 @@
"EE" = (/obj/machinery/light/small{dir = 4},/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored)
"EF" = (/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/libertycap,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored)
"EG" = (/turf/space,/area/skipjack_station/mining)
-
+
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -1849,4 +1849,3 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
-
diff --git a/vorestation.dme b/vorestation.dme
index c2ba1cbb4c6..a31ecf02685 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -23,7 +23,6 @@
#include "code\__defines\appearance.dm"
#include "code\__defines\atmos.dm"
#include "code\__defines\belly_modes_vr.dm"
-#include "code\__defines\btime.dm"
#include "code\__defines\chemistry.dm"
#include "code\__defines\chemistry_vr.dm"
#include "code\__defines\damage_organs.dm"
@@ -42,6 +41,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"
@@ -159,7 +159,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"
@@ -1784,6 +1783,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"
@@ -1967,65 +1967,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\misc_vr.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\artifact_unknown_vr.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_eguns_vr.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\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\research\xenoarchaeology\tools\tools_pickaxe_vr.dm"
#include "code\modules\scripting\Errors.dm"
#include "code\modules\scripting\IDE.dm"
#include "code\modules\scripting\Options.dm"
@@ -2155,6 +2096,62 @@
#include "code\modules\vore\resizing\resize_vr.dm"
#include "code\modules\vore\resizing\sizegun_vr.dm"
#include "code\modules\vore\weight\fitness_machines_vr.dm"
+#include "code\modules\xenoarcheaology\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\misc_vr.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\artifact_vr.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\eguns_vr.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\xenoarcheaology\tools\tools_pickaxe_vr.dm"
#include "code\modules\xenobio2\_xeno_setup.dm"
#include "code\modules\xenobio2\_xeno_setup_vr.dm"
#include "code\modules\xenobio2\controller.dm"