diff --git a/btime.dll b/btime.dll
deleted file mode 100644
index af6c82a998..0000000000
Binary files a/btime.dll and /dev/null differ
diff --git a/btime.so b/btime.so
deleted file mode 100644
index edb3cc3113..0000000000
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 d4cefc3524..0000000000
--- 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 cc77b8c3c5..8c999f6d96 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 198f87eccc..da1c2aebd1 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 76449b9a4b..d9c8f106ef 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 143c7aa251..c1aaed9e42 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 0000000000..b6af0d0681
--- /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 d4e6710b35..30df4693db 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 19e2206cd0..991d64e20b 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 1aa2c8efb8..0000000000
--- 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 b7767c367f..836d2124bd 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 bde79fba07..dc412ee92a 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 0a4f111355..0000000000
--- 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 08d448348f..ceed8025c7 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 d14ddea133..22f538a9a1 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 9bf83d2d6d..cbfb17adf0 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 dbbae8a5e1..7cf17b5640 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 23bd46243e..0275f70b28 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 72dfd6ec5c..3953caa525 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 22f36c106b..df162f74ca 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 de65d9f0be..7838ba3dd3 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 de868328b3..835185fdcd 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 480c69d27f..7b0379cbc2 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 5f268bba16..3bf4299cd2 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/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm
index 891ca926de..c253d44199 100644
--- a/code/game/gamemodes/technomancer/catalog.dm
+++ b/code/game/gamemodes/technomancer/catalog.dm
@@ -1,8 +1,13 @@
+#define ALL_SPELLS "All"
+#define OFFENSIVE_SPELLS "Offensive"
+#define DEFENSIVE_SPELLS "Defensive"
+#define UTILITY_SPELLS "Utility"
+#define SUPPORT_SPELLS "Support"
+
var/list/all_technomancer_spells = typesof(/datum/technomancer/spell) - /datum/technomancer/spell
var/list/all_technomancer_equipment = typesof(/datum/technomancer/equipment) - /datum/technomancer/equipment
var/list/all_technomancer_consumables = typesof(/datum/technomancer/consumable) - /datum/technomancer/consumable
var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) - /datum/technomancer/assistance
-var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datum/technomancer/presets
/datum/technomancer
var/name = "technomancer thing"
@@ -13,6 +18,9 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
var/obj_path = null
var/ability_icon_state = null
+/datum/technomancer/spell
+ var/category = ALL_SPELLS
+
/obj/item/weapon/technomancer_catalog
name = "catalog"
desc = "A \"book\" featuring a holographic display, metal cover, and miniaturized teleportation device, allowing the user to \
@@ -27,8 +35,8 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
var/list/equipment_instances = list()
var/list/consumable_instances = list()
var/list/assistance_instances = list()
- var/list/preset_instances = list()
var/tab = 0
+ var/spell_tab = ALL_SPELLS
var/show_scepter_text = 0
/obj/item/weapon/technomancer_catalog/apprentice
@@ -72,15 +80,23 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
if(!assistance_instances.len)
for(var/A in all_technomancer_assistance)
assistance_instances += new A()
- if(!preset_instances.len)
- for(var/P in all_technomancer_presets)
- preset_instances += new P()
/obj/item/weapon/technomancer_catalog/apprentice/set_up()
..()
for(var/datum/technomancer/assistance/apprentice/A in assistance_instances)
assistance_instances.Remove(A)
+// Proc: show_categories()
+// Parameters: 1 (category - the category link to display)
+// Description: Shows an href link to go to a spell subcategory if the category is not already selected, otherwise is bold, to reduce
+// code duplicating.
+/obj/item/weapon/technomancer_catalog/proc/show_categories(var/category)
+ if(category)
+ if(spell_tab != category)
+ return "[category]"
+ else
+ return "[category]"
+
// Proc: attack_self()
// Parameters: 1 (user - the mob clicking on the catelog)
// Description: Shows an HTML window, to buy equipment and spells, if the user is the legitimate owner. Otherwise it cannot be used.
@@ -100,13 +116,17 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance | "
- dat += "Presets
"
+ dat += "Assistance
"
dat += "You currently have a budget of [budget]/[max_budget].
"
dat += "Refund Functions
"
- for(var/datum/technomancer/spell in spell_instances)
+
+ dat += "[show_categories(ALL_SPELLS)] | [show_categories(OFFENSIVE_SPELLS)] | [show_categories(DEFENSIVE_SPELLS)] | \
+ [show_categories(UTILITY_SPELLS)] | [show_categories(SUPPORT_SPELLS)]
"
+ for(var/datum/technomancer/spell/spell in spell_instances)
if(spell.hidden)
continue
+ if(spell_tab != ALL_SPELLS && spell.category != spell_tab)
+ continue
dat += "[spell.name]
"
dat += "[spell.desc]
"
if(show_scepter_text)
@@ -123,8 +143,7 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance | "
- dat += "Presets
"
+ dat += "Assistance
"
dat += "You currently have a budget of [budget]/[max_budget].
"
for(var/datum/technomancer/equipment/E in equipment_instances)
dat += "[E.name]
"
@@ -141,8 +160,7 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance | "
- dat += "Presets
"
+ dat += "Assistance
"
dat += "You currently have a budget of [budget]/[max_budget].
"
for(var/datum/technomancer/consumable/C in consumable_instances)
dat += "[C.name]
"
@@ -159,8 +177,7 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
dat += "Functions | "
dat += "Equipment | "
dat += "Consumables | "
- dat += "Assistance | "
- dat += "Presets
"
+ dat += "Assistance
"
dat += "You currently have a budget of [budget]/[max_budget].
"
for(var/datum/technomancer/assistance/A in assistance_instances)
dat += "[A.name]
"
@@ -171,24 +188,6 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
dat += "Cannot afford!
"
user << browse(dat, "window=radio")
onclose(user, "radio")
- if(4) //Presets
- var/dat = ""
- user.set_machine(src)
- dat += "Functions | "
- dat += "Equipment | "
- dat += "Consumables | "
- dat += "Assistance | "
- dat += "Presets
"
- dat += "You currently have a budget of [budget]/[max_budget].
"
- for(var/datum/technomancer/presets/P in preset_instances)
- dat += "[P.name]
"
- dat += "[P.desc]
"
- if(P.cost <= budget)
- dat += "Purchase ([P.cost])
"
- else
- dat += "Cannot afford!
"
- user << browse(dat, "window=radio")
- onclose(user, "radio")
// Proc: Topic()
// Parameters: 2 (href - don't know, href_list - the choice that the person using the interface above clicked on.)
@@ -210,6 +209,8 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
H.set_machine(src)
if(href_list["tab_choice"])
tab = text2num(href_list["tab_choice"])
+ if(href_list["spell_category"])
+ spell_tab = href_list["spell_category"]
if(href_list["spell_choice"])
var/datum/technomancer/new_spell = null
//Locate the spell.
@@ -269,4 +270,4 @@ var/list/all_technomancer_presets = typesof(/datum/technomancer/presets) - /datu
budget += spell_datum.cost
core.remove_spell(spell)
break
- attack_self(H)
\ No newline at end of file
+ attack_self(H)
diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm
index 5d5432fa4e..6be83aef7b 100644
--- a/code/game/gamemodes/technomancer/instability.dm
+++ b/code/game/gamemodes/technomancer/instability.dm
@@ -212,4 +212,4 @@
outgoing_instability = outgoing_instability * armor_factor
H.adjust_instability(outgoing_instability)
- set_light(distance, distance, l_color = "#C26DDE")
+ set_light(distance, distance * 2, l_color = "#C26DDE")
diff --git a/code/game/gamemodes/technomancer/spells/abjuration.dm b/code/game/gamemodes/technomancer/spells/abjuration.dm
index 6e4f7d73b3..2422ef00bf 100644
--- a/code/game/gamemodes/technomancer/spells/abjuration.dm
+++ b/code/game/gamemodes/technomancer/spells/abjuration.dm
@@ -4,6 +4,7 @@
far away from the caster. Failing that, it may inhibit those entities in some form."
cost = 40
obj_path = /obj/item/weapon/spell/abjuration
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/abjuration
name = "abjuration"
diff --git a/code/game/gamemodes/technomancer/spells/apportation.dm b/code/game/gamemodes/technomancer/spells/apportation.dm
index ad4fcdc9ef..150559b9cd 100644
--- a/code/game/gamemodes/technomancer/spells/apportation.dm
+++ b/code/game/gamemodes/technomancer/spells/apportation.dm
@@ -4,6 +4,7 @@
will grab them automatically."
cost = 50
obj_path = /obj/item/weapon/spell/apportation
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/apportation
name = "apportation"
diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm
index 38b55c1342..06930828af 100644
--- a/code/game/gamemodes/technomancer/spells/audible_deception.dm
+++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm
@@ -6,6 +6,7 @@
cost = 150
obj_path = /obj/item/weapon/spell/audible_deception
ability_icon_state = "tech_audibledeception"
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/audible_deception
name = "audible deception"
diff --git a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm
index a1c0940f14..52cbdfbfdf 100644
--- a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm
@@ -4,6 +4,7 @@
cost = 150
obj_path = /obj/item/weapon/spell/aura/biomed
ability_icon_state = "tech_biomedaura"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/aura/biomed
name = "restoration aura"
diff --git a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm
index 83ab173762..0c28f31577 100644
--- a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm
@@ -7,6 +7,7 @@
cost = 150
obj_path = /obj/item/weapon/spell/aura/fire
ability_icon_state = "tech_fireaura"
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/aura/fire
name = "Fire Storm"
@@ -20,7 +21,6 @@
qdel(src)
var/list/nearby_things = range(4,owner)
- var/fire_prob = 10
var/temp_change = 25
var/temp_cap = 500
var/fire_power = 2
@@ -28,7 +28,6 @@
if(check_for_scepter())
temp_change = 50
temp_cap = 700
- fire_prob = 25
fire_power = 4
for(var/mob/living/carbon/human/H in nearby_things)
if(is_ally(H))
@@ -41,16 +40,11 @@
turf_check:
for(var/turf/simulated/T in nearby_things)
- if(prob(fire_prob))
+ if(prob(30))
for(var/mob/living/carbon/human/H in T)
if(is_ally(H))
continue turf_check
T.hotspot_expose(1000, 50, 1)
T.create_fire(fire_power)
-
-// //We use hotspot_expose() to allow firesuits to protect from this aura.
-// var/turf/location = get_turf(H)
-// location.hotspot_expose(1000, 50, 1)
-
owner.adjust_instability(1)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm
index 44bd8feea0..d5dd78b793 100644
--- a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm
@@ -6,6 +6,7 @@
cost = 150
obj_path = /obj/item/weapon/spell/aura/frost
ability_icon_state = "tech_frostaura"
+ category = DEFENSIVE_SPELLS // Scepter-less frost aura is nonlethal.
/obj/item/weapon/spell/aura/frost
name = "chilling aura"
@@ -35,8 +36,4 @@
var/cold_factor = abs(protection - 1)
H.bodytemperature = max( (H.bodytemperature - temp_change) * cold_factor, temp_cap)
-// //We use hotspot_expose() to allow firesuits to protect from this aura.
-// var/turf/location = get_turf(H)
-// location.hotspot_expose(1, 50, 1)
-
owner.adjust_instability(1)
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm
index a270ef16e3..a9e50b2fa3 100644
--- a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm
@@ -4,6 +4,7 @@
cost = 150
obj_path = /obj/item/weapon/spell/aura/shock
ability_icon_state = "tech_shockaura"
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/aura/shock
name = "electric aura"
diff --git a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm
index 6307d2f4ca..15aae46ad3 100644
--- a/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aura/unstable_aura.dm
@@ -5,6 +5,7 @@
cost = 150
obj_path = /obj/item/weapon/spell/aura/unstable
ability_icon_state = "tech_unstableaura"
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/aura/unstable
name = "degen aura"
diff --git a/code/game/gamemodes/technomancer/spells/blink.dm b/code/game/gamemodes/technomancer/spells/blink.dm
index 43ca683fd5..9dae12e39e 100644
--- a/code/game/gamemodes/technomancer/spells/blink.dm
+++ b/code/game/gamemodes/technomancer/spells/blink.dm
@@ -5,6 +5,7 @@
enhancement_desc = "Blink distance is increased greatly."
cost = 100
obj_path = /obj/item/weapon/spell/blink
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/blink
name = "blink"
diff --git a/code/game/gamemodes/technomancer/spells/chroma.dm b/code/game/gamemodes/technomancer/spells/chroma.dm
index fb459620c0..18c4afcf65 100644
--- a/code/game/gamemodes/technomancer/spells/chroma.dm
+++ b/code/game/gamemodes/technomancer/spells/chroma.dm
@@ -4,6 +4,7 @@
useful to trick someone into believing you're casting a different spell, or perhaps just for fun."
cost = 25
obj_path = /obj/item/weapon/spell/chroma
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/chroma
name = "chroma"
diff --git a/code/game/gamemodes/technomancer/spells/condensation.dm b/code/game/gamemodes/technomancer/spells/condensation.dm
index 9425b920a5..285f414f15 100644
--- a/code/game/gamemodes/technomancer/spells/condensation.dm
+++ b/code/game/gamemodes/technomancer/spells/condensation.dm
@@ -5,6 +5,7 @@
ability_icon_state = "tech_condensation"
cost = 50
obj_path = /obj/item/weapon/spell/condensation
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/condensation
name = "condensation"
diff --git a/code/game/gamemodes/technomancer/spells/control.dm b/code/game/gamemodes/technomancer/spells/control.dm
index 566f3d7ceb..b5eaad8f44 100644
--- a/code/game/gamemodes/technomancer/spells/control.dm
+++ b/code/game/gamemodes/technomancer/spells/control.dm
@@ -7,6 +7,7 @@
around the entity is merely a hologram used to allow the user to know if the creature is safe or not."
cost = 200
obj_path = /obj/item/weapon/spell/control
+ category = UTILITY_SPELLS
/mob/living/carbon/human/proc/technomancer_control()
place_spell_in_hand(/obj/item/weapon/spell/control)
diff --git a/code/game/gamemodes/technomancer/spells/dispel.dm b/code/game/gamemodes/technomancer/spells/dispel.dm
index e0de7920c1..771bc6b625 100644
--- a/code/game/gamemodes/technomancer/spells/dispel.dm
+++ b/code/game/gamemodes/technomancer/spells/dispel.dm
@@ -6,6 +6,7 @@
cost = 25
obj_path = /obj/item/weapon/spell/dispel
ability_icon_state = "tech_dispel"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/dispel
name = "dispel"
diff --git a/code/game/gamemodes/technomancer/spells/energy_siphon.dm b/code/game/gamemodes/technomancer/spells/energy_siphon.dm
index 0657111f15..0e8e23ffd8 100644
--- a/code/game/gamemodes/technomancer/spells/energy_siphon.dm
+++ b/code/game/gamemodes/technomancer/spells/energy_siphon.dm
@@ -7,6 +7,7 @@
cost = 150
obj_path = /obj/item/weapon/spell/energy_siphon
ability_icon_state = "tech_energysiphon"
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/energy_siphon
name = "energy siphon"
diff --git a/code/game/gamemodes/technomancer/spells/flame_tongue.dm b/code/game/gamemodes/technomancer/spells/flame_tongue.dm
index 772ee579cc..5afa25ae90 100644
--- a/code/game/gamemodes/technomancer/spells/flame_tongue.dm
+++ b/code/game/gamemodes/technomancer/spells/flame_tongue.dm
@@ -4,6 +4,7 @@
cost = 100
obj_path = /obj/item/weapon/spell/flame_tongue
ability_icon_state = "tech_flametongue"
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/flame_tongue
name = "flame tongue"
diff --git a/code/game/gamemodes/technomancer/spells/gambit.dm b/code/game/gamemodes/technomancer/spells/gambit.dm
index 797536cc45..0541e5473e 100644
--- a/code/game/gamemodes/technomancer/spells/gambit.dm
+++ b/code/game/gamemodes/technomancer/spells/gambit.dm
@@ -4,6 +4,7 @@
ability_icon_state = "tech_gambit"
cost = 50
obj_path = /obj/item/weapon/spell/gambit
+ category = UTILITY_SPELLS
/var/global/list/all_technomancer_gambit_spells = typesof(/obj/item/weapon/spell) - list(
/obj/item/weapon/spell,
diff --git a/code/game/gamemodes/technomancer/spells/illusion.dm b/code/game/gamemodes/technomancer/spells/illusion.dm
index 3c72506320..e450e4480f 100644
--- a/code/game/gamemodes/technomancer/spells/illusion.dm
+++ b/code/game/gamemodes/technomancer/spells/illusion.dm
@@ -5,6 +5,7 @@
cost = 100
obj_path = /obj/item/weapon/spell/illusion
ability_icon_state = "tech_illusion"
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/illusion
name = "illusion"
diff --git a/code/game/gamemodes/technomancer/spells/insert/corona.dm b/code/game/gamemodes/technomancer/spells/insert/corona.dm
index fbeb255517..bde3ee9984 100644
--- a/code/game/gamemodes/technomancer/spells/insert/corona.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/corona.dm
@@ -5,6 +5,7 @@
cost = 100
obj_path = /obj/item/weapon/spell/insert/corona
ability_icon_state = "tech_corona"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/insert/corona
name = "corona"
diff --git a/code/game/gamemodes/technomancer/spells/insert/haste.dm b/code/game/gamemodes/technomancer/spells/insert/haste.dm
index a378d98b87..8a3455701a 100644
--- a/code/game/gamemodes/technomancer/spells/insert/haste.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/haste.dm
@@ -1,10 +1,11 @@
/datum/technomancer/spell/haste
name = "Haste"
- desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For three seconds, the target \
+ desc = "Allows the target to run at speeds that should not be possible for an ordinary being. For five seconds, the target \
runs extremly fast, and cannot be slowed by any means."
cost = 100
obj_path = /obj/item/weapon/spell/insert/haste
ability_icon_state = "tech_haste"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/insert/haste
name = "haste"
@@ -22,7 +23,7 @@
L.force_max_speed = 1
L << "You suddenly find it much easier to move."
L.adjust_instability(10)
- spawn(3 SECONDS)
+ spawn(5 SECONDS)
if(src)
on_expire()
diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm b/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm
index 37a9be3b18..6588f1617f 100644
--- a/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/mend_burns.dm
@@ -5,6 +5,7 @@
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_burns
ability_icon_state = "tech_mendburns"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/insert/mend_burns
name = "mend burns"
@@ -19,10 +20,10 @@
spawn(1)
if(ishuman(host))
var/mob/living/carbon/human/H = host
- for(var/i = 0, i<25,i++)
+ for(var/i = 0, i<5,i++)
if(H)
- H.adjustFireLoss(-1)
- H.adjust_instability(0.5)
- origin.adjust_instability(0.5)
+ H.adjustFireLoss(-5)
+ H.adjust_instability(2.5)
+ origin.adjust_instability(2.5)
sleep(10)
on_expire()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm b/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm
index 3d621dc5ed..7ad6976b54 100644
--- a/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/mend_metal.dm
@@ -4,6 +4,7 @@
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_metal
ability_icon_state = "tech_mendwounds"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/insert/mend_metal
name = "mend metal"
@@ -18,14 +19,14 @@
spawn(1)
if(ishuman(host))
var/mob/living/carbon/human/H = host
- for(var/i = 0, i<25,i++)
+ for(var/i = 0, i<5,i++)
if(H)
for(var/obj/item/organ/external/O in H.organs)
if(O.robotic < ORGAN_ROBOT) // Robot parts only.
continue
- O.heal_damage(1, 0, internal = 1, robo_repair = 1)
+ O.heal_damage(5, 0, internal = 1, robo_repair = 1)
- H.adjust_instability(0.5)
- origin.adjust_instability(0.5)
- sleep(10)
+ H.adjust_instability(2.5)
+ origin.adjust_instability(2.5)
+ sleep(1 SECOND)
on_expire()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm
index cdc319dd73..e9450b9586 100644
--- a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm
@@ -5,6 +5,7 @@
cost = 75
obj_path = /obj/item/weapon/spell/insert/mend_organs
ability_icon_state = "tech_mendwounds"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/insert/mend_organs
name = "mend organs"
@@ -19,13 +20,13 @@
spawn(1)
if(ishuman(host))
var/mob/living/carbon/human/H = host
- for(var/i = 0, i<25,i++)
+ for(var/i = 0, i<5,i++)
if(H)
for(var/obj/item/organ/O in H.internal_organs)
if(O.damage > 0)
- O.damage = max(O.damage - 0.2, 0)
+ O.damage = max(O.damage - 1, 0)
- H.adjust_instability(0.5)
- origin.adjust_instability(0.5)
- sleep(10)
+ H.adjust_instability(2.5)
+ origin.adjust_instability(2.5)
+ sleep(1 SECOND)
on_expire()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm
index 6f24704d4a..fbafb7c044 100644
--- a/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/mend_wires.dm
@@ -5,6 +5,7 @@
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_wires
ability_icon_state = "tech_mendwounds"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/insert/mend_wires
name = "mend wires"
@@ -19,14 +20,14 @@
spawn(1)
if(ishuman(host))
var/mob/living/carbon/human/H = host
- for(var/i = 0, i<25,i++)
+ for(var/i = 0, i<5,i++)
if(H)
for(var/obj/item/organ/external/O in H.organs)
if(O.robotic < ORGAN_ROBOT) // Robot parts only.
continue
- O.heal_damage(0, 1, internal = 1, robo_repair = 1)
+ O.heal_damage(0, 5, internal = 1, robo_repair = 1)
- H.adjust_instability(0.5)
- origin.adjust_instability(0.5)
+ H.adjust_instability(2.5)
+ origin.adjust_instability(2.5)
sleep(10)
on_expire()
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm
index 5ae40915d0..c1c507b552 100644
--- a/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/mend_wounds.dm
@@ -5,6 +5,7 @@
cost = 50
obj_path = /obj/item/weapon/spell/insert/mend_wounds
ability_icon_state = "tech_mendwounds"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/insert/mend_wounds
name = "mend wounds"
@@ -19,10 +20,10 @@
spawn(1)
if(ishuman(host))
var/mob/living/carbon/human/H = host
- for(var/i = 0, i<25,i++)
+ for(var/i = 0, i<5,i++)
if(H)
- H.adjustBruteLoss(-1)
- H.adjust_instability(0.5)
- origin.adjust_instability(0.5)
- sleep(10)
+ H.adjustBruteLoss(-5)
+ H.adjust_instability(2.5)
+ origin.adjust_instability(2.5)
+ sleep(1 SECOND)
on_expire()
diff --git a/code/game/gamemodes/technomancer/spells/insert/purify.dm b/code/game/gamemodes/technomancer/spells/insert/purify.dm
index 0f5d404c4e..7ca94f78e6 100644
--- a/code/game/gamemodes/technomancer/spells/insert/purify.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/purify.dm
@@ -1,10 +1,11 @@
/datum/technomancer/spell/purify
name = "Purify"
- desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, and such. \
+ desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such. \
Instability is split between the target and technomancer, if seperate."
cost = 25
obj_path = /obj/item/weapon/spell/insert/purify
ability_icon_state = "tech_purify"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/insert/purify
name = "purify"
@@ -23,12 +24,12 @@
H.disabilities = 0
// for(var/datum/disease/D in H.viruses)
// D.cure()
- for(var/i = 0, i<25,i++)
+ for(var/i = 0, i<5,i++)
if(H)
- H.adjustToxLoss(-1)
- H.adjustCloneLoss(-1)
- H.radiation = max(host.radiation - 2, 0)
- H.adjust_instability(0.5)
- origin.adjust_instability(0.5)
- sleep(10)
+ H.adjustToxLoss(-5)
+ H.adjustCloneLoss(-5)
+ H.radiation = max(host.radiation - 10, 0)
+ H.adjust_instability(2.5)
+ origin.adjust_instability(2.5)
+ sleep(1 SECOND)
on_expire()
diff --git a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm b/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm
index 9ebeda9676..8fb549039f 100644
--- a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm
@@ -1,10 +1,11 @@
/datum/technomancer/spell/repel_missiles
name = "Repel Missiles"
desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \
- to hit you. The field lasts for two minutes and can be granted to yourself or an ally."
+ to hit you. The field lasts for five minutes and can be granted to yourself or an ally."
cost = 60
obj_path = /obj/item/weapon/spell/insert/repel_missiles
ability_icon_state = "tech_repelmissiles"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/insert/repel_missiles
name = "repel missiles"
@@ -21,7 +22,7 @@
var/mob/living/L = host
L.evasion += 2
L << "You have a repulsion field around you, which will attempt to deflect projectiles."
- spawn(2 MINUTES)
+ spawn(5 MINUTES)
if(src)
on_expire()
diff --git a/code/game/gamemodes/technomancer/spells/instability_tap.dm b/code/game/gamemodes/technomancer/spells/instability_tap.dm
index 07f7db42fe..ada2989444 100644
--- a/code/game/gamemodes/technomancer/spells/instability_tap.dm
+++ b/code/game/gamemodes/technomancer/spells/instability_tap.dm
@@ -5,6 +5,7 @@
cost = 120
obj_path = /obj/item/weapon/spell/instability_tap
ability_icon_state = "tech_instabilitytap"
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/instability_tap
name = "instability tap"
diff --git a/code/game/gamemodes/technomancer/spells/mark_recall.dm b/code/game/gamemodes/technomancer/spells/mark_recall.dm
index 0fe6be7808..63e6d67fad 100644
--- a/code/game/gamemodes/technomancer/spells/mark_recall.dm
+++ b/code/game/gamemodes/technomancer/spells/mark_recall.dm
@@ -6,6 +6,7 @@
cost = 50
obj_path = /obj/item/weapon/spell/mark
ability_icon_state = "tech_mark"
+ category = UTILITY_SPELLS
//The object to teleport to when Recall is used.
/obj/effect/mark_spell
@@ -52,6 +53,7 @@
cost = 50
obj_path = /obj/item/weapon/spell/recall
ability_icon_state = "tech_recall"
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/recall
name = "recall"
diff --git a/code/game/gamemodes/technomancer/spells/oxygenate.dm b/code/game/gamemodes/technomancer/spells/oxygenate.dm
index 9acda5227a..3f9bb6f9e5 100644
--- a/code/game/gamemodes/technomancer/spells/oxygenate.dm
+++ b/code/game/gamemodes/technomancer/spells/oxygenate.dm
@@ -5,6 +5,7 @@
cost = 70
obj_path = /obj/item/weapon/spell/oxygenate
ability_icon_state = "oxygenate"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/oxygenate
name = "oxygenate"
diff --git a/code/game/gamemodes/technomancer/spells/passwall.dm b/code/game/gamemodes/technomancer/spells/passwall.dm
index faffe94972..aa16a8a4fc 100644
--- a/code/game/gamemodes/technomancer/spells/passwall.dm
+++ b/code/game/gamemodes/technomancer/spells/passwall.dm
@@ -6,6 +6,7 @@
cost = 100
obj_path = /obj/item/weapon/spell/passwall
ability_icon_state = "tech_passwall"
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/passwall
name = "passwall"
@@ -21,53 +22,55 @@
if(!allowed_to_teleport())
user << "You can't teleport here!"
return 0
- if(isturf(hit_atom))
- var/turf/T = hit_atom //Turf we touched.
- var/turf/our_turf = get_turf(user) //Where we are.
- if(!T.density)
- user << "Perhaps you should try using passWALL on a wall."
+// if(isturf(hit_atom))
+
+ var/turf/T = get_turf(hit_atom) //Turf we touched.
+ var/turf/our_turf = get_turf(user) //Where we are.
+ if(!T.density)
+ if(!T.check_density())
+ user << "Perhaps you should try using passWALL on a wall, or other solid object."
return 0
- var/direction = get_dir(our_turf, T)
- var/total_cost = 0
- var/turf/checked_turf = T //Turf we're currently checking for density in the loop below.
- var/turf/found_turf = null //Our destination, if one is found.
- var/i = maximum_distance
+ var/direction = get_dir(our_turf, T)
+ var/total_cost = 0
+ var/turf/checked_turf = T //Turf we're currently checking for density in the loop below.
+ var/turf/found_turf = null //Our destination, if one is found.
+ var/i = maximum_distance
- visible_message("[user] rests a hand on \the [T].")
- busy = 1
+ visible_message("[user] rests a hand on \the [hit_atom].")
+ busy = 1
- var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
- spark_system.set_up(5, 0, our_turf)
+ var/datum/effect/effect/system/spark_spread/spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread)
+ spark_system.set_up(5, 0, our_turf)
- while(i)
- checked_turf = get_step(checked_turf, direction) //Advance in the given direction
- total_cost += check_for_scepter() ? 400 : 800 //Phasing through matter's expensive, you know.
- i--
- if(!checked_turf.density) //If we found a destination (a non-dense turf), then we can stop.
- var/dense_objs_on_turf = 0
- for(var/atom/movable/stuff in checked_turf.contents) //Make sure nothing dense is where we want to go, like an airlock or window.
- if(stuff.density)
- dense_objs_on_turf = 1
+ while(i)
+ checked_turf = get_step(checked_turf, direction) //Advance in the given direction
+ total_cost += check_for_scepter() ? 400 : 800 //Phasing through matter's expensive, you know.
+ i--
+ if(!checked_turf.density) //If we found a destination (a non-dense turf), then we can stop.
+ var/dense_objs_on_turf = 0
+ for(var/atom/movable/stuff in checked_turf.contents) //Make sure nothing dense is where we want to go, like an airlock or window.
+ if(stuff.density)
+ dense_objs_on_turf = 1
- if(!dense_objs_on_turf) //If we found a non-dense turf with nothing dense on it, then that's our destination.
- found_turf = checked_turf
- break
- sleep(10)
+ if(!dense_objs_on_turf) //If we found a non-dense turf with nothing dense on it, then that's our destination.
+ found_turf = checked_turf
+ break
+ sleep(10)
- if(found_turf)
- if(user.loc != our_turf)
- user << "You need to stand still in order to phase through the wall."
- return 0
- if(pay_energy(total_cost) && !user.incapacitated() )
- visible_message("[user] appears to phase through \the [T]!")
- user << "You find a destination on the other side of \the [T], and phase through it."
- spark_system.start()
- user.forceMove(found_turf)
- qdel(src)
- return 1
- else
- user << "You don't have enough energy to phase through these walls!"
- busy = 0
+ if(found_turf)
+ if(user.loc != our_turf)
+ user << "You need to stand still in order to phase through \the [hit_atom]."
+ return 0
+ if(pay_energy(total_cost) && !user.incapacitated() )
+ visible_message("[user] appears to phase through \the [hit_atom]!")
+ user << "You find a destination on the other side of \the [hit_atom], and phase through it."
+ spark_system.start()
+ user.forceMove(found_turf)
+ qdel(src)
+ return 1
else
- user << "You weren't able to find an open space to go to."
+ user << "You don't have enough energy to phase through these walls!"
busy = 0
+ else
+ user << "You weren't able to find an open space to go to."
+ busy = 0
diff --git a/code/game/gamemodes/technomancer/spells/phase_shift.dm b/code/game/gamemodes/technomancer/spells/phase_shift.dm
index 142134abc9..20fb033872 100644
--- a/code/game/gamemodes/technomancer/spells/phase_shift.dm
+++ b/code/game/gamemodes/technomancer/spells/phase_shift.dm
@@ -4,6 +4,7 @@
draining your powercell."
cost = 80
obj_path = /obj/item/weapon/spell/phase_shift
+ category = DEFENSIVE_SPELLS
/obj/item/weapon/spell/phase_shift
name = "phase shift"
diff --git a/code/game/gamemodes/technomancer/spells/projectile/beam.dm b/code/game/gamemodes/technomancer/spells/projectile/beam.dm
index bfee4ec3f1..429a83dd9b 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/beam.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/beam.dm
@@ -4,6 +4,7 @@
cost = 150
ability_icon_state = "tech_beam"
obj_path = /obj/item/weapon/spell/projectile/beam
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/projectile/beam
name = "beam"
@@ -12,12 +13,13 @@
cast_methods = CAST_RANGED
aspect = ASPECT_LIGHT
spell_projectile = /obj/item/projectile/beam/blue
- energy_cost_per_shot = 500
+ energy_cost_per_shot = 400
instability_per_shot = 3
cooldown = 10
+ fire_sound = 'sound/weapons/Laser.ogg'
/obj/item/projectile/beam/blue
- damage = 20
+ damage = 30
muzzle_type = /obj/effect/projectile/laser_blue/muzzle
tracer_type = /obj/effect/projectile/laser_blue/tracer
diff --git a/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm b/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm
index 5d4da458a0..7cdd4565e2 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/chain_lightning.dm
@@ -5,6 +5,7 @@
strike up to four targets, including yourself if conditions allow it to occur."
cost = 150
obj_path = /obj/item/weapon/spell/projectile/chain_lightning
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/projectile/chain_lightning
name = "chain lightning"
@@ -16,6 +17,7 @@
energy_cost_per_shot = 3000
instability_per_shot = 10
cooldown = 20
+ fire_sound = 'sound/weapons/gauss_shoot.ogg'
/obj/item/projectile/beam/chain_lightning
name = "lightning"
diff --git a/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm b/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm
index c13d2363d8..dad3c88f45 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm
@@ -4,6 +4,7 @@
that armor designed to protect from blunt force will mitigate this function as well."
cost = 100
obj_path = /obj/item/weapon/spell/projectile/force_missile
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/projectile/force_missile
name = "force missile"
@@ -12,13 +13,14 @@
cast_methods = CAST_RANGED
aspect = ASPECT_FORCE
spell_projectile = /obj/item/projectile/force_missile
- energy_cost_per_shot = 400
+ energy_cost_per_shot = 300
instability_per_shot = 2
- cooldown = 10
+ cooldown = 5
+ fire_sound = 'sound/weapons/wave.ogg'
/obj/item/projectile/force_missile
name = "force missile"
icon_state = "force_missile"
- damage = 20
+ damage = 25
damage_type = BRUTE
check_armour = "melee"
\ No newline at end of file
diff --git a/code/game/gamemodes/technomancer/spells/projectile/lightning.dm b/code/game/gamemodes/technomancer/spells/projectile/lightning.dm
index 3c77f89b0f..c4b69a923a 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/lightning.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/lightning.dm
@@ -5,6 +5,7 @@
strike."
cost = 150
obj_path = /obj/item/weapon/spell/projectile/lightning
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/projectile/lightning
name = "lightning strike"
@@ -16,7 +17,8 @@
energy_cost_per_shot = 2500
instability_per_shot = 10
cooldown = 20
- pre_shot_delay = 20
+ pre_shot_delay = 10
+ fire_sound = 'sound/weapons/gauss_shoot.ogg'
/obj/item/projectile/beam/lightning
name = "lightning"
diff --git a/code/game/gamemodes/technomancer/spells/projectile/overload.dm b/code/game/gamemodes/technomancer/spells/projectile/overload.dm
index 9b3964503a..e6f0c898e2 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/overload.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/overload.dm
@@ -4,6 +4,7 @@
This energy pierces all known armor."
cost = 150
obj_path = /obj/item/weapon/spell/projectile/overload
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/projectile/overload
name = "overload"
@@ -13,9 +14,10 @@
aspect = ASPECT_UNSTABLE
spell_projectile = /obj/item/projectile/overload
energy_cost_per_shot = 0 // Handled later
- instability_per_shot = 15
+ instability_per_shot = 12
cooldown = 10
pre_shot_delay = 4
+ fire_sound = 'sound/effects/supermatter.ogg'
/obj/item/projectile/overload
name = "overloaded bolt"
@@ -25,15 +27,15 @@
armor_penetration = 100
/obj/item/weapon/spell/projectile/overload/on_ranged_cast(atom/hit_atom, mob/living/user)
- energy_cost_per_shot = round(core.max_energy * 0.15)
+ energy_cost_per_shot = round(core.max_energy * 0.10)
var/energy_before_firing = core.energy
if(set_up(hit_atom, user))
var/obj/item/projectile/overload/P = new spell_projectile(get_turf(user))
P.launch(hit_atom)
if(check_for_scepter())
- P.damage = round(energy_before_firing * 0.003) // 3% of their current energy pool.
+ P.damage = round(energy_before_firing * 0.004) // 4% of their current energy pool.
else
- P.damage = round(energy_before_firing * 0.002) // 2% of their current energy pool.
+ P.damage = round(energy_before_firing * 0.003) // 3% of their current energy pool.
owner.adjust_instability(instability_per_shot)
return 1
diff --git a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm
index d4e8474aed..69e1efc92f 100644
--- a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm
+++ b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm
@@ -7,12 +7,15 @@
var/energy_cost_per_shot = 0
var/instability_per_shot = 0
var/pre_shot_delay = 0
+ var/fire_sound = null
/obj/item/weapon/spell/projectile/on_ranged_cast(atom/hit_atom, mob/living/user)
var/turf/T = get_turf(hit_atom)
if(set_up(hit_atom, user))
var/obj/item/projectile/new_projectile = new spell_projectile(get_turf(user))
new_projectile.launch(T)
+ if(fire_sound)
+ playsound(get_turf(src), fire_sound, 75, 1)
owner.adjust_instability(instability_per_shot)
return 1
return 0
@@ -23,7 +26,7 @@
if(pre_shot_delay)
var/image/target_image = image(icon = 'icons/obj/spells.dmi', loc = get_turf(hit_atom), icon_state = "target")
user << target_image
- user.Stun(pre_shot_delay)
+ user.Stun(pre_shot_delay / 10)
sleep(pre_shot_delay)
qdel(target_image)
return 1
diff --git a/code/game/gamemodes/technomancer/spells/radiance.dm b/code/game/gamemodes/technomancer/spells/radiance.dm
index b8eb1401f1..9d484ddc5c 100644
--- a/code/game/gamemodes/technomancer/spells/radiance.dm
+++ b/code/game/gamemodes/technomancer/spells/radiance.dm
@@ -3,6 +3,7 @@
desc = "Causes you to be very radiant, glowing brightly in visible light, thermal energy, and deadly ionizing radiation."
cost = 180
obj_path = /obj/item/weapon/spell/radiance
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/radiance
name = "radiance"
diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm
index 6944bd49bc..7a8fa0a4de 100644
--- a/code/game/gamemodes/technomancer/spells/reflect.dm
+++ b/code/game/gamemodes/technomancer/spells/reflect.dm
@@ -4,6 +4,7 @@
cost = 120
obj_path = /obj/item/weapon/spell/reflect
ability_icon_state = "tech_reflect"
+ category = DEFENSIVE_SPELLS
/obj/item/weapon/spell/reflect
name = "\proper reflect shield"
diff --git a/code/game/gamemodes/technomancer/spells/resurrect.dm b/code/game/gamemodes/technomancer/spells/resurrect.dm
index 2aee98bc1e..dcdcbb1f18 100644
--- a/code/game/gamemodes/technomancer/spells/resurrect.dm
+++ b/code/game/gamemodes/technomancer/spells/resurrect.dm
@@ -6,6 +6,7 @@
cost = 100
obj_path = /obj/item/weapon/spell/resurrect
ability_icon_state = "tech_resurrect"
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/resurrect
name = "resurrect"
diff --git a/code/game/gamemodes/technomancer/spells/shared_burden.dm b/code/game/gamemodes/technomancer/spells/shared_burden.dm
index c7e8e35107..95523d99ff 100644
--- a/code/game/gamemodes/technomancer/spells/shared_burden.dm
+++ b/code/game/gamemodes/technomancer/spells/shared_burden.dm
@@ -3,6 +3,7 @@
desc = "One of the few functions able to adjust instability, this allows you to take someone else's instability."
cost = 50
obj_path = /obj/item/weapon/spell/shared_burden
+ category = SUPPORT_SPELLS
/obj/item/weapon/spell/shared_burden
name = "shared burden"
diff --git a/code/game/gamemodes/technomancer/spells/shield.dm b/code/game/gamemodes/technomancer/spells/shield.dm
index 807ea698a2..330de0ff26 100644
--- a/code/game/gamemodes/technomancer/spells/shield.dm
+++ b/code/game/gamemodes/technomancer/spells/shield.dm
@@ -5,6 +5,7 @@
cost = 120
obj_path = /obj/item/weapon/spell/shield
ability_icon_state = "tech_shield"
+ category = DEFENSIVE_SPELLS
/obj/item/weapon/spell/shield
name = "\proper energy shield"
diff --git a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm
index 627be97e36..ac5e799d72 100644
--- a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm
+++ b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm
@@ -3,6 +3,7 @@
desc = "Disrupts photons moving in a local area, causing darkness to shroud yourself or a position of your choosing."
cost = 30
obj_path = /obj/item/weapon/spell/spawner/darkness
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/spawner/darkness
name = "darkness"
diff --git a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm
index 7cf519ddbd..50ed504b40 100644
--- a/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm
+++ b/code/game/gamemodes/technomancer/spells/spawner/fire_blast.dm
@@ -4,6 +4,7 @@
sure to not be close to the disturbance yourself."
cost = 175
obj_path = /obj/item/weapon/spell/spawner/fire_blast
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/spawner/fire_blast
name = "fire blast"
diff --git a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm
index 4704cda8b9..a2c22b0f76 100644
--- a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm
+++ b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm
@@ -3,6 +3,7 @@
desc = "Emits electronic pulses to destroy, disable, or otherwise harm devices and machines. Be sure to not hit yourself with this."
cost = 150
obj_path = /obj/item/weapon/spell/spawner/pulsar
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/spawner/pulsar
name = "pulsar"
diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm b/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm
index eac1c67b40..497a8422bd 100644
--- a/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm
+++ b/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm
@@ -8,6 +8,7 @@
enhancement_desc = "Summoned entities will never harm their summoner."
cost = 200
obj_path = /obj/item/weapon/spell/summon/summon_creature
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/summon/summon_creature
name = "summon creature"
diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm
index 1bbab4d299..5323c5beda 100644
--- a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm
+++ b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm
@@ -5,6 +5,7 @@
enhancement_desc = "Wards can detect invisibile entities, and are more specific in relaying information about what it sees."
cost = 100
obj_path = /obj/item/weapon/spell/summon/summon_ward
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/summon/summon_ward
name = "summon ward"
diff --git a/code/game/gamemodes/technomancer/spells/targeting_matrix.dm b/code/game/gamemodes/technomancer/spells/targeting_matrix.dm
index a74aab2ff5..aff00f0197 100644
--- a/code/game/gamemodes/technomancer/spells/targeting_matrix.dm
+++ b/code/game/gamemodes/technomancer/spells/targeting_matrix.dm
@@ -5,6 +5,7 @@
cost = 150
ability_icon_state = "tech_targetingmatrix"
obj_path = /obj/item/weapon/spell/targeting_matrix
+ category = UTILITY_SPELLS
/obj/item/weapon/spell/targeting_matrix
name = "targeting matrix"
diff --git a/code/game/gamemodes/technomancer/spells/track.dm b/code/game/gamemodes/technomancer/spells/track.dm
index 90e6518200..166f3f5b43 100644
--- a/code/game/gamemodes/technomancer/spells/track.dm
+++ b/code/game/gamemodes/technomancer/spells/track.dm
@@ -3,9 +3,10 @@
desc = "Acts as directional guidance towards an object that belongs to you or your team. It can also point towards your allies. \
Wonderful if you're worried someone will steal your valuables, like a certain shiny Scepter..."
enhancement_desc = "You will be able to track most other entities in addition to your belongings and allies."
- cost = 30
+ cost = 25
obj_path = /obj/item/weapon/spell/track
ability_icon_state = "tech_track"
+ category = UTILITY_SPELLS
// This stores a ref to all important items that belong to a Technomancer, in case of theft. Used by the spell below.
// I feel dirty for adding yet another global list used by one thing, but the only alternative is to loop through world, and yeahhh.
diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm
index ffb9749899..a308066ae5 100644
--- a/code/game/gamemodes/technomancer/spells/warp_strike.dm
+++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm
@@ -4,6 +4,7 @@
cost = 200
obj_path = /obj/item/weapon/spell/warp_strike
ability_icon_state = "tech_warpstrike"
+ category = OFFENSIVE_SPELLS
/obj/item/weapon/spell/warp_strike
name = "warp strike"
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index c4b5d787a4..13b03e00e6 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 4e28c4e577..5c2cfed4dd 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/captain.dm b/code/game/jobs/job/captain.dm
index 514d3cf047..be9f9a1321 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -1,7 +1,7 @@
var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
/datum/job/captain
- title = "Captain"
+ title = "Station Administrator"
flag = CAPTAIN
department = "Command"
head_position = 1
@@ -11,7 +11,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 1
supervisors = "company officials and Corporate Regulations"
selection_color = "#1D1D4F"
- alt_titles = list("Station Administrator")
+ alt_titles = list("Site Manager")
idtype = /obj/item/weapon/card/id/gold
req_admin_notify = 1
access = list() //See get_access()
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index c02048450b..6b2a40a8aa 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 9ce0e2b811..26065fe1e9 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 08faeff78b..4a58377fc7 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 1777151261..9d90f018ef 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -390,7 +390,7 @@
visible_message("\The [src] rattles and prints out a sheet of paper.")
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc)
P.info = "
Body Scan - [href_list["name"]]
"
- P.info += "Time of scan: [worldtime2text(world.time)]
"
+ P.info += "Time of scan: [worldtime2stationtime(world.time)]
"
P.info += "[printing_text]"
P.info += "
Notes:
"
P.name = "Body Scan - [href_list["name"]]"
diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm
index 136bafa90e..bf4839e7c7 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 4b64cbadce..1f0b5f454f 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 3bc9a17fce..293ff22ef9 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 333c12cd44..3fced68e65 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)
@@ -188,13 +188,13 @@
if ("issue")
if (giver)
var/number = add_zero("[rand(0,9999)]", 4)
- var/entry = "\[[worldtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: "
+ var/entry = "\[[stationtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: "
for (var/i=1 to accesses.len)
var/A = accesses[i]
if (A)
var/area = get_access_desc(A)
entry += "[i > 1 ? ", [area]" : "[area]"]"
- entry += ". Expires at [worldtime2text(world.time + duration*10*60)]."
+ entry += ". Expires at [worldtime2stationtime(world.time + duration*10*60)]."
internal_log.Add(entry)
var/obj/item/weapon/card/id/guest/pass = new(src.loc)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 3150003f46..4f73301e84 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 2624c4ff28..6868f23343 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 4425dc236a..57a662db46 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 59bb46fd69..e6f19b8588 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 6acb530acc..3800fb9440 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 9c3a8f26bb..bf79ac9da3 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -465,8 +465,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 d879d9bcaa..1de7cc367b 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 a05f69d84f..98582f3ccc 100644
--- a/code/game/machinery/status_display.dm
+++ b/code/game/machinery/status_display.dm
@@ -134,7 +134,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 3c8414affb..c1cc472a13 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 = 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 = 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 f0bb82efd0..76c7dfd6a5 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 b101bab0ee..e5715c6060 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 faa17586c2..a68e65b6ea 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 61c6668c33..3cbc75bfeb 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 743175a21b..f194bb605b 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 b2c9e82e27..80c5228bb4 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 c23af3192b..db630d8fad 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 2a85fbdfc9..6e323d7387 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 f4b763c5e9..d957c049b5 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 08c7c56f4f..f7de0b46f6 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 8f904972de..46a3cd29e9 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 c890377475..7d0161a2fd 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 33a9f46ed1..98c7876811 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 d868ebfa51..fc4a9c48ca 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 8596ce037d..8271c3a0d5 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 6a06ef26fb..d26b421ab5 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 67a429b2d0..e78d7941a4 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 df3be0077f..3a7c1afdf0 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 9bd4fae1d8..a9d8b0c7d7 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 dc1cbf1c8c..097ddd0c00 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 1cb76cef8d..b1b03a4ac4 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -96,7 +96,8 @@ var/list/admin_verbs_admin = list(
/client/proc/toggle_debug_logs,
/client/proc/toggle_attack_logs,
/datum/admins/proc/paralyze_mob,
- /client/proc/fixatmos
+ /client/proc/fixatmos,
+ /datum/admins/proc/sendFax
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
@@ -305,7 +306,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 9c73dd9e86..9ee3d10b6b 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 622be84c3d..ece5f068d7 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 261c95515a..335241d15e 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 5d4a73c64a..d42449ab84 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 030c8d08a3..214d8e6a9c 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 f79b7ca4f0..43bcce5e51 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 ae064dd2a8..a8a65a9873 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 270d21cfeb..10994ea57b 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/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm
index 06ee34b312..b16c03f0ef 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 ca0db0595a..688f562f9a 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -114,7 +114,7 @@ log transactions
T.amount = I:worth
T.source_terminal = machine_id
T.date = current_date_string
- T.time = worldtime2text()
+ T.time = stationtime2text()
authenticated_account.transaction_log.Add(T)
user << "You insert [I] into [src]."
@@ -243,7 +243,7 @@ log transactions
T.purpose = transfer_purpose
T.source_terminal = machine_id
T.date = current_date_string
- T.time = worldtime2text()
+ T.time = stationtime2text()
T.amount = "([transfer_amount])"
authenticated_account.transaction_log.Add(T)
else
@@ -285,7 +285,7 @@ log transactions
T.purpose = "Unauthorised login attempt"
T.source_terminal = machine_id
T.date = current_date_string
- T.time = worldtime2text()
+ T.time = stationtime2text()
failed_account.transaction_log.Add(T)
else
usr << "\red \icon[src] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining."
@@ -305,7 +305,7 @@ log transactions
T.purpose = "Remote terminal access"
T.source_terminal = machine_id
T.date = current_date_string
- T.time = worldtime2text()
+ T.time = stationtime2text()
authenticated_account.transaction_log.Add(T)
usr << "\blue \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'"
@@ -333,7 +333,7 @@ log transactions
T.amount = "([amount])"
T.source_terminal = machine_id
T.date = current_date_string
- T.time = worldtime2text()
+ T.time = stationtime2text()
authenticated_account.transaction_log.Add(T)
else
usr << "\icon[src]You don't have enough funds to do that!"
@@ -358,7 +358,7 @@ log transactions
T.amount = "([amount])"
T.source_terminal = machine_id
T.date = current_date_string
- T.time = worldtime2text()
+ T.time = stationtime2text()
authenticated_account.transaction_log.Add(T)
else
usr << "\icon[src]You don't have enough funds to do that!"
@@ -370,7 +370,7 @@ log transactions
R.info += "Account holder: [authenticated_account.owner_name]
"
R.info += "Account number: [authenticated_account.account_number]
"
R.info += "Balance: $[authenticated_account.money]
"
- R.info += "Date and time: [worldtime2text()], [current_date_string]
"
+ R.info += "Date and time: [stationtime2text()], [current_date_string]
"
R.info += "Service terminal ID: [machine_id]
"
//stamp the paper
@@ -393,7 +393,7 @@ log transactions
R.info = "Transaction logs
"
R.info += "Account holder: [authenticated_account.owner_name]
"
R.info += "Account number: [authenticated_account.account_number]
"
- R.info += "Date and time: [worldtime2text()], [current_date_string]
"
+ R.info += "Date and time: [stationtime2text()], [current_date_string]
"
R.info += "Service terminal ID: [machine_id]
"
R.info += ""
R.info += ""
@@ -469,7 +469,7 @@ log transactions
T.purpose = "Remote terminal access"
T.source_terminal = machine_id
T.date = current_date_string
- T.time = worldtime2text()
+ T.time = stationtime2text()
authenticated_account.transaction_log.Add(T)
view_screen = NO_SCREEN
diff --git a/code/modules/economy/Accounts.dm b/code/modules/economy/Accounts.dm
index 712c591741..cfd720d4dc 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 20278d0757..200c3c8320 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 003816e04c..21ef8b4bfa 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 5728560040..a064b86b1f 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 109572ffc0..87f7b53a7f 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 0a79ad5018..4ddf058de2 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 4fca5eb3d9..534c5aa56d 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 07d18c2746..b0304d4f88 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 b905dd576c..df7f8d1674 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 5173236627..2f5d099e8d 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 0ea8bb6ab3..11ded83550 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 eb1eeb40ca..e8881a5dc7 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 ce3ec04a25..ea69670885 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 6d460dd850..1c6208061d 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 19cdf2a18b..1f78c7ce77 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 d4a967dc7b..b20d39ddce 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 9fe7f221e1..5e7cfe2603 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 4f14216747..711b3a13d0 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 0e20458291..8265eb9e80 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 7f9c832e84..ae756f6a5f 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 60a431aad3..6cb5908f6f 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 e623f58be8..42452c49fa 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 cb29717886..0072d9a444 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 e4d39b5afe..8a0c7564d1 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 0cd58d330a..b07202572e 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 54c7f9a969..1ec266e9cb 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 7f4dc972c4..6b8a3c43b3 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 c3813000bb..101390b3d6 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 df1bfc4667..d7c7de37ee 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -41,6 +41,10 @@
human_mob_list |= src
..()
+ hide_underwear.Cut()
+ for(var/category in global_underwear.categories_by_name)
+ hide_underwear[category] = FALSE
+
if(dna)
dna.ready_dna(src)
dna.real_name = real_name
@@ -928,9 +932,8 @@
/mob/living/carbon/human/proc/rupture_lung()
var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS]
- if(L && !L.is_bruised())
- src.custom_pain("You feel a stabbing pain in your chest!", 1)
- L.damage = L.min_bruised_damage
+ if(L)
+ L.rupture()
/*
/mob/living/carbon/human/verb/simulate()
@@ -1416,6 +1419,22 @@
return 1
return 0
+/mob/living/carbon/human/verb/toggle_underwear()
+ set name = "Toggle Underwear"
+ set desc = "Shows/hides selected parts of your underwear."
+ set category = "Object"
+
+ if(stat) return
+ var/datum/category_group/underwear/UWC = input(usr, "Choose underwear:", "Show/hide underwear") as null|anything in global_underwear.categories
+ var/datum/category_item/underwear/UWI = all_underwear[UWC.name]
+ if(!UWI || UWI.name == "None")
+ src << "You do not have [UWC.gender==PLURAL ? "[UWC.display_name]" : "\a [UWC.display_name]"]."
+ return
+ hide_underwear[UWC.name] = !hide_underwear[UWC.name]
+ update_underwear(1)
+ src << "You [hide_underwear[UWC.name] ? "take off" : "put on"] your [UWC.display_name]."
+ return
+
/mob/living/carbon/human/verb/pull_punches()
set name = "Pull Punches"
set desc = "Try not to hurt them."
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 99bbe8ffcf..fef4752a2a 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -35,6 +35,7 @@
var/list/all_underwear = list()
var/list/all_underwear_metadata = list()
+ var/list/hide_underwear = list()
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
var/pdachoice = 1 //Which PDA type the player has chosen. Default, Slim, or Old.
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 39d190ddcd..cfc61cef5c 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -4,7 +4,7 @@
#define HUMAN_MAX_OXYLOSS 1 //Defines how much oxyloss humans can get per tick. A tile with no air at all (such as space) applies this value, otherwise it's a percentage of it.
#define HUMAN_CRIT_MAX_OXYLOSS ( 2.0 / 6) //The amount of damage you'll get when in critical condition. We want this to be a 5 minute deal = 300s. There are 50HP to get through, so (1/6)*last_tick_duration per second. Breaths however only happen every 4 ticks. last_tick_duration = ~2.0 on average
-#define HEAT_DAMAGE_LEVEL_1 5 //Amount of damage applied when your body temperature just passes the 360.15k safety point
+#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 10 //Amount of damage applied when your body temperature passes the 400K point
#define HEAT_DAMAGE_LEVEL_3 20 //Amount of damage applied when your body temperature passes the 1000K point
@@ -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 5a8fcba715..c3bb679b08 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 293df93215..1fb7b6c300 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 5eae3da61e..863fb7d029 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 ebbacc747e..7c13fc239c 100644
--- a/code/modules/mob/living/carbon/human/species/station/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station.dm
@@ -96,8 +96,8 @@
burn_mod = 1.15
gluttonous = 1
num_alternate_languages = 2
- secondary_langs = list("Siik'tajr")
- name_language = "Siik'tajr"
+ secondary_langs = list("Siik")
+ name_language = "Siik"
health_hud_intensity = 2.5
min_age = 17
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 43123eab0a..6607d166bf 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 b9bf50a51c..3c6f8585f6 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 537e7c0c50..1b11e4e984 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 03fa56387a..c1ca5732b5 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 081eb39a5c..9d7ba1bc63 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -654,8 +654,8 @@
if(.)
if(statpanel("Status") && ticker && ticker.current_state != GAME_STATE_PREGAME)
- stat("Station Time", worldtime2text())
- stat("Round Duration", round_duration_as_text())
+ stat("Station Time", stationtime2text())
+ stat("Round Duration", roundduration2text())
if(client.holder)
if(statpanel("Status"))
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 1f09ea251c..060bd2b651 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -362,7 +362,7 @@
var/dat = ""
dat += "Welcome, [name].
"
- dat += "Round Duration: [round_duration_as_text()]
"
+ dat += "Round Duration: [roundduration2text()]
"
if(emergency_shuttle) //In case Nanotrasen decides reposess CentComm's shuttles.
if(emergency_shuttle.going_to_centcom()) //Shuttle is going to centcomm, not recalled
diff --git a/code/modules/organs/internal/lungs.dm b/code/modules/organs/internal/lungs.dm
index fae4bc5ee6..ab0b10ddf8 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 e1cf0cad9e..fad60cc0d7 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 2c97bf4cfc..4c2538f703 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 0000000000..7843552f8c
--- /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 8c30f1d486..cf1da677f0 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 1e85563ee8..ba80dbb614 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 c8942f0093..57d10ed227 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -164,7 +164,7 @@
toner = 0
return
-/obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy)
+/obj/machinery/photocopier/proc/copy(var/obj/item/weapon/paper/copy, var/need_toner=1)
var/obj/item/weapon/paper/c = new /obj/item/weapon/paper (loc)
if(toner > 10) //lots of toner, make it dark
c.info = ""
@@ -195,13 +195,14 @@
img.pixel_y = copy.offset_y[j]
c.overlays += img
c.updateinfolinks()
- toner--
+ if(need_toner)
+ toner--
if(toner == 0)
visible_message("A red light on \the [src] flashes, indicating that it is out of toner.")
return c
-/obj/machinery/photocopier/proc/photocopy(var/obj/item/weapon/photo/photocopy)
+/obj/machinery/photocopier/proc/photocopy(var/obj/item/weapon/photo/photocopy, var/need_toner=1)
var/obj/item/weapon/photo/p = photocopy.copy()
p.loc = src.loc
@@ -215,7 +216,8 @@
p.img.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
p.tiny.MapColors(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(100,100,100))
p.icon = I
- toner -= 5 //photos use a lot of ink!
+ if(need_toner)
+ toner -= 5 //photos use a lot of ink!
if(toner < 0)
toner = 0
visible_message("A red light on \the [src] flashes, indicating that it is out of toner.")
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
index ac054b224f..0d83a5725c 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 c0189dd1c6..a8a8bca6d3 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 186c869ad3..24e0c7ae4e 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 71819efc65..0000000000
--- 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 7556369b11..0000000000
--- 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 4026cc0a03..0000000000
--- 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 535a0b4f07..0000000000
--- 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 ebab6fac76..0000000000
--- 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 2eecadc690..0000000000
--- 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 bf320f0cd3..0000000000
--- 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 6f79f8d8ba..0000000000
--- 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 0ed24ad248..0000000000
--- 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 e242838a1e..0000000000
--- 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 fb6adf795a..0000000000
--- 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/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 2f6cc45e75..a8472245a2 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 0000000000..7cead98237
--- /dev/null
+++ b/code/modules/xenoarcheaology/artifacts/artifact_find.dm
@@ -0,0 +1,19 @@
+/datum/artifact_find
+ var/artifact_id
+ var/artifact_find_type
+
+/datum/artifact_find/New()
+
+ artifact_id = "[pick("kappa","sigma","antaeres","beta","omicron","iota","epsilon","omega","gamma","delta","tau","alpha")]-[rand(100,999)]"
+
+ artifact_find_type = pick(
+ 5;/obj/machinery/power/supermatter,
+ 5;/obj/structure/constructshell,
+ 5;/obj/machinery/syndicate_beacon,
+ 25;/obj/machinery/power/supermatter/shard,
+ 50;/obj/structure/cult/pylon,
+ 100;/obj/machinery/auto_cloner,
+ 100;/obj/machinery/giga_drill,
+ 100;/obj/machinery/replicator,
+ 150;/obj/structure/crystal,
+1000;/obj/machinery/artifact)
\ No newline at end of file
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm b/code/modules/xenoarcheaology/artifacts/autocloner.dm
similarity index 64%
rename from code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
rename to code/modules/xenoarcheaology/artifacts/autocloner.dm
index 4daf56e056..89c653516f 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact_autocloner.dm
+++ b/code/modules/xenoarcheaology/artifacts/autocloner.dm
@@ -1,4 +1,3 @@
-
/obj/machinery/auto_cloner
name = "mysterious pod"
desc = "It's full of a viscous liquid, but appears dark and silent."
@@ -22,25 +21,23 @@
//33% chance to spawn nasties
if(prob(33))
- spawn_type = pick(\
- /mob/living/simple_animal/hostile/giant_spider/nurse,\
- /mob/living/simple_animal/hostile/alien,\
- /mob/living/simple_animal/hostile/bear,\
- /mob/living/simple_animal/hostile/creature\
- )
+ spawn_type = pick(
+ /mob/living/simple_animal/hostile/giant_spider/nurse,
+ /mob/living/simple_animal/hostile/alien,
+ /mob/living/simple_animal/hostile/bear,
+ /mob/living/simple_animal/hostile/creature)
else
spawn_type = pick(\
- /mob/living/simple_animal/cat,\
- /mob/living/simple_animal/corgi,\
- /mob/living/simple_animal/corgi/puppy,\
- /mob/living/simple_animal/chicken,\
- /mob/living/simple_animal/cow,\
- /mob/living/simple_animal/parrot,\
- /mob/living/simple_animal/slime,\
- /mob/living/simple_animal/crab,\
- /mob/living/simple_animal/mouse,\
- /mob/living/simple_animal/hostile/retaliate/goat\
- )
+ /mob/living/simple_animal/cat,
+ /mob/living/simple_animal/corgi,
+ /mob/living/simple_animal/corgi/puppy,
+ /mob/living/simple_animal/chicken,
+ /mob/living/simple_animal/cow,
+ /mob/living/simple_animal/parrot,
+ /mob/living/simple_animal/slime,
+ /mob/living/simple_animal/crab,
+ /mob/living/simple_animal/mouse,
+ /mob/living/simple_animal/hostile/retaliate/goat)
//todo: how the hell is the asteroid permanently powered?
/obj/machinery/auto_cloner/process()
@@ -48,17 +45,17 @@
if(!previous_power_state)
previous_power_state = 1
icon_state = "cellold1"
- src.visible_message("\blue \icon[src] [src] suddenly comes to life!")
+ src.visible_message("\icon[src] [src] suddenly comes to life!")
//slowly grow a mob
if(prob(5))
- src.visible_message("\blue \icon[src] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")].")
+ src.visible_message("\icon[src] [src] [pick("gloops","glugs","whirrs","whooshes","hisses","purrs","hums","gushes")].")
//if we've finished growing...
if(time_spent_spawning >= time_per_spawn)
time_spent_spawning = 0
use_power = 1
- src.visible_message("\blue \icon[src] [src] pings!")
+ src.visible_message("\icon[src] [src] pings!")
icon_state = "cellold1"
desc = "It's full of a bubbling viscous liquid, and is lit by a mysterious glow."
if(spawn_type)
@@ -79,7 +76,7 @@
if(previous_power_state)
previous_power_state = 0
icon_state = "cellold0"
- src.visible_message("\blue \icon[src] [src] suddenly shuts down.")
+ src.visible_message("\icon[src] [src] suddenly shuts down.")
//cloned mob slowly breaks down
time_spent_spawning = max(time_spent_spawning + last_process - world.time, 0)
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm b/code/modules/xenoarcheaology/artifacts/crystal.dm
similarity index 74%
rename from code/modules/research/xenoarchaeology/artifact/artifact_crystal.dm
rename to code/modules/xenoarcheaology/artifacts/crystal.dm
index 081683b044..1f922c64ba 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 c9d14ce237..42c7288d2d 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 66b5f7dc7d..a3030b4bf6 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 0000000000..4c0bafd707
--- /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 23bb649ac7..eaf51f102b 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 0d6bd0eb63..60386531d9 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 b6f165ec24..3a30c0646f 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 fe94dbe155..f988fdf20e 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 f8dad2c4d3..b4f7025afb 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 b74ab88a9a..82165f6ad8 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 18165cf0d4..d6d402efe4 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 0139ea935f..6a48620b40 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 c486959afd..264dca7352 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 6954ab3c77..42b440fc1c 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 ae8d253652..bb159509dc 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 d470a462b1..b84296fbb8 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 afa1d0704c..8537880438 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 61719bc916..8086d0e673 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 5a6e8a46db..275f25e3d3 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 21304df408..00d57ff40a 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 5bdb39a87c..db8732294d 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 4310ffb2e7..7816409757 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 96e20fd3d1..4f852869a4 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 aab220cff7..3487bf7a4e 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 61979c5f69..bcdd736ebc 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 b7b2864de4..adecc65086 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 5df1a33f66..a050d6c249 100644
--- a/code/modules/research/xenoarchaeology/artifact/effects/unknown_effect_teleport.dm
+++ b/code/modules/xenoarcheaology/effects/teleport.dm
@@ -1,7 +1,6 @@
-
/datum/artifact_effect/teleport
- effecttype = "teleport"
- effect_type = 6
+ name = "teleport"
+ effect_type = EFFECT_BLUESPACE
/datum/artifact_effect/teleport/DoEffectTouch(var/mob/user)
var/weakness = GetAnomalySusceptibility(user)
diff --git a/code/modules/research/xenoarchaeology/finds/finds_eguns.dm b/code/modules/xenoarcheaology/finds/eguns.dm
similarity index 100%
rename from code/modules/research/xenoarchaeology/finds/finds_eguns.dm
rename to code/modules/xenoarcheaology/finds/eguns.dm
diff --git a/code/modules/research/xenoarchaeology/finds/finds.dm b/code/modules/xenoarcheaology/finds/find_spawning.dm
similarity index 84%
rename from code/modules/research/xenoarchaeology/finds/finds.dm
rename to code/modules/xenoarcheaology/finds/find_spawning.dm
index 33cb2d52ff..3be0dfbca2 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 0000000000..ab5d00e786
--- /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 0000000000..060119c7ce
--- /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 90afe5a737..4037de5176 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 69aaac47c0..0baa9586dd 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 65f4b9f1fc..a6689e36b6 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 b2d8cef42c..c85c89ee49 100644
--- a/code/modules/research/xenoarchaeology/misc.dm
+++ b/code/modules/xenoarcheaology/misc.dm
@@ -1,12 +1,8 @@
-
-//---- Noticeboard
-
/obj/structure/noticeboard/anomaly
notices = 5
icon_state = "nboard05"
/obj/structure/noticeboard/anomaly/New()
- //add some memos
var/obj/item/weapon/paper/P = new()
P.name = "Memo RE: proper analysis procedure"
P.info = "
We keep test dummies in pens here for a reason, so standard procedure should be to activate newfound alien artifacts and place the two in close proximity. Promising items I might even approve monkey testing on."
@@ -42,22 +38,18 @@
P.overlays = list("paper_stamped_rd")
src.contents += P
-//---- Bookcase
-
/obj/structure/bookcase/manuals/xenoarchaeology
name = "Xenoarchaeology Manuals bookcase"
- New()
- ..()
- new /obj/item/weapon/book/manual/excavation(src)
- new /obj/item/weapon/book/manual/mass_spectrometry(src)
- new /obj/item/weapon/book/manual/materials_chemistry_analysis(src)
- new /obj/item/weapon/book/manual/anomaly_testing(src)
- new /obj/item/weapon/book/manual/anomaly_spectroscopy(src)
- new /obj/item/weapon/book/manual/stasis(src)
- update_icon()
-
-//---- Lockers and closets
+/obj/structure/bookcase/manuals/xenoarchaeology/New()
+ ..()
+ new /obj/item/weapon/book/manual/excavation(src)
+ new /obj/item/weapon/book/manual/mass_spectrometry(src)
+ new /obj/item/weapon/book/manual/materials_chemistry_analysis(src)
+ new /obj/item/weapon/book/manual/anomaly_testing(src)
+ new /obj/item/weapon/book/manual/anomaly_spectroscopy(src)
+ new /obj/item/weapon/book/manual/stasis(src)
+ update_icon()
/obj/structure/closet/secure_closet/xenoarchaeologist
name = "Xenoarchaeologist Locker"
@@ -69,17 +61,15 @@
icon_broken = "secureresbroken"
icon_off = "secureresoff"
- New()
- ..()
- sleep(2)
- new /obj/item/clothing/under/rank/scientist(src)
- new /obj/item/clothing/suit/storage/toggle/labcoat(src)
- new /obj/item/clothing/shoes/white(src)
- new /obj/item/clothing/glasses/science(src)
- new /obj/item/device/radio/headset/headset_sci(src)
- new /obj/item/weapon/storage/belt/archaeology(src)
- new /obj/item/weapon/storage/box/excavation(src)
- return
+/obj/structure/closet/secure_closet/xenoarchaeologist/New()
+ ..()
+ new /obj/item/clothing/under/rank/scientist(src)
+ new /obj/item/clothing/suit/storage/toggle/labcoat(src)
+ new /obj/item/clothing/shoes/white(src)
+ new /obj/item/clothing/glasses/science(src)
+ new /obj/item/device/radio/headset/headset_sci(src)
+ new /obj/item/weapon/storage/belt/archaeology(src)
+ new /obj/item/weapon/storage/excavation(src)
/obj/structure/closet/excavation
name = "Excavation tools"
@@ -87,27 +77,23 @@
icon_closed = "toolcloset"
icon_opened = "toolclosetopen"
- New()
- ..()
- sleep(2)
- new /obj/item/weapon/storage/belt/archaeology(src)
- new /obj/item/weapon/storage/box/excavation(src)
- new /obj/item/device/flashlight/lantern(src)
- new /obj/item/device/ano_scanner(src)
- new /obj/item/device/depth_scanner(src)
- new /obj/item/device/core_sampler(src)
- new /obj/item/device/gps(src)
- new /obj/item/device/beacon_locator(src)
- new /obj/item/device/radio/beacon(src)
- new /obj/item/clothing/glasses/meson(src)
- new /obj/item/weapon/pickaxe(src)
- new /obj/item/device/measuring_tape(src)
- new /obj/item/weapon/pickaxe/hand(src)
- new /obj/item/weapon/storage/bag/fossils(src)
- new /obj/item/weapon/hand_labeler(src)
- return
-
-//---- Isolation room air alarms
+/obj/structure/closet/excavation/New()
+ ..()
+ new /obj/item/weapon/storage/belt/archaeology(src)
+ new /obj/item/weapon/storage/excavation(src)
+ new /obj/item/device/flashlight/lantern(src)
+ new /obj/item/device/ano_scanner(src)
+ new /obj/item/device/depth_scanner(src)
+ new /obj/item/device/core_sampler(src)
+ new /obj/item/device/gps(src)
+ new /obj/item/device/beacon_locator(src)
+ new /obj/item/device/radio/beacon(src)
+ new /obj/item/clothing/glasses/meson(src)
+ new /obj/item/weapon/pickaxe(src)
+ new /obj/item/device/measuring_tape(src)
+ new /obj/item/weapon/pickaxe/hand(src)
+ new /obj/item/weapon/storage/bag/fossils(src)
+ new /obj/item/weapon/hand_labeler(src)
/obj/machinery/alarm/isolation
req_one_access = list(access_research, access_atmospherics, access_engine_equip)
diff --git a/code/modules/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm
new file mode 100644
index 0000000000..fa0d54a9a7
--- /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 fc50c956e7..85376724ea 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 0000000000..553b6674df
--- /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 912d0a062e..23ff59799e 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 3d440bf85a..c5bdfe015a 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 ad44c7d2ce..1ee02211cf 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 f6bbeed769..2913c1bbac 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 27b4801ae1..9d6450a839 100644
--- a/code/modules/research/xenoarchaeology/machinery/geosample_scanner.dm
+++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm
@@ -361,4 +361,4 @@
scanned_item = null
add_fingerprint(usr)
- return 1 // update UIs attached to this object
\ No newline at end of file
+ return 1 // update UIs attached to this object
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 6b77e800eb..c68d06a1ba 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 0000000000..42b8e692ec
--- /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 e8bedc0987..a8bf853e82 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/world.dm b/code/world.dm
index 68a066f27f..c2280c0dea 100644
--- a/code/world.dm
+++ b/code/world.dm
@@ -159,8 +159,8 @@ var/world_topic_spam_protect_time = world.timeofday
// This is dumb, but spacestation13.com's banners break if player count isn't the 8th field of the reply, so... this has to go here.
s["players"] = 0
- s["stationtime"] = worldtime2text()
- s["roundduration"] = round_duration_as_text()
+ s["stationtime"] = stationtime2text()
+ s["roundduration"] = roundduration2text()
if(input["status"] == "2")
var/list/players = list()
diff --git a/html/changelog.html b/html/changelog.html
index acc01778ea..094778be21 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -53,6 +53,71 @@
-->
+
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:
{{/if}}
-{{/if}}
\ No newline at end of file
+{{/if}}
diff --git a/polaris.dme b/polaris.dme
index b6e8eba5bb..4c7b6f3f53 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -21,7 +21,6 @@
#include "code\__defines\admin.dm"
#include "code\__defines\appearance.dm"
#include "code\__defines\atmos.dm"
-#include "code\__defines\btime.dm"
#include "code\__defines\chemistry.dm"
#include "code\__defines\damage_organs.dm"
#include "code\__defines\dna.dm"
@@ -38,6 +37,7 @@
#include "code\__defines\targeting.dm"
#include "code\__defines\turfs.dm"
#include "code\__defines\unit_tests.dm"
+#include "code\__defines\xenoarcheaology.dm"
#include "code\_compatibility\509\_JSON.dm"
#include "code\_compatibility\509\JSON Reader.dm"
#include "code\_compatibility\509\JSON Writer.dm"
@@ -152,7 +152,6 @@
#include "code\controllers\Processes\ticker.dm"
#include "code\controllers\Processes\turf.dm"
#include "code\controllers\Processes\vote.dm"
-#include "code\controllers\ProcessScheduler\core\_stubs.dm"
#include "code\controllers\ProcessScheduler\core\process.dm"
#include "code\controllers\ProcessScheduler\core\processScheduler.dm"
#include "code\datums\ai_law_sets.dm"
@@ -419,7 +418,6 @@
#include "code\game\gamemodes\technomancer\core_obj.dm"
#include "code\game\gamemodes\technomancer\equipment.dm"
#include "code\game\gamemodes\technomancer\instability.dm"
-#include "code\game\gamemodes\technomancer\presets.dm"
#include "code\game\gamemodes\technomancer\spell_objs.dm"
#include "code\game\gamemodes\technomancer\spell_objs_helpers.dm"
#include "code\game\gamemodes\technomancer\technomancer.dm"
@@ -1705,6 +1703,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"
@@ -1882,61 +1881,6 @@
#include "code\modules\research\rdmachines.dm"
#include "code\modules\research\research.dm"
#include "code\modules\research\server.dm"
-#include "code\modules\research\xenoarchaeology\chemistry.dm"
-#include "code\modules\research\xenoarchaeology\geosample.dm"
-#include "code\modules\research\xenoarchaeology\manuals.dm"
-#include "code\modules\research\xenoarchaeology\master_controller.dm"
-#include "code\modules\research\xenoarchaeology\misc.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_autocloner.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_crystal.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_gigadrill.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_replicator.dm"
-#include "code\modules\research\xenoarchaeology\artifact\artifact_unknown.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effect.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_affect_cold.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_badfeeling.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_cellcharge.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_celldrain.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_dnaswitch.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_emp.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_forcefield.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasco2.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasnitro.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasoxy.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gasplasma.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_gassleeping.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_goodfeeling.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heal.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_heat.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_hurt.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_radiate.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_roboheal.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_robohurt.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_sleepy.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_stun.dm"
-#include "code\modules\research\xenoarchaeology\artifact\effects\unknown_effect_teleport.dm"
-#include "code\modules\research\xenoarchaeology\finds\finds.dm"
-#include "code\modules\research\xenoarchaeology\finds\finds_defines.dm"
-#include "code\modules\research\xenoarchaeology\finds\finds_eguns.dm"
-#include "code\modules\research\xenoarchaeology\finds\finds_fossils.dm"
-#include "code\modules\research\xenoarchaeology\finds\finds_misc.dm"
-#include "code\modules\research\xenoarchaeology\finds\finds_special.dm"
-#include "code\modules\research\xenoarchaeology\finds\finds_talkingitem.dm"
-#include "code\modules\research\xenoarchaeology\machinery\artifact_analyser.dm"
-#include "code\modules\research\xenoarchaeology\machinery\artifact_harvester.dm"
-#include "code\modules\research\xenoarchaeology\machinery\artifact_scanner.dm"
-#include "code\modules\research\xenoarchaeology\machinery\coolant.dm"
-#include "code\modules\research\xenoarchaeology\machinery\geosample_scanner.dm"
-#include "code\modules\research\xenoarchaeology\tools\ano_device_battery.dm"
-#include "code\modules\research\xenoarchaeology\tools\anomaly_suit.dm"
-#include "code\modules\research\xenoarchaeology\tools\suspension_generator.dm"
-#include "code\modules\research\xenoarchaeology\tools\tools.dm"
-#include "code\modules\research\xenoarchaeology\tools\tools_anoscanner.dm"
-#include "code\modules\research\xenoarchaeology\tools\tools_coresampler.dm"
-#include "code\modules\research\xenoarchaeology\tools\tools_depthscanner.dm"
-#include "code\modules\research\xenoarchaeology\tools\tools_locater.dm"
-#include "code\modules\research\xenoarchaeology\tools\tools_pickaxe.dm"
#include "code\modules\scripting\Errors.dm"
#include "code\modules\scripting\IDE.dm"
#include "code\modules\scripting\Options.dm"
@@ -2043,6 +1987,58 @@
#include "code\modules\virus2\helpers.dm"
#include "code\modules\virus2\isolator.dm"
#include "code\modules\virus2\items_devices.dm"
+#include "code\modules\xenoarcheaology\boulder.dm"
+#include "code\modules\xenoarcheaology\effect.dm"
+#include "code\modules\xenoarcheaology\manuals.dm"
+#include "code\modules\xenoarcheaology\master_controller.dm"
+#include "code\modules\xenoarcheaology\misc.dm"
+#include "code\modules\xenoarcheaology\sampling.dm"
+#include "code\modules\xenoarcheaology\artifacts\artifact.dm"
+#include "code\modules\xenoarcheaology\artifacts\artifact_find.dm"
+#include "code\modules\xenoarcheaology\artifacts\autocloner.dm"
+#include "code\modules\xenoarcheaology\artifacts\crystal.dm"
+#include "code\modules\xenoarcheaology\artifacts\gigadrill.dm"
+#include "code\modules\xenoarcheaology\artifacts\replicator.dm"
+#include "code\modules\xenoarcheaology\effects\badfeeling.dm"
+#include "code\modules\xenoarcheaology\effects\cellcharge.dm"
+#include "code\modules\xenoarcheaology\effects\celldrain.dm"
+#include "code\modules\xenoarcheaology\effects\cold.dm"
+#include "code\modules\xenoarcheaology\effects\dnaswitch.dm"
+#include "code\modules\xenoarcheaology\effects\emp.dm"
+#include "code\modules\xenoarcheaology\effects\forcefield.dm"
+#include "code\modules\xenoarcheaology\effects\gasco2.dm"
+#include "code\modules\xenoarcheaology\effects\gasnitro.dm"
+#include "code\modules\xenoarcheaology\effects\gasoxy.dm"
+#include "code\modules\xenoarcheaology\effects\gasphoron.dm"
+#include "code\modules\xenoarcheaology\effects\gassleeping.dm"
+#include "code\modules\xenoarcheaology\effects\goodfeeling.dm"
+#include "code\modules\xenoarcheaology\effects\heal.dm"
+#include "code\modules\xenoarcheaology\effects\heat.dm"
+#include "code\modules\xenoarcheaology\effects\hurt.dm"
+#include "code\modules\xenoarcheaology\effects\radiate.dm"
+#include "code\modules\xenoarcheaology\effects\roboheal.dm"
+#include "code\modules\xenoarcheaology\effects\robohurt.dm"
+#include "code\modules\xenoarcheaology\effects\sleepy.dm"
+#include "code\modules\xenoarcheaology\effects\stun.dm"
+#include "code\modules\xenoarcheaology\effects\teleport.dm"
+#include "code\modules\xenoarcheaology\finds\eguns.dm"
+#include "code\modules\xenoarcheaology\finds\find_spawning.dm"
+#include "code\modules\xenoarcheaology\finds\finds.dm"
+#include "code\modules\xenoarcheaology\finds\finds_defines.dm"
+#include "code\modules\xenoarcheaology\finds\fossils.dm"
+#include "code\modules\xenoarcheaology\finds\misc.dm"
+#include "code\modules\xenoarcheaology\finds\special.dm"
+#include "code\modules\xenoarcheaology\finds\talking.dm"
+#include "code\modules\xenoarcheaology\tools\ano_device_battery.dm"
+#include "code\modules\xenoarcheaology\tools\artifact_analyser.dm"
+#include "code\modules\xenoarcheaology\tools\artifact_harvester.dm"
+#include "code\modules\xenoarcheaology\tools\artifact_scanner.dm"
+#include "code\modules\xenoarcheaology\tools\coolant_tank.dm"
+#include "code\modules\xenoarcheaology\tools\equipment.dm"
+#include "code\modules\xenoarcheaology\tools\geosample_scanner.dm"
+#include "code\modules\xenoarcheaology\tools\suspension_generator.dm"
+#include "code\modules\xenoarcheaology\tools\tools.dm"
+#include "code\modules\xenoarcheaology\tools\tools_pickaxe.dm"
#include "code\modules\xenobio2\_xeno_setup.dm"
#include "code\modules\xenobio2\controller.dm"
#include "code\modules\xenobio2\machinery\core_extractor.dm"