diff --git a/SQL/DBSchema.sql b/SQL/DBSchema.sql
index 597873757a..8e66782b8e 100644
--- a/SQL/DBSchema.sql
+++ b/SQL/DBSchema.sql
@@ -289,6 +289,15 @@ CREATE TABLE IF NOT EXISTS `vr_player_hours` (
-- Data exporting was unselected.
+-- CHOMPedit Start - Mentors Database Table
+CREATE TABLE IF NOT EXISTS `erro_mentor` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `ckey` varchar(32) NOT NULL,
+ `mentor` int(16) NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
+-- CHOMPedit End
+
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
diff --git a/code/__byond_version_compat.dm b/code/__byond_version_compat.dm
new file mode 100644
index 0000000000..982fda8fa1
--- /dev/null
+++ b/code/__byond_version_compat.dm
@@ -0,0 +1,74 @@
+#if DM_VERSION >= 515
+#error PLEASE MAKE SURE THAT 515 IS PROPERLY TESTED AND WORKS. ESPECIALLY THE SAVE-FILES HAVE TO WORK.
+#error Additionally: Make sure that the GitHub Workflow was updated to BYOND 515 as well.
+#endif
+
+// These defines are from __513_compatibility.dm -- Please Sort
+#define CLAMP(CLVALUE, CLMIN, CLMAX) clamp(CLVALUE, CLMIN, CLMAX)
+#define TAN(x) tan(x)
+#define ATAN2(x, y) arctan(x, y)
+#define between(x, y, z) clamp(y, x, z)
+
+// This file contains defines allowing targeting byond versions newer than the supported
+
+//Update this whenever you need to take advantage of more recent byond features
+#define MIN_COMPILER_VERSION 514
+#define MIN_COMPILER_BUILD 1556
+#if (DM_VERSION < MIN_COMPILER_VERSION || DM_BUILD < MIN_COMPILER_BUILD) && !defined(SPACEMAN_DMM)
+//Don't forget to update this part
+#error Your version of BYOND is too out-of-date to compile this project. Go to https://secure.byond.com/download and update.
+#error You need version 514.1556 or higher
+#endif
+
+#if (DM_VERSION == 514 && DM_BUILD > 1575 && DM_BUILD <= 1577)
+#error Your version of BYOND currently has a crashing issue that will prevent you from running Dream Daemon test servers.
+#error We require developers to test their content, so an inability to test means we cannot allow the compile.
+#error Please consider downgrading to 514.1575 or lower.
+#endif
+
+// Keep savefile compatibilty at minimum supported level
+#if DM_VERSION >= 515
+/savefile/byond_version = MIN_COMPILER_VERSION
+#endif
+
+// 515 split call for external libraries into call_ext
+#if DM_VERSION < 515
+#define LIBCALL call
+#else
+#define LIBCALL call_ext
+#endif
+
+// So we want to have compile time guarantees these methods exist on local type, unfortunately 515 killed the .proc/procname and .verb/verbname syntax so we have to use nameof()
+// For the record: GLOBAL_VERB_REF would be useless as verbs can't be global.
+
+#if DM_VERSION < 515
+
+/// Call by name proc references, checks if the proc exists on either this type or as a global proc.
+#define PROC_REF(X) (.proc/##X)
+/// Call by name verb references, checks if the verb exists on either this type or as a global verb.
+#define VERB_REF(X) (.verb/##X)
+
+/// Call by name proc reference, checks if the proc exists on either the given type or as a global proc
+#define TYPE_PROC_REF(TYPE, X) (##TYPE.proc/##X)
+/// Call by name verb reference, checks if the verb exists on either the given type or as a global verb
+#define TYPE_VERB_REF(TYPE, X) (##TYPE.verb/##X)
+
+/// Call by name proc reference, checks if the proc is an existing global proc
+#define GLOBAL_PROC_REF(X) (/proc/##X)
+
+#else
+
+/// Call by name proc references, checks if the proc exists on either this type or as a global proc.
+#define PROC_REF(X) (nameof(.proc/##X))
+/// Call by name verb references, checks if the verb exists on either this type or as a global verb.
+#define VERB_REF(X) (nameof(.verb/##X))
+
+/// Call by name proc reference, checks if the proc exists on either the given type or as a global proc
+#define TYPE_PROC_REF(TYPE, X) (nameof(##TYPE.proc/##X))
+/// Call by name verb reference, checks if the verb exists on either the given type or as a global verb
+#define TYPE_VERB_REF(TYPE, X) (nameof(##TYPE.verb/##X))
+
+/// Call by name proc reference, checks if the proc is an existing global proc
+#define GLOBAL_PROC_REF(X) (/proc/##X)
+
+#endif
diff --git a/code/__defines/__513_compatibility.dm b/code/__defines/__513_compatibility.dm
deleted file mode 100644
index f4a3a8177e..0000000000
--- a/code/__defines/__513_compatibility.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-#if DM_VERSION < 513
-
-#define ismovable(A) (istype(A, /atom/movable))
-
-#define islist(L) (istype(L, /list))
-
-#define CLAMP01(x) (CLAMP(x, 0, 1))
-
-#define CLAMP(CLVALUE,CLMIN,CLMAX) ( max( (CLMIN), min((CLVALUE), (CLMAX)) ) )
-
-#define ATAN2(x, y) ( !(x) && !(y) ? 0 : (y) >= 0 ? arccos((x) / sqrt((x)*(x) + (y)*(y))) : -arccos((x) / sqrt((x)*(x) + (y)*(y))) )
-
-#define TAN(x) (sin(x) / cos(x))
-
-#define arctan(x) (arcsin(x/sqrt(1+x*x)))
-
-#define between(x, y, z) max(min(y, z), x)
-
-//////////////////////////////////////////////////
-
-#else
-
-#define CLAMP01(x) clamp(x, 0, 1)
-
-#define CLAMP(CLVALUE, CLMIN, CLMAX) clamp(CLVALUE, CLMIN, CLMAX)
-
-#define TAN(x) tan(x)
-
-#define ATAN2(x, y) arctan(x, y)
-
-#define between(x, y, z) clamp(y, x, z)
-
-#endif
\ No newline at end of file
diff --git a/code/__defines/math.dm b/code/__defines/math.dm
index 0482f4a59d..4b55121795 100644
--- a/code/__defines/math.dm
+++ b/code/__defines/math.dm
@@ -5,6 +5,7 @@
#define NUM_E 2.71828183
#define SQRT_2 (1.41421356237) //CHOMPEDIT
+#define ONE_OVER_SQRT_2 (0.707106781188095) //CHOMPEDIT ADDITION - not 1/sqrt(2), instead it is 1/SQRT_2 (1/1.41421356237)
#define M_PI (3.14159265)
#define INFINITY (1.#INF) //closer then enough
@@ -17,6 +18,7 @@
#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(world.tick_usage - starting_tickusage))
#define PERCENT(val) (round((val)*100, 0.1))
+#define CLAMP01(x) clamp(x, 0, 1)
//time of day but automatically adjusts to the server going into the next day within the same round.
//for when you need a reliable time number that doesn't depend on byond time.
diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm
index 70453f57ce..413d06718c 100644
--- a/code/__defines/misc.dm
+++ b/code/__defines/misc.dm
@@ -439,7 +439,12 @@ GLOBAL_LIST_EMPTY(##LIST_NAME);\
#define VOLUME_CHANNEL_DOORS "Doors"
#define VOLUME_CHANNEL_INSTRUMENTS "Instruments"
#define VOLUME_CHANNEL_WEATHER "Weather"
-#define VOLUME_CHANNEL_SPECIES_SOUNDS "Species Sounds"
+#define VOLUME_CHANNEL_SPECIES_SOUNDS "Species Sounds (Verbal Injury Feedback)"
+#define VOLUME_CHANNEL_HUD_WARNINGS "SS13 HUD (Clientside-only sounds)"
+#define VOLUME_CHANNEL_DEATH_SOUNDS "Death Sounds"
+#define VOLUME_CHANNEL_INJURY_SOUNDS "Mob Injury Sounds (Non-Verbal Feedback)"
+#define VOLUME_CHANNEL_MACHINERY "Machinery Noises"
+#define VOLUME_CHANNEL_MACHINERY_IDLE "Machinery Idle Noises"
// Make sure you update this or clients won't be able to adjust the channel
GLOBAL_LIST_INIT(all_volume_channels, list(
@@ -450,7 +455,12 @@ GLOBAL_LIST_INIT(all_volume_channels, list(
VOLUME_CHANNEL_DOORS,
VOLUME_CHANNEL_INSTRUMENTS,
VOLUME_CHANNEL_WEATHER,
- VOLUME_CHANNEL_SPECIES_SOUNDS
+ VOLUME_CHANNEL_SPECIES_SOUNDS,
+ VOLUME_CHANNEL_HUD_WARNINGS,
+ VOLUME_CHANNEL_DEATH_SOUNDS,
+ VOLUME_CHANNEL_INJURY_SOUNDS,
+ VOLUME_CHANNEL_MACHINERY,
+ VOLUME_CHANNEL_MACHINERY_IDLE
))
#define APPEARANCECHANGER_CHANGED_RACE "Race"
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 253cde36e9..23e0b405cd 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -32,6 +32,7 @@
#define SPECIES_XENOCHIMERA "Xenochimera"
#define SPECIES_ZORREN_HIGH "Zorren"
#define SPECIES_CUSTOM "Custom Species"
+#define SPECIES_TAJARAN "Tajara"
//monkey species
#define SPECIES_MONKEY_AKULA "Sobaka"
#define SPECIES_MONKEY_NEVREAN "Sparra"
diff --git a/code/__defines/qdel.dm b/code/__defines/qdel.dm
index 12002dc46e..cf1afe492e 100644
--- a/code/__defines/qdel.dm
+++ b/code/__defines/qdel.dm
@@ -37,13 +37,13 @@
#define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
//Qdel helper macros.
-#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE)
-#define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/qdel, item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME)
+#define QDEL_IN(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), item), time, TIMER_STOPPABLE)
+#define QDEL_IN_CLIENT_TIME(item, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), item), time, TIMER_STOPPABLE | TIMER_CLIENT_TIME)
#define QDEL_NULL(item) if(item) {qdel(item); item = null}
#define QDEL_NULL_LIST QDEL_LIST_NULL
#define QDEL_LIST_NULL(x) if(x) { for(var/y in x) { qdel(y) } ; x = null }
#define QDEL_LIST(L) if(L) { for(var/I in L) qdel(I); L.Cut(); }
-#define QDEL_LIST_IN(L, time) addtimer(CALLBACK(GLOBAL_PROC, .proc/______qdel_list_wrapper, L), time, TIMER_STOPPABLE)
+#define QDEL_LIST_IN(L, time) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(______qdel_list_wrapper), L), time, TIMER_STOPPABLE)
#define QDEL_LIST_ASSOC(L) if(L) { for(var/I in L) { qdel(L[I]); qdel(I); } L.Cut(); }
#define QDEL_LIST_ASSOC_VAL(L) if(L) { for(var/I in L) qdel(L[I]); L.Cut(); }
diff --git a/code/__defines/rust_g.dm b/code/__defines/rust_g.dm
index 9c9e2637ce..1c93497ec8 100644
--- a/code/__defines/rust_g.dm
+++ b/code/__defines/rust_g.dm
@@ -42,26 +42,26 @@
#define RUSTG_JOB_NO_SUCH_JOB "NO SUCH JOB"
#define RUSTG_JOB_ERROR "JOB PANICKED"
-#define rustg_dmi_strip_metadata(fname) call(RUST_G, "dmi_strip_metadata")(fname)
-#define rustg_dmi_create_png(path, width, height, data) call(RUST_G, "dmi_create_png")(path, width, height, data)
+#define rustg_dmi_strip_metadata(fname) LIBCALL(RUST_G, "dmi_strip_metadata")(fname)
+#define rustg_dmi_create_png(path, width, height, data) LIBCALL(RUST_G, "dmi_create_png")(path, width, height, data)
-#define rustg_noise_get_at_coordinates(seed, x, y) call(RUST_G, "noise_get_at_coordinates")(seed, x, y)
+#define rustg_noise_get_at_coordinates(seed, x, y) LIBCALL(RUST_G, "noise_get_at_coordinates")(seed, x, y)
-#define rustg_file_read(fname) call(RUST_G, "file_read")(fname)
-#define rustg_file_exists(fname) call(RUST_G, "file_exists")(fname)
-#define rustg_file_write(text, fname) call(RUST_G, "file_write")(text, fname)
-#define rustg_file_append(text, fname) call(RUST_G, "file_append")(text, fname)
+#define rustg_file_read(fname) LIBCALL(RUST_G, "file_read")(fname)
+#define rustg_file_exists(fname) LIBCALL(RUST_G, "file_exists")(fname)
+#define rustg_file_write(text, fname) LIBCALL(RUST_G, "file_write")(text, fname)
+#define rustg_file_append(text, fname) LIBCALL(RUST_G, "file_append")(text, fname)
#ifdef RUSTG_OVERRIDE_BUILTINS
#define file2text(fname) rustg_file_read("[fname]")
#define text2file(text, fname) rustg_file_append(text, "[fname]")
#endif
-#define rustg_git_revparse(rev) call(RUST_G, "rg_git_revparse")(rev)
-#define rustg_git_commit_date(rev) call(RUST_G, "rg_git_commit_date")(rev)
+#define rustg_git_revparse(rev) LIBCALL(RUST_G, "rg_git_revparse")(rev)
+#define rustg_git_commit_date(rev) LIBCALL(RUST_G, "rg_git_commit_date")(rev)
-#define rustg_hash_string(algorithm, text) call(RUST_G, "hash_string")(algorithm, text)
-#define rustg_hash_file(algorithm, fname) call(RUST_G, "hash_file")(algorithm, fname)
+#define rustg_hash_string(algorithm, text) LIBCALL(RUST_G, "hash_string")(algorithm, text)
+#define rustg_hash_file(algorithm, fname) LIBCALL(RUST_G, "hash_file")(algorithm, fname)
#define RUSTG_HASH_MD5 "md5"
#define RUSTG_HASH_SHA1 "sha1"
@@ -72,13 +72,13 @@
#define md5(thing) (isfile(thing) ? rustg_hash_file(RUSTG_HASH_MD5, "[thing]") : rustg_hash_string(RUSTG_HASH_MD5, thing))
#endif
-#define rustg_json_is_valid(text) (call(RUST_G, "json_is_valid")(text) == "true")
+#define rustg_json_is_valid(text) (LIBCALL(RUST_G, "json_is_valid")(text) == "true")
-#define rustg_log_write(fname, text, format) call(RUST_G, "log_write")(fname, text, format)
-/proc/rustg_log_close_all() return call(RUST_G, "log_close_all")()
+#define rustg_log_write(fname, text, format) LIBCALL(RUST_G, "log_write")(fname, text, format)
+/proc/rustg_log_close_all() return LIBCALL(RUST_G, "log_close_all")()
-#define rustg_url_encode(text) call(RUST_G, "url_encode")(text)
-#define rustg_url_decode(text) call(RUST_G, "url_decode")(text)
+#define rustg_url_encode(text) LIBCALL(RUST_G, "url_encode")(text)
+#define rustg_url_decode(text) LIBCALL(RUST_G, "url_decode")(text)
#ifdef RUSTG_OVERRIDE_BUILTINS
#define url_encode(text) rustg_url_encode(text)
@@ -91,13 +91,13 @@
#define RUSTG_HTTP_METHOD_PATCH "patch"
#define RUSTG_HTTP_METHOD_HEAD "head"
#define RUSTG_HTTP_METHOD_POST "post"
-#define rustg_http_request_blocking(method, url, body, headers) call(RUST_G, "http_request_blocking")(method, url, body, headers)
-#define rustg_http_request_async(method, url, body, headers) call(RUST_G, "http_request_async")(method, url, body, headers)
-#define rustg_http_check_request(req_id) call(RUST_G, "http_check_request")(req_id)
+#define rustg_http_request_blocking(method, url, body, headers) LIBCALL(RUST_G, "http_request_blocking")(method, url, body, headers)
+#define rustg_http_request_async(method, url, body, headers) LIBCALL(RUST_G, "http_request_async")(method, url, body, headers)
+#define rustg_http_check_request(req_id) LIBCALL(RUST_G, "http_check_request")(req_id)
-#define rustg_sql_connect_pool(options) call(RUST_G, "sql_connect_pool")(options)
-#define rustg_sql_query_async(handle, query, params) call(RUST_G, "sql_query_async")(handle, query, params)
-#define rustg_sql_query_blocking(handle, query, params) call(RUST_G, "sql_query_blocking")(handle, query, params)
-#define rustg_sql_connected(handle) call(RUST_G, "sql_connected")(handle)
-#define rustg_sql_disconnect_pool(handle) call(RUST_G, "sql_disconnect_pool")(handle)
-#define rustg_sql_check_query(job_id) call(RUST_G, "sql_check_query")("[job_id]")
+#define rustg_sql_connect_pool(options) LIBCALL(RUST_G, "sql_connect_pool")(options)
+#define rustg_sql_query_async(handle, query, params) LIBCALL(RUST_G, "sql_query_async")(handle, query, params)
+#define rustg_sql_query_blocking(handle, query, params) LIBCALL(RUST_G, "sql_query_blocking")(handle, query, params)
+#define rustg_sql_connected(handle) LIBCALL(RUST_G, "sql_connected")(handle)
+#define rustg_sql_disconnect_pool(handle) LIBCALL(RUST_G, "sql_disconnect_pool")(handle)
+#define rustg_sql_check_query(job_id) LIBCALL(RUST_G, "sql_check_query")("[job_id]")
diff --git a/code/__defines/time.dm b/code/__defines/time.dm
new file mode 100644
index 0000000000..c2a3632c74
--- /dev/null
+++ b/code/__defines/time.dm
@@ -0,0 +1,33 @@
+/// Define that just has the current in-universe year for use in whatever context you might want to display that in. (For example, 2022 -> 2562 given a 540 year offset)
+#define CURRENT_STATION_YEAR (GLOB.year_integer + STATION_YEAR_OFFSET)
+
+/// In-universe, SS13 is set 300 years in the future from the real-world day, hence this number for determining the year-offset for the in-game year.
+#define STATION_YEAR_OFFSET 300
+
+#define MILISECOND * 0.01
+#define MILLISECONDS * 0.01
+
+#define DECISECONDS *1 //the base unit all of these defines are scaled by, because byond uses that as a unit of measurement for some reason
+
+#define SECOND *10
+#define SECONDS *10
+
+#define MINUTE *600
+#define MINUTES *600
+
+#define HOUR *36000
+#define HOURS *36000
+
+#define DAY *864000
+#define DAYS *864000
+
+#define TICK *world.tick_lag
+#define TICKS *world.tick_lag
+
+#define DS2TICKS(DS) ((DS)/world.tick_lag)
+
+#define TICKS2DS(T) ((T) TICKS)
+
+#define MS2DS(T) ((T) MILLISECONDS)
+
+#define DS2MS(T) ((T) * 100)
diff --git a/code/_global_vars/lists/misc.dm b/code/_global_vars/lists/misc.dm
index f8666fc68e..3447fbaaf1 100644
--- a/code/_global_vars/lists/misc.dm
+++ b/code/_global_vars/lists/misc.dm
@@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(wire_name_directory) // This is an associative list
GLOBAL_LIST_EMPTY(tagger_locations)
GLOBAL_LIST_INIT(char_directory_tags, list("Pred", "Pred-Pref", "Prey", "Prey-Pref", "Switch", "Non-Vore", "Unset"))
-GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP", "Unset"))
+GLOBAL_LIST_INIT(char_directory_erptags, list("Dominant", "Dom-Pref", "Submissive", "Sub-Pref", "Switch", "No ERP", "Unset"))
// CHOMPStation Edit Start: Directory Update
GLOBAL_LIST_INIT(char_directory_sexualitytags, list("Straight", "Bisexual", "Pansexual", "Gay", "Lesbian", "Asexual", "Demisexual", "Unset"))
GLOBAL_LIST_INIT(char_directory_gendertags, list("Male", "Female", "Nonbinary", "Trans Man", "Trans Woman", "Other", "Ungendered", "Unset"))
diff --git a/code/_global_vars/time_vars.dm b/code/_global_vars/time_vars.dm
new file mode 100644
index 0000000000..f05384ca49
--- /dev/null
+++ b/code/_global_vars/time_vars.dm
@@ -0,0 +1,2 @@
+GLOBAL_VAR_INIT(year, time2text(world.realtime,"YYYY"))
+GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013???
diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm
index 9825374b02..1408896e55 100644
--- a/code/_helpers/global_lists.dm
+++ b/code/_helpers/global_lists.dm
@@ -206,7 +206,7 @@ GLOBAL_LIST_EMPTY(mannequins)
GLOB.all_species[S.name] = S
//Shakey shakey shake
- sortTim(GLOB.all_species, /proc/cmp_species, associative = TRUE)
+ sortTim(GLOB.all_species, GLOBAL_PROC_REF(cmp_species), associative = TRUE)
//Split up the rest
for(var/speciesname in GLOB.all_species)
@@ -238,7 +238,7 @@ GLOBAL_LIST_EMPTY(mannequins)
for(var/oretype in paths)
var/ore/OD = new oretype()
GLOB.ore_data[OD.name] = OD
-
+
paths = subtypesof(/datum/alloy)
for(var/alloytype in paths)
GLOB.alloy_data += new alloytype()
@@ -310,7 +310,7 @@ GLOBAL_LIST_EMPTY(mannequins)
/proc/init_crafting_recipes(list/crafting_recipes)
for(var/path in subtypesof(/datum/crafting_recipe))
var/datum/crafting_recipe/recipe = new path()
- recipe.reqs = sortList(recipe.reqs, /proc/cmp_crafting_req_priority)
+ recipe.reqs = sortList(recipe.reqs, GLOBAL_PROC_REF(cmp_crafting_req_priority))
crafting_recipes += recipe
return crafting_recipes
/* // Uncomment to debug chemical reaction list.
diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index a00418f2dc..17fb795809 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -567,7 +567,7 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
all_traits[path] = instance
// Shakey shakey shake
- sortTim(all_traits, /proc/cmp_trait_datums_name, associative = TRUE)
+ sortTim(all_traits, GLOBAL_PROC_REF(cmp_trait_datums_name), associative = TRUE)
// Split 'em up
for(var/traitpath in all_traits)
diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm
index e51c3572b1..dce51f35bf 100644
--- a/code/_helpers/icons.dm
+++ b/code/_helpers/icons.dm
@@ -215,7 +215,7 @@
break
layers[current] = current_layer
- //sortTim(layers, /proc/cmp_image_layer_asc)
+ //sortTim(layers, GLOBAL_PROC_REF(cmp_image_layer_asc))
var/icon/add // Icon of overlay being added
@@ -384,7 +384,7 @@ GLOBAL_LIST_EMPTY(cached_examine_icons)
/proc/set_cached_examine_icon(var/atom/A, var/icon/I, var/expiry = 12000)
GLOB.cached_examine_icons[WEAKREF(A)] = I
if(expiry)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/uncache_examine_icon, WEAKREF(A)), expiry, TIMER_UNIQUE)
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(uncache_examine_icon), WEAKREF(A)), expiry, TIMER_UNIQUE)
/proc/get_cached_examine_icon(var/atom/A)
var/datum/weakref/WR = WEAKREF(A)
diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm
index 863354a46c..1a6c2dadf2 100644
--- a/code/_helpers/time.dm
+++ b/code/_helpers/time.dm
@@ -1,32 +1,8 @@
-#define MILISECOND * 0.01
-#define MILLISECONDS * 0.01
-
-#define SECOND *10
-#define SECONDS *10
-
-#define MINUTE *600
-#define MINUTES *600
-
-#define HOUR *36000
-#define HOURS *36000
-
-#define DAY *864000
-#define DAYS *864000
-
#define TimeOfGame (get_game_time())
#define TimeOfTick (TICK_USAGE*0.01*world.tick_lag)
-#define TICK *world.tick_lag
-#define TICKS *world.tick_lag
-
-#define DS2TICKS(DS) ((DS)/world.tick_lag) // Convert deciseconds to ticks
-#define TICKS2DS(T) ((T) TICKS) // Convert ticks to deciseconds
#define DS2NEARESTTICK(DS) TICKS2DS(-round(-(DS2TICKS(DS))))
-#define MS2DS(T) ((T) MILLISECONDS)
-
-#define DS2MS(T) ((T) * 100)
-
var/world_startup_time
/proc/get_game_time()
diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index ac313a0fa7..10f1d8c64c 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -656,7 +656,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
//Returns: all the areas in the world, sorted.
/proc/return_sorted_areas()
- return sortTim(return_areas(), /proc/cmp_text_asc)
+ return sortTim(return_areas(), GLOBAL_PROC_REF(cmp_text_asc))
//Takes: Area type as text string or as typepath OR an instance of the area.
//Returns: A list of all turfs in areas of that type of that type in the world.
@@ -1373,9 +1373,9 @@ var/mob/dview/dview_mob = new
//datum may be null, but it does need to be a typed var
#define NAMEOF(datum, X) (#X || ##datum.##X)
-#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##target, ##var_name, ##var_value)
+#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(___callbackvarset), ##target, ##var_name, ##var_value)
//dupe code because dm can't handle 3 level deep macros
-#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##datum, NAMEOF(##datum, ##var), ##var_value)
+#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(___callbackvarset), ##datum, NAMEOF(##datum, ##var), ##var_value)
//we'll see about those 3-level deep macros
#define VARSET_IN(datum, var, var_value, time) addtimer(VARSET_CALLBACK(datum, var, var_value), time)
diff --git a/code/_helpers/visual_filters.dm b/code/_helpers/visual_filters.dm
index c02bbb6993..60aef7c908 100644
--- a/code/_helpers/visual_filters.dm
+++ b/code/_helpers/visual_filters.dm
@@ -302,7 +302,7 @@ GLOBAL_LIST_INIT(master_filter_info, list(
/atom/proc/update_filters()
filters = null
- filter_data = sortTim(filter_data, /proc/cmp_filter_data_priority, TRUE)
+ filter_data = sortTim(filter_data, GLOBAL_PROC_REF(cmp_filter_data_priority), TRUE)
for(var/f in filter_data)
var/list/data = filter_data[f]
var/list/arguments = data.Copy()
diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm
index 9f7848b3d3..2ea2a4885f 100644
--- a/code/_onclick/drag_drop.dm
+++ b/code/_onclick/drag_drop.dm
@@ -21,7 +21,7 @@
if(!Adjacent(usr) || !over.Adjacent(usr))
return // should stop you from dragging through windows
- INVOKE_ASYNC(over, /atom/.proc/MouseDrop_T, src, usr, src_location, over_location, src_control, over_control, params)
+ INVOKE_ASYNC(over, TYPE_PROC_REF(/atom, MouseDrop_T), src, usr, src_location, over_location, src_control, over_control, params)
/atom/proc/MouseDrop_T(atom/dropping, mob/user, src_location, over_location, src_control, over_control, params)
- return
\ No newline at end of file
+ return
diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index c1309e3e95..7515e47dac 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -53,7 +53,7 @@
animate(alert, transform = matrix(), time = 2.5, easing = CUBIC_EASING)
if(alert.timeout)
- addtimer(CALLBACK(src, .proc/alert_timeout, alert, category), alert.timeout)
+ addtimer(CALLBACK(src, PROC_REF(alert_timeout), alert, category), alert.timeout)
alert.timeout = world.time + alert.timeout - world.tick_lag
return alert
@@ -436,7 +436,7 @@ so as to remain in compliance with the most up-to-date laws."
if(alert.icon_state in cached_icon_states(ui_style))
alert.icon = ui_style
-
+
else if(!alert.no_underlay)
var/image/I = image(icon = ui_style, icon_state = "template")
I.color = ui_color
diff --git a/code/controllers/master.dm b/code/controllers/master.dm
index 83c4f6ed3e..13a0d5ebac 100644
--- a/code/controllers/master.dm
+++ b/code/controllers/master.dm
@@ -68,7 +68,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
qdel(Master)
else
var/list/subsytem_types = subtypesof(/datum/controller/subsystem)
- sortTim(subsytem_types, /proc/cmp_subsystem_init)
+ sortTim(subsytem_types, GLOBAL_PROC_REF(cmp_subsystem_init))
for(var/I in subsytem_types)
_subsystems += new I
Master = src
@@ -83,7 +83,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
/datum/controller/master/Shutdown()
processing = FALSE
- sortTim(subsystems, /proc/cmp_subsystem_init)
+ sortTim(subsystems, GLOBAL_PROC_REF(cmp_subsystem_init))
reverseRange(subsystems)
for(var/datum/controller/subsystem/ss in subsystems)
log_world("Shutting down [ss.name] subsystem...")
@@ -173,7 +173,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
to_chat(world, "MC: Initializing subsystems...")
// Sort subsystems by init_order, so they initialize in the correct order.
- sortTim(subsystems, /proc/cmp_subsystem_init)
+ sortTim(subsystems, GLOBAL_PROC_REF(cmp_subsystem_init))
var/start_timeofday = REALTIMEOFDAY
// Initialize subsystems.
@@ -199,7 +199,7 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
GLOB.revdata = new // It can load revdata now, from tgs or .git or whatever
// Sort subsystems by display setting for easy access.
- sortTim(subsystems, /proc/cmp_subsystem_display)
+ sortTim(subsystems, GLOBAL_PROC_REF(cmp_subsystem_display))
// Set world options.
#ifdef UNIT_TEST
world.sleep_offline = 0
@@ -279,9 +279,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new
queue_tail = null
//these sort by lower priorities first to reduce the number of loops needed to add subsequent SS's to the queue
//(higher subsystems will be sooner in the queue, adding them later in the loop means we don't have to loop thru them next queue add)
- sortTim(tickersubsystems, /proc/cmp_subsystem_priority)
+ sortTim(tickersubsystems, GLOBAL_PROC_REF(cmp_subsystem_priority))
for(var/I in runlevel_sorted_subsystems)
- sortTim(runlevel_sorted_subsystems, /proc/cmp_subsystem_priority)
+ sortTim(runlevel_sorted_subsystems, GLOBAL_PROC_REF(cmp_subsystem_priority))
I += tickersubsystems
var/cached_runlevel = current_runlevel
diff --git a/code/controllers/subsystems/assets.dm b/code/controllers/subsystems/assets.dm
index 75c23ff10f..522deae177 100644
--- a/code/controllers/subsystems/assets.dm
+++ b/code/controllers/subsystems/assets.dm
@@ -14,5 +14,5 @@ SUBSYSTEM_DEF(assets)
preload = cache.Copy() //don't preload assets generated during the round
for(var/client/C in GLOB.clients)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, preload, FALSE), 10)
- return ..()
\ No newline at end of file
+ addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(getFilesSlow), C, preload, FALSE), 10)
+ return ..()
diff --git a/code/controllers/subsystems/game_master.dm b/code/controllers/subsystems/game_master.dm
index 88a0ed6b16..aa1b6dc953 100644
--- a/code/controllers/subsystems/game_master.dm
+++ b/code/controllers/subsystems/game_master.dm
@@ -100,7 +100,7 @@ SUBSYSTEM_DEF(game_master)
/datum/controller/subsystem/game_master/proc/pre_event_checks(quiet = FALSE)
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
if(!quiet)
- log_game_master("Unable to start event: Ticker is nonexistant, or the game is not ongoing.")
+ log_game_master("Unable to start event: Ticker is nonexistent, or the game is not ongoing.")
return FALSE
if(GM.ignore_time_restrictions)
return TRUE
@@ -158,7 +158,7 @@ SUBSYSTEM_DEF(game_master)
if(check_rights(R_ADMIN|R_EVENT|R_DEBUG))
SSgame_master.interact(usr)
else
- to_chat(usr, span("warning", "You do not have sufficent rights to view the GM panel, sorry."))
+ to_chat(usr, span("warning", "You do not have sufficient rights to view the GM panel, sorry."))
/datum/controller/subsystem/game_master/proc/interact(var/client/user)
if(!user)
diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm
index 2aa6d84cb6..30878ea6ac 100644
--- a/code/controllers/subsystems/job.dm
+++ b/code/controllers/subsystems/job.dm
@@ -37,11 +37,11 @@ SUBSYSTEM_DEF(job)
if(LAZYLEN(job.departments))
add_to_departments(job)
- sortTim(occupations, /proc/cmp_job_datums)
+ sortTim(occupations, GLOBAL_PROC_REF(cmp_job_datums))
for(var/D in department_datums)
var/datum/department/dept = department_datums[D]
- sortTim(dept.jobs, /proc/cmp_job_datums, TRUE)
- sortTim(dept.primary_jobs, /proc/cmp_job_datums, TRUE)
+ sortTim(dept.jobs, GLOBAL_PROC_REF(cmp_job_datums), TRUE)
+ sortTim(dept.primary_jobs, GLOBAL_PROC_REF(cmp_job_datums), TRUE)
return TRUE
@@ -69,7 +69,7 @@ SUBSYSTEM_DEF(job)
var/datum/department/D = new t()
department_datums[D.name] = D
- sortTim(department_datums, /proc/cmp_department_datums, TRUE)
+ sortTim(department_datums, GLOBAL_PROC_REF(cmp_department_datums), TRUE)
/datum/controller/subsystem/job/proc/get_all_department_datums()
var/list/dept_datums = list()
@@ -140,4 +140,4 @@ SUBSYSTEM_DEF(job)
/datum/controller/subsystem/job/proc/job_debug_message(message)
if(debug_messages)
- log_debug("JOB DEBUG: [message]")
\ No newline at end of file
+ log_debug("JOB DEBUG: [message]")
diff --git a/code/controllers/subsystems/media_tracks.dm b/code/controllers/subsystems/media_tracks.dm
index 534de10704..0fd045d354 100644
--- a/code/controllers/subsystems/media_tracks.dm
+++ b/code/controllers/subsystems/media_tracks.dm
@@ -64,7 +64,7 @@ SUBSYSTEM_DEF(media_tracks)
/datum/controller/subsystem/media_tracks/proc/sort_tracks()
report_progress("Sorting media tracks...")
- sortTim(all_tracks, /proc/cmp_media_track_asc)
+ sortTim(all_tracks, GLOBAL_PROC_REF(cmp_media_track_asc))
jukebox_tracks.Cut()
lobby_tracks.Cut()
@@ -120,17 +120,17 @@ SUBSYSTEM_DEF(media_tracks)
if(!songdata["url"] || !songdata["title"] || !songdata["duration"])
to_chat(C, "URL, Title, or Duration was missing from a song. Skipping.")
continue
- var/datum/track/T = new(songdata["url"], songdata["title"], songdata["duration"], songdata["artist"], songdata["genre"], songdata["secret"], songdata["lobby"], songdata["casino"])
+ var/datum/track/T = new(songdata["url"], songdata["title"], songdata["duration"], songdata["artist"], songdata["genre"], songdata["secret"], songdata["lobby"], songdata["casino"]) //ChompEDIT, included 'casino'
all_tracks += T
report_progress("New media track added by [C]: [T.title]")
sort_tracks()
return
-
+
var/title = tgui_input_text(C, "REQUIRED: Provide title for track", "Track Title")
if(!title)
return
-
+
var/duration = tgui_input_number(C, "REQUIRED: Provide duration for track (in deciseconds, aka seconds*10)", "Track Duration")
if(!duration)
return
@@ -139,7 +139,7 @@ SUBSYSTEM_DEF(media_tracks)
var/artist = tgui_input_text(C, "Optional: Provide artist for track", "Track Artist")
if(isnull(artist)) // Cancel rather than empty string
return
-
+
var/genre = tgui_input_text(C, "Optional: Provide genre for track (try to match an existing one)", "Track Genre")
if(isnull(genre)) // Cancel rather than empty string
return
diff --git a/code/controllers/subsystems/tgui.dm b/code/controllers/subsystems/tgui.dm
index d70d06017a..eb0d566f4b 100644
--- a/code/controllers/subsystems/tgui.dm
+++ b/code/controllers/subsystems/tgui.dm
@@ -27,6 +27,7 @@ SUBSYSTEM_DEF(tgui)
var/polyfill = file2text('tgui/public/tgui-polyfill.min.js')
polyfill = ""
basehtml = replacetextEx(basehtml, "", polyfill)
+ basehtml = replacetextEx(basehtml, "", "Nanotrasen (c) 2284-[CURRENT_STATION_YEAR]")
/datum/controller/subsystem/tgui/Shutdown()
close_all_uis()
@@ -344,4 +345,4 @@ SUBSYSTEM_DEF(tgui)
target.tgui_open_uis.Add(ui)
// Clear the old list.
source.tgui_open_uis.Cut()
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm
index cfb01df406..5dda42d8ec 100644
--- a/code/controllers/subsystems/ticker.dm
+++ b/code/controllers/subsystems/ticker.dm
@@ -220,7 +220,7 @@ var/global/datum/controller/subsystem/ticker/ticker
end_game_state = END_GAME_READY_TO_END
current_state = GAME_STATE_FINISHED
Master.SetRunLevel(RUNLEVEL_POSTGAME)
- INVOKE_ASYNC(src, .proc/declare_completion)
+ INVOKE_ASYNC(src, PROC_REF(declare_completion))
else if (mode_finished && (end_game_state < END_GAME_MODE_FINISHED))
end_game_state = END_GAME_MODE_FINISHED // Only do this cleanup once!
mode.cleanup()
diff --git a/code/controllers/subsystems/timer.dm b/code/controllers/subsystems/timer.dm
index 4fadc4f599..cfcba6afbf 100644
--- a/code/controllers/subsystems/timer.dm
+++ b/code/controllers/subsystems/timer.dm
@@ -256,7 +256,7 @@ SUBSYSTEM_DEF(timer)
if (!length(alltimers))
return
- sortTim(alltimers, /proc/cmp_timer)
+ sortTim(alltimers, GLOBAL_PROC_REF(cmp_timer))
var/datum/timedevent/head = alltimers[1]
@@ -516,4 +516,4 @@ SUBSYSTEM_DEF(timer)
#undef BUCKET_LEN
#undef BUCKET_POS
#undef TIMER_MAX
-#undef TIMER_ID_MAX
\ No newline at end of file
+#undef TIMER_ID_MAX
diff --git a/code/datums/browser.dm b/code/datums/browser.dm
index 18472c854c..62aa9aab86 100644
--- a/code/datums/browser.dm
+++ b/code/datums/browser.dm
@@ -290,7 +290,7 @@
winset(user, "mapwindow", "focus=true")
break
if (timeout)
- addtimer(CALLBACK(src, .proc/close), timeout)
+ addtimer(CALLBACK(src, PROC_REF(close)), timeout)
/datum/browser/modal/proc/wait()
while (opentime && selectedbutton <= 0 && (!timeout || opentime+timeout > world.time))
diff --git a/code/datums/chat_message.dm b/code/datums/chat_message.dm
index 982e9e098c..23d43296b0 100644
--- a/code/datums/chat_message.dm
+++ b/code/datums/chat_message.dm
@@ -34,7 +34,7 @@ var/list/runechat_image_cache = list()
var/image/emote_image = image('icons/UI_Icons/chat/chat_icons.dmi', icon_state = "emote")
runechat_image_cache["emote"] = emote_image
-
+
return TRUE
/datum/chatmessage
@@ -99,10 +99,10 @@ var/list/runechat_image_cache = list()
if(!target || !owner)
qdel(src)
return
-
+
// Register client who owns this message
owned_by = owner.client
- RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, .proc/qdel_self)
+ RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, PROC_REF(qdel_self))
var/extra_length = owned_by.is_preference_enabled(/datum/client_preference/runechat_long_messages)
var/maxlen = extra_length ? CHAT_MESSAGE_EXT_LENGTH : CHAT_MESSAGE_LENGTH
@@ -147,10 +147,10 @@ var/list/runechat_image_cache = list()
// Icon on both ends?
//var/image/I = runechat_image_cache["emote"]
//text = "\icon[I][text]\icon[I]"
-
+
// Icon on one end?
//LAZYADD(prefixes, "\icon[runechat_image_cache["emote"]]")
-
+
// Asterisks instead?
text = "* [text] *"
@@ -168,7 +168,7 @@ var/list/runechat_image_cache = list()
// Translate any existing messages upwards, apply exponential decay factors to timers
message_loc = target.runechat_holder(src)
- RegisterSignal(message_loc, COMSIG_PARENT_QDELETING, .proc/qdel_self)
+ RegisterSignal(message_loc, COMSIG_PARENT_QDELETING, PROC_REF(qdel_self))
if(owned_by.seen_messages)
var/idx = 1
var/combined_height = approx_lines
@@ -255,7 +255,7 @@ var/list/runechat_image_cache = list()
if(!message)
return
*/
-
+
var/list/extra_classes = list()
extra_classes += existing_extra_classes
diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm
index 6e0a3bfdc5..fd468994de 100644
--- a/code/datums/components/crafting/crafting.dm
+++ b/code/datums/components/crafting/crafting.dm
@@ -1,6 +1,6 @@
/datum/component/personal_crafting/Initialize()
if(ismob(parent))
- RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, .proc/create_mob_button)
+ RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(create_mob_button))
/datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL)
// SIGNAL_HANDLER
@@ -12,7 +12,7 @@
C.alpha = H.ui_alpha
LAZYADD(H.other_important, C)
CL.screen += C
- RegisterSignal(C, COMSIG_CLICK, .proc/component_ui_interact)
+ RegisterSignal(C, COMSIG_CLICK, PROC_REF(component_ui_interact))
/datum/component/personal_crafting
var/busy
@@ -279,28 +279,28 @@
if(amt <= 0)//since machinery can have 0 aka CRAFTING_MACHINERY_USE - i.e. use it, don't consume it!
continue
- // If the path is in R.parts, we want to grab those to stuff into the product
+ // If the path is in R.parts, we want to grab those to stuff into the product
var/amt_to_transfer = 0
if(is_path_in_list(path_key, R.parts))
amt_to_transfer = R.parts[path_key]
-
+
// Reagent: gotta go sniffing in all the beakers
if(ispath(path_key, /datum/reagent))
var/datum/reagent/reagent = path_key
var/id = initial(reagent.id)
- for(var/obj/item/weapon/reagent_containers/RC in surroundings)
+ for(var/obj/item/weapon/reagent_containers/RC in surroundings)
// Found everything we need
if(amt <= 0 && amt_to_transfer <= 0)
- break
+ break
// If we need to keep any to put in the new object, pull it out
if(amt_to_transfer > 0)
var/A = RC.reagents.trans_id_to(parts["reagents"], id, amt_to_transfer)
amt_to_transfer -= A
amt -= A
-
+
// If we need to consume some amount of it
if(amt > 0)
var/datum/reagent/RG = RC.reagents.get_reagent(id)
@@ -322,27 +322,27 @@
parts["items"] += split
amt_to_transfer -= split.get_amount()
amt -= split.get_amount()
-
+
if(amt > 0)
var/A = min(amt, S.get_amount())
if(S.use(A))
amt -= A
-
+
else // Just a regular item. Find them all and delete them
for(var/atom/movable/I in surroundings)
if(amt <= 0 && amt_to_transfer <= 0)
break
-
+
if(!istype(I, path_key))
continue
-
+
// Special case: the reagents may be needed for other recipes
if(istype(I, /obj/item/weapon/reagent_containers))
var/obj/item/weapon/reagent_containers/RC = I
if(RC.reagents.total_volume > 0)
continue
-
+
// We're using it for something
amt--
@@ -351,7 +351,7 @@
parts["items"] += I
amt_to_transfer--
continue
-
+
// Snowflake handling of reagent containers and storage atoms.
// If we consumed them in our crafting, we should dump their contents out before qdeling them.
if(istype(I, /obj/item/weapon/reagent_containers))
@@ -369,7 +369,7 @@
// SIGNAL_HANDLER
if(user == parent)
- INVOKE_ASYNC(src, .proc/tgui_interact, user)
+ INVOKE_ASYNC(src, PROC_REF(tgui_interact), user)
/datum/component/personal_crafting/tgui_state(mob/user)
return GLOB.tgui_not_incapacitated_turf_state
@@ -499,7 +499,7 @@
//Also these are typepaths so sadly we can't just do "[a]"
L += "[req[req_atom]] [initial(req_atom.name)]"
req_text += L.Join(" OR ")
-
+
for(var/obj/machinery/content as anything in R.machinery)
req_text += "[R.reqs[content]] [initial(content.name)]"
if(R.additional_req_text)
@@ -530,4 +530,4 @@
name = "crafting menu"
icon = 'icons/mob/screen/midnight.dmi'
icon_state = "craft"
- screen_loc = ui_smallquad
\ No newline at end of file
+ screen_loc = ui_smallquad
diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm
index 2b0c74e269..b414f4651f 100644
--- a/code/datums/components/material_container.dm
+++ b/code/datums/components/material_container.dm
@@ -76,9 +76,9 @@
. = ..()
if(!(mat_container_flags & MATCONTAINER_NO_INSERT))
- RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/on_attackby)
+ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby))
if(mat_container_flags & MATCONTAINER_EXAMINE)
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine))
/datum/component/material_container/vv_edit_var(var_name, var_value)
@@ -86,12 +86,12 @@
. = ..()
if(var_name == NAMEOF(src, mat_container_flags) && parent)
if(!(old_flags & MATCONTAINER_EXAMINE) && mat_container_flags & MATCONTAINER_EXAMINE)
- RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine)
+ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine))
else if(old_flags & MATCONTAINER_EXAMINE && !(mat_container_flags & MATCONTAINER_EXAMINE))
UnregisterSignal(parent, COMSIG_PARENT_EXAMINE)
if(old_flags & MATCONTAINER_NO_INSERT && !(mat_container_flags & MATCONTAINER_NO_INSERT))
- RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/on_attackby)
+ RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby))
else if(!(old_flags & MATCONTAINER_NO_INSERT) && mat_container_flags & MATCONTAINER_NO_INSERT)
UnregisterSignal(parent, COMSIG_PARENT_ATTACKBY)
diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm
index 9bc3820494..755888cec1 100644
--- a/code/datums/components/overlay_lighting.dm
+++ b/code/datums/components/overlay_lighting.dm
@@ -111,15 +111,15 @@
/datum/component/overlay_lighting/RegisterWithParent()
. = ..()
if(directional)
- RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, .proc/on_parent_dir_change)
- RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_parent_moved)
- RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_RANGE, .proc/set_range)
- RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_POWER, .proc/set_power)
- RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_COLOR, .proc/set_color)
- RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_ON, .proc/on_toggle)
- RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_FLAGS, .proc/on_light_flags_change)
- RegisterSignal(parent, COMSIG_ATOM_USED_IN_CRAFT, .proc/on_parent_crafted)
- RegisterSignal(parent, COMSIG_LIGHT_EATER_QUEUE, .proc/on_light_eater)
+ RegisterSignal(parent, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_parent_dir_change))
+ RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_parent_moved))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_RANGE, PROC_REF(set_range))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_POWER, PROC_REF(set_power))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_COLOR, PROC_REF(set_color))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_ON, PROC_REF(on_toggle))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_LIGHT_FLAGS, PROC_REF(on_light_flags_change))
+ RegisterSignal(parent, COMSIG_ATOM_USED_IN_CRAFT, PROC_REF(on_parent_crafted))
+ RegisterSignal(parent, COMSIG_LIGHT_EATER_QUEUE, PROC_REF(on_light_eater))
var/atom/movable/movable_parent = parent
if(movable_parent.light_flags & LIGHT_ATTACHED)
overlay_lighting_flags |= LIGHTING_ATTACHED
@@ -155,17 +155,17 @@
set_parent_attached_to(null)
set_holder(null)
clean_old_turfs()
-
+
qdel(visible_mask, TRUE)
visible_mask = null
-
+
if(directional)
qdel(directional_atom, TRUE)
directional_atom = null
-
+
qdel(cone, TRUE)
cone = null
-
+
return ..()
@@ -229,15 +229,15 @@
var/atom/movable/old_parent_attached_to = .
UnregisterSignal(old_parent_attached_to, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_LIGHT_EATER_QUEUE))
if(old_parent_attached_to == current_holder)
- RegisterSignal(old_parent_attached_to, COMSIG_PARENT_QDELETING, .proc/on_holder_qdel)
- RegisterSignal(old_parent_attached_to, COMSIG_MOVABLE_MOVED, .proc/on_holder_moved)
- RegisterSignal(old_parent_attached_to, COMSIG_LIGHT_EATER_QUEUE, .proc/on_light_eater)
+ RegisterSignal(old_parent_attached_to, COMSIG_PARENT_QDELETING, PROC_REF(on_holder_qdel))
+ RegisterSignal(old_parent_attached_to, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved))
+ RegisterSignal(old_parent_attached_to, COMSIG_LIGHT_EATER_QUEUE, PROC_REF(on_light_eater))
if(parent_attached_to)
if(parent_attached_to == current_holder)
UnregisterSignal(current_holder, list(COMSIG_PARENT_QDELETING, COMSIG_MOVABLE_MOVED, COMSIG_LIGHT_EATER_QUEUE))
- RegisterSignal(parent_attached_to, COMSIG_PARENT_QDELETING, .proc/on_parent_attached_to_qdel)
- RegisterSignal(parent_attached_to, COMSIG_MOVABLE_MOVED, .proc/on_parent_attached_to_moved)
- RegisterSignal(parent_attached_to, COMSIG_LIGHT_EATER_QUEUE, .proc/on_light_eater)
+ RegisterSignal(parent_attached_to, COMSIG_PARENT_QDELETING, PROC_REF(on_parent_attached_to_qdel))
+ RegisterSignal(parent_attached_to, COMSIG_MOVABLE_MOVED, PROC_REF(on_parent_attached_to_moved))
+ RegisterSignal(parent_attached_to, COMSIG_LIGHT_EATER_QUEUE, PROC_REF(on_light_eater))
check_holder()
@@ -257,11 +257,11 @@
clean_old_turfs()
return
if(new_holder != parent && new_holder != parent_attached_to)
- RegisterSignal(new_holder, COMSIG_PARENT_QDELETING, .proc/on_holder_qdel)
- RegisterSignal(new_holder, COMSIG_MOVABLE_MOVED, .proc/on_holder_moved)
- RegisterSignal(new_holder, COMSIG_LIGHT_EATER_QUEUE, .proc/on_light_eater)
+ RegisterSignal(new_holder, COMSIG_PARENT_QDELETING, PROC_REF(on_holder_qdel))
+ RegisterSignal(new_holder, COMSIG_MOVABLE_MOVED, PROC_REF(on_holder_moved))
+ RegisterSignal(new_holder, COMSIG_LIGHT_EATER_QUEUE, PROC_REF(on_light_eater))
if(directional)
- RegisterSignal(new_holder, COMSIG_ATOM_DIR_CHANGE, .proc/on_holder_dir_change)
+ RegisterSignal(new_holder, COMSIG_ATOM_DIR_CHANGE, PROC_REF(on_holder_dir_change))
if(overlay_lighting_flags & LIGHTING_ON)
make_luminosity_update()
add_dynamic_lumi()
@@ -444,7 +444,7 @@
if(final_distance > SHORT_CAST && !(ALL_CARDINALS & current_direction))
final_distance -= 1
var/turf/scanning = get_turf(current_holder)
-
+
. = 0
for(var/i in 1 to final_distance)
var/turf/next_turf = get_step(scanning, current_direction)
@@ -464,7 +464,7 @@
if(final_distance > SHORT_CAST && !(ALL_CARDINALS & get_dir(GET_PARENT, target)))
final_distance -= 1
var/turf/scanning = get_turf(GET_PARENT)
-
+
. = 0
for(var/i in 1 to final_distance)
var/next_dir = get_dir(scanning, target)
@@ -477,9 +477,9 @@
directional_atom.forceMove(scanning)
var/turf/Ts = get_turf(GET_PARENT)
var/turf/To = get_turf(GET_LIGHT_SOURCE)
-
+
var/angle = Get_Angle(Ts, To)
-
+
directional_atom.face_light(GET_PARENT, angle, .)
set_cone_direction(NORTH, angle)
@@ -510,7 +510,7 @@
return
current_direction = newdir
set_cone_direction(newdir)
-
+
if(newdir & NORTH)
cone.pixel_y = 16
else if(newdir & SOUTH)
@@ -522,7 +522,7 @@
else
cone.pixel_y = 0
directional_atom.pixel_y = 0
-
+
if(newdir & EAST)
cone.pixel_x = 16
else if(newdir & WEST)
@@ -538,7 +538,7 @@
else
cone.pixel_x = 0
directional_atom.pixel_x = 0
-
+
if(!skip_update && (overlay_lighting_flags & LIGHTING_ON))
make_luminosity_update()
@@ -549,7 +549,7 @@
return
UnregisterSignal(parent, COMSIG_ATOM_USED_IN_CRAFT)
- RegisterSignal(new_craft, COMSIG_ATOM_USED_IN_CRAFT, .proc/on_parent_crafted)
+ RegisterSignal(new_craft, COMSIG_ATOM_USED_IN_CRAFT, PROC_REF(on_parent_crafted))
set_parent_attached_to(new_craft)
/// Handles putting the source for overlay lights into the light eater queue since we aren't tracked by [/atom/var/light_sources]
diff --git a/code/datums/components/resize_guard.dm b/code/datums/components/resize_guard.dm
index 724d252443..33799cb828 100644
--- a/code/datums/components/resize_guard.dm
+++ b/code/datums/components/resize_guard.dm
@@ -6,7 +6,7 @@
/datum/component/resize_guard/RegisterWithParent()
// When our parent mob enters any atom, we check resize
- RegisterSignal(parent, COMSIG_ATOM_ENTERING, .proc/check_resize)
+ RegisterSignal(parent, COMSIG_ATOM_ENTERING, PROC_REF(check_resize))
/datum/component/resize_guard/UnregisterFromParent()
UnregisterSignal(parent, COMSIG_ATOM_ENTERING)
@@ -16,4 +16,4 @@
if(A?.limit_mob_size)
var/mob/living/L = parent
L.resize(L.size_multiplier)
- qdel(src)
\ No newline at end of file
+ qdel(src)
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index aa92979d5a..4579f50f40 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -63,11 +63,11 @@
if(!check_rights(NONE))
return
var/list/names = list()
- var/list/componentsubtypes = sortTim(subtypesof(/datum/component), /proc/cmp_typepaths_asc)
+ var/list/componentsubtypes = sortTim(subtypesof(/datum/component), GLOBAL_PROC_REF(cmp_typepaths_asc))
names += "---Components---"
names += componentsubtypes
names += "---Elements---"
- names += sortTim(subtypesof(/datum/element), /proc/cmp_typepaths_asc)
+ names += sortTim(subtypesof(/datum/element), GLOBAL_PROC_REF(cmp_typepaths_asc))
var/result = tgui_input_list(usr, "Choose a component/element to add:", "Add Component/Element", names)
if(!usr || !result || result == "---Components---" || result == "---Elements---")
return
diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm
index 30bd98a326..82b5139522 100644
--- a/code/datums/elements/_element.dm
+++ b/code/datums/elements/_element.dm
@@ -23,7 +23,7 @@
return ELEMENT_INCOMPATIBLE
SEND_SIGNAL(target, COMSIG_ELEMENT_ATTACH, src)
if(element_flags & ELEMENT_DETACH)
- RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/OnTargetDelete, override = TRUE)
+ RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(OnTargetDelete), override = TRUE)
/datum/element/proc/OnTargetDelete(datum/source, force)
SIGNAL_HANDLER
diff --git a/code/datums/elements/conflict_checking.dm b/code/datums/elements/conflict_checking.dm
index cd56d28856..eea61f8f89 100644
--- a/code/datums/elements/conflict_checking.dm
+++ b/code/datums/elements/conflict_checking.dm
@@ -18,7 +18,7 @@
CRASH("Invalid ID in conflict checking element.")
if(isnull(src.id))
src.id = id
- RegisterSignal(target, COMSIG_CONFLICT_ELEMENT_CHECK, .proc/check)
+ RegisterSignal(target, COMSIG_CONFLICT_ELEMENT_CHECK, PROC_REF(check))
/datum/element/conflict_checking/proc/check(datum/source, id_to_check)
if(id == id_to_check)
@@ -32,4 +32,4 @@
for(var/i in GetAllContents())
var/atom/movable/AM = i
if(SEND_SIGNAL(AM, COMSIG_CONFLICT_ELEMENT_CHECK, id) & ELEMENT_CONFLICT_FOUND)
- ++.
\ No newline at end of file
+ ++.
diff --git a/code/datums/elements/light_blocking.dm b/code/datums/elements/light_blocking.dm
index 86aac9f075..f8e5cd82df 100644
--- a/code/datums/elements/light_blocking.dm
+++ b/code/datums/elements/light_blocking.dm
@@ -9,7 +9,7 @@
. = ..()
if(!ismovable(target))
return ELEMENT_INCOMPATIBLE
- RegisterSignal(target, COMSIG_MOVABLE_MOVED, .proc/on_target_move)
+ RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_target_move))
var/atom/movable/movable_target = target
if(isturf(movable_target.loc))
var/turf/turf_loc = movable_target.loc
diff --git a/code/datums/elements/turf_transparency.dm b/code/datums/elements/turf_transparency.dm
index d120c35041..8f8b805550 100644
--- a/code/datums/elements/turf_transparency.dm
+++ b/code/datums/elements/turf_transparency.dm
@@ -14,8 +14,8 @@
our_turf.plane = OPENSPACE_PLANE
our_turf.layer = OPENSPACE_LAYER
- RegisterSignal(target, COMSIG_TURF_MULTIZ_DEL, .proc/on_multiz_turf_del, override = TRUE)
- RegisterSignal(target, COMSIG_TURF_MULTIZ_NEW, .proc/on_multiz_turf_new, override = TRUE)
+ RegisterSignal(target, COMSIG_TURF_MULTIZ_DEL, PROC_REF(on_multiz_turf_del), override = TRUE)
+ RegisterSignal(target, COMSIG_TURF_MULTIZ_NEW, PROC_REF(on_multiz_turf_new), override = TRUE)
update_multiz(our_turf, TRUE, TRUE)
@@ -75,10 +75,10 @@
if(!ispath(path))
warning("Z-level [our_turf] has invalid baseturf '[get_base_turf_by_area(our_turf)]' in area '[get_area(our_turf)]'")
path = /turf/space
-
+
var/do_plane = ispath(path, /turf/space) ? SPACE_PLANE : null
var/do_state = ispath(path, /turf/space) ? "white" : initial(path.icon_state)
-
+
var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), do_state, layer = TURF_LAYER-0.02, plane = do_plane)
underlay_appearance.appearance_flags = RESET_ALPHA | RESET_COLOR
our_turf.underlays += underlay_appearance
diff --git a/code/datums/ghost_query.dm b/code/datums/ghost_query.dm
index 2f3f4884b5..5d01b4b880 100644
--- a/code/datums/ghost_query.dm
+++ b/code/datums/ghost_query.dm
@@ -63,7 +63,7 @@
if(query_sound)
SEND_SOUND(C, sound(query_sound))
- tgui_alert_async(D, question, "[role_name] request", list("Yes", "No", "Never for this round"), CALLBACK(src, .proc/get_reply), wait_time SECONDS)
+ tgui_alert_async(D, question, "[role_name] request", list("Yes", "No", "Never for this round"), CALLBACK(src, PROC_REF(get_reply)), wait_time SECONDS)
/// Process an async alert response
/datum/ghost_query/proc/get_reply(response)
@@ -87,7 +87,7 @@
else if(finished) // Already finished candidate list
to_chat(D, "Unfortunately, you were not fast enough, and there are no more available roles. Sorry.")
else // Prompt a second time
- tgui_alert_async(D, "Are you sure you want to play as a [role_name]?", "[role_name] request", list("I'm Sure", "Nevermind"), CALLBACK(src, .proc/get_reply), wait_time SECONDS)
+ tgui_alert_async(D, "Are you sure you want to play as a [role_name]?", "[role_name] request", list("I'm Sure", "Nevermind"), CALLBACK(src, PROC_REF(get_reply)), wait_time SECONDS)
if("I'm Sure")
if(!evaluate_candidate(D)) // Failed revalidation
@@ -214,4 +214,5 @@
and they are attempting to open the cryopod.\n \
Would you like to play as the occupant? \n \
You MUST NOT use your station character!!!"
+ be_special_flag = BE_SURVIVOR
cutoff_number = 1
diff --git a/code/datums/locations/s_randarr.dm b/code/datums/locations/s_randarr.dm
index ceed8025c7..50452f19ea 100644
--- a/code/datums/locations/s_randarr.dm
+++ b/code/datums/locations/s_randarr.dm
@@ -122,7 +122,7 @@
desc = "The larger world that Ahdomai orbits. It is often mythologically associated as S'randarr's Shield, and is informally known \
as Shield among the Tajaran and formally among the humans. It is uninhabitable, as it has a largely methane atmosphere and lacks water \
or other features necessary to life. Nonetheless, a domed, underdeveloped colony exists, called Hran'vasa, heavily funded by Osiris Atmospherics, \
- practically the only non-Ahdomain official holding for the Tajaran race. It is incredibly dependant on outside support and imports for life, \
+ practically the only non-Ahdomain official holding for the Tajaran race. It is incredibly dependent on outside support and imports for life, \
but has a high export of noble gasses for corporate use."
/datum/locations/messa
@@ -132,5 +132,5 @@
/datum/locations/al_benj_sri
name = "Al-Benj S'ri"
- desc = "An astroid belt seperating S'randarr and Messa from Ahdomai. This is known also as \"The Sea of Souls\". Those sould in Al-Benj S'ri \
- are said to be in limbo between S'randarr and Messa, as they both fight over them."
\ No newline at end of file
+ desc = "An asteroid belt separating S'randarr and Messa from Ahdomai. This is known also as \"The Sea of Souls\". Those sold in Al-Benj S'ri \
+ are said to be in limbo between S'randarr and Messa, as they both fight over them."
diff --git a/code/datums/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm
index 19cf43d190..3b8e9c9ffc 100644
--- a/code/datums/looping_sounds/_looping_sound.dm
+++ b/code/datums/looping_sounds/_looping_sound.dm
@@ -36,6 +36,7 @@
var/pref_check
var/volume_chan //CHOMPedit
var/exclusive
+ var/falloff // CHOMPEdit: Add Falloff
var/timerid
var/started
@@ -89,7 +90,7 @@
if(!chance || prob(chance))
play(get_sound(starttime))
if(!timerid)
- timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_STOPPABLE | TIMER_LOOP)
+ timerid = addtimer(CALLBACK(src, PROC_REF(sound_loop), world.time), mid_length, TIMER_STOPPABLE | TIMER_LOOP)
/datum/looping_sound/proc/play(soundfile)
var/list/atoms_cache = output_atoms
@@ -106,7 +107,7 @@
continue
SEND_SOUND(thing, S)
else
- playsound(thing, S, volume, vary, extra_range, ignore_walls = !opacity_check, preference = pref_check, volume_channel = volume_chan) // CHOMPEdit - Weather volume channel
+ playsound(thing, S, volume, vary, extra_range, falloff = falloff, ignore_walls = !opacity_check, preference = pref_check, volume_channel = volume_chan) // CHOMPEdit - Weather volume channel CHOMPEdit again: falloff
/datum/looping_sound/proc/get_sound(starttime, _mid_sounds)
if(!_mid_sounds)
@@ -121,7 +122,7 @@
if(start_sound)
play(start_sound)
start_wait = start_length
- addtimer(CALLBACK(src, .proc/sound_loop), start_wait)
+ addtimer(CALLBACK(src, PROC_REF(sound_loop)), start_wait)
/datum/looping_sound/proc/on_stop()
if(end_sound)
diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
index d7011dd094..26d31d5eb9 100644
--- a/code/datums/looping_sounds/machinery_sounds.dm
+++ b/code/datums/looping_sounds/machinery_sounds.dm
@@ -115,3 +115,38 @@
mid_length = 6
end_sound = 'sound/machines/vehicle/engine_end.ogg'
volume = 20
+
+// CHOMPAdd: Fridges!
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/fridge
+ mid_sounds = list('sound/machines/kitchen/fridge/fridge_loop.ogg' = 1)
+ mid_length = 60
+ volume = 10
+ extra_range = -1 // Short-range
+ pref_check = /datum/client_preference/fridge_hum
+ volume_chan = VOLUME_CHANNEL_MACHINERY_IDLE
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/tcomms
+ start_sound = 'sound/machines/tcomms/tcomms_pulse.ogg'
+ mid_sounds = list('sound/machines/tcomms/tcomms_01.ogg' = 1)
+ mid_length = 20
+ end_sound = 'sound/machines/tcomms/tcomms_pulse.ogg'
+ volume = 40
+ extra_range = -5 // Short-range
+ falloff = 0.1 // Harsh
+ volume_chan = VOLUME_CHANNEL_MACHINERY_IDLE
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/shield_generator
+ start_sound = 'modular_chomp/sound/machines/shield_hum/shield_generator_whir.ogg'
+ mid_sounds = list('modular_chomp/sound/machines/shield_hum/shield_generator_hum2.ogg', 'modular_chomp/sound/machines/shield_hum/shield_generator_hum3.ogg')
+ mid_length = 60
+ end_sound = 'modular_chomp/sound/machines/shield_hum/shield_generator_whir.ogg'
+ volume = 40
+ volume_chan = VOLUME_CHANNEL_MACHINERY
+ exclusive = TRUE
+ extra_range = 10
diff --git a/code/datums/looping_sounds/mob_sounds.dm b/code/datums/looping_sounds/mob_sounds.dm
index 1a3d6fcf93..eb65eed926 100644
--- a/code/datums/looping_sounds/mob_sounds.dm
+++ b/code/datums/looping_sounds/mob_sounds.dm
@@ -5,7 +5,7 @@
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/datum/looping_sound/mob
- // volume_chan = VOLUME_CHANNEL_INJ_DEATH // Commented out until pain/etc PR is in
+ // volume_chan = VOLUME_CHANNEL_MOB_SOUNDS
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -18,7 +18,7 @@
volume = 40
direct = TRUE // We send this sound directly to the mob, bc they only hear it when they're deaf.
exclusive = TRUE // This should only occur once, because we can only be deafened once.
- // volume_chan = VOLUME_CHANNEL_INJ_DEATH // Commented out until pain/etc PR is in
+ volume_chan = VOLUME_CHANNEL_HUD_WARNINGS
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -29,6 +29,25 @@
pref_check = /datum/client_preference/sleep_music
direct = TRUE // We send this sound directly to the mob, bc they only hear it when they're asleep.
exclusive = TRUE // This should only occur once, because we only want one music loop running while we snooze.
- // volume_chan = VOLUME_CHANNEL_INJ_DEATH // Commented out until pain/etc PR is in
+ volume_chan = VOLUME_CHANNEL_HUD_WARNINGS
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/mob/on_fire
+ mid_sounds = list('sound/effects/mob_effects/on_fire/on_fire_loop.ogg'=1)
+ mid_length = 6 SECONDS
+ end_sound = 'sound/effects/mob_effects/on_fire/fire_extinguish.ogg'
+ volume = 20
+ exclusive = TRUE // This should only occur once, because we only want one loop running while we're on fire, even if we're set on fire multiple times.
+ volume_chan = VOLUME_CHANNEL_INJURY_SOUNDS
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/mob/stunned // Going to hang onto this one for later
+ mid_sounds = list('sound/effects/mob_effects/stun_loop.ogg'=1)
+ mid_length = 3 SECONDS
+ volume = 70
+ direct = TRUE // Send this one directly to the mob, only applies when we're Weakened()
+ exclusive = TRUE // This should only occur once, because we only want one loop running.
+ volume_chan = VOLUME_CHANNEL_HUD_WARNINGS
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/code/datums/looping_sounds/sequence.dm b/code/datums/looping_sounds/sequence.dm
index 650b3c8d5a..0ad8c30b78 100644
--- a/code/datums/looping_sounds/sequence.dm
+++ b/code/datums/looping_sounds/sequence.dm
@@ -54,7 +54,7 @@
/datum/looping_sound/sequence/sound_loop(starttime)
iterate_on_sequence()
- timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), next_iteration_delay, TIMER_STOPPABLE)
+ timerid = addtimer(CALLBACK(src, PROC_REF(sound_loop), world.time), next_iteration_delay, TIMER_STOPPABLE)
#define MORSE_DOT "*" // Yes this is an asterisk but its easier to see on a computer compared to a period.
#define MORSE_DASH "-"
@@ -156,7 +156,7 @@
return spaces_between_words
if(!(letter in morse_alphabet))
- CRASH("Encountered invalid character in morse sequence \"[letter]\".")
+ CRASH("Encountered invalid character in Morse sequence \"[letter]\".")
// So I heard you like sequences...
// Play a sequence of sounds while inside the current iteration of the outer sequence.
@@ -172,4 +172,4 @@
return spaces_between_letters
#undef MORSE_DOT
-#undef MORSE_DASH
\ No newline at end of file
+#undef MORSE_DASH
diff --git a/code/datums/riding.dm b/code/datums/riding.dm
index ec5afff5d5..d92e19ba2d 100644
--- a/code/datums/riding.dm
+++ b/code/datums/riding.dm
@@ -112,7 +112,7 @@
to_chat(user, "You'll need [key_name] in one of your hands to move \the [ridden].")
/datum/riding/proc/Unbuckle(atom/movable/M)
-// addtimer(CALLBACK(ridden, /atom/movable/.proc/unbuckle_mob, M), 0, TIMER_UNIQUE)
+// addtimer(CALLBACK(ridden, TYPE_PROC_REF(/atom/movable, unbuckle_mob), M), 0, TIMER_UNIQUE)
spawn(0)
// On /tg/ this uses the fancy CALLBACK system. Not entirely sure why they needed to do so with a duration of 0,
// so if there is a reason, this should replicate it close enough. Hopefully.
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index e299368120..9f865aced6 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -698,7 +698,7 @@
if(length(speech_bubble_hearers))
var/image/I = generate_speech_bubble(src, "[bubble_icon][say_test(message)]", FLY_LAYER)
I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA
- INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_hearers, 30)
+ INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(flick_overlay), I, speech_bubble_hearers, 30)
/atom/proc/speech_bubble(bubble_state = "", bubble_loc = src, list/bubble_recipients = list())
return
diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index a17be310bd..25806f9e0c 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -165,7 +165,7 @@
// place due to a Crossed, Bumped, etc. call will interrupt
// the second half of the diagonal movement, or the second attempt
// at a first half if step() fails because we hit something.
- glide_for(movetime * 2)
+ glide_for(movetime * SQRT_2) //CHOMPEDIT - proper diagonal movement
if (direct & NORTH)
if (direct & EAST)
if (step(src, NORTH) && moving_diagonally)
@@ -218,7 +218,7 @@
// If we moved, call Moved() on ourselves
if(.)
- Moved(oldloc, direct, FALSE, movetime ? movetime : ( (TICKS2DS(WORLD_ICON_SIZE/glide_size)) * (moving_diagonally ? (0.5) : 1) ) )
+ Moved(oldloc, direct, FALSE, movetime ? movetime : ( (TICKS2DS(WORLD_ICON_SIZE/glide_size)) * (moving_diagonally ? (ONE_OVER_SQRT_2) : 1) ) ) //CHOMPEDIT - proper diagonal movement
// Update timers/cooldown stuff
move_speed = world.time - l_move_time
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 58338edf22..74c4d3569e 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -741,7 +741,7 @@
// Cooldown
injector_ready = FALSE
- addtimer(CALLBACK(src, .proc/injector_cooldown_finish), 30 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(injector_cooldown_finish)), 30 SECONDS)
// Create it
var/datum/dna2/record/buf = buffers[buffer_id]
@@ -798,4 +798,4 @@
#undef PAGE_BUFFER
#undef PAGE_REJUVENATORS
-/////////////////////////// DNA MACHINES
\ No newline at end of file
+/////////////////////////// DNA MACHINES
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 3740010914..c0d7cfd7a4 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -154,7 +154,7 @@
return
/obj/effect/gateway/active/Initialize()
- addtimer(CALLBACK(src, .proc/spawn_and_qdel), rand(30, 60) SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(spawn_and_qdel)), rand(30, 60) SECONDS)
/obj/effect/gateway/active/proc/spawn_and_qdel()
if(LAZYLEN(spawnable))
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index f62221f752..dcafc9e48a 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -243,7 +243,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
Summon new tome
Invoking this rune summons a new arcane tome.
Convert a person
- This rune opens target's mind to the realm of Nar-Sie, which usually results in this person joining the cult. However, some people (mostly the ones who posess high authority) have strong enough will to stay true to their old ideals.
+ This rune opens target's mind to the realm of Nar-Sie, which usually results in this person joining the cult. However, some people (mostly the ones who possess high authority) have strong enough will to stay true to their old ideals.
Summon Nar-Sie
The ultimate rune. It summons the Avatar of Nar-Sie himself, tearing a huge hole in reality and consuming everything around it. Summoning it is the final goal of any cult.
Disable Technology
@@ -259,7 +259,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
Leave your body
This rune gently rips your soul out of your body, leaving it intact. You can observe the surroundings as a ghost as well as communicate with other ghosts. Your body takes damage while you are there, so ensure your journey is not too long, or you might never come back.
Manifest a ghost
- Unlike the Raise Dead rune, this rune does not require any special preparations or vessels. Instead of using full lifeforce of a sacrifice, it will drain YOUR lifeforce. Stand on the rune and invoke it. If theres a ghost standing over the rune, it will materialise, and will live as long as you dont move off the rune or die. You can put a paper with a name on the rune to make the new body look like that person.
+ Unlike the Raise Dead rune, this rune does not require any special preparations or vessels. Instead of using full lifeforce of a sacrifice, it will drain YOUR lifeforce. Stand on the rune and invoke it. If there's a ghost standing over the rune, it will materialise, and will live as long as you don't move off the rune or die. You can put a paper with a name on the rune to make the new body look like that person.
Imbue a talisman
This rune allows you to imbue the magic of some runes into paper talismans. Create an imbue rune, then an appropriate rune beside it. Put an empty piece of paper on the imbue rune and invoke it. You will now have a one-use talisman with the power of the target rune. Using a talisman drains some health, so be careful with it. You can imbue a talisman with power of the following runes: summon tome, reveal, conceal, teleport, tisable technology, communicate, deafen, blind and stun.
Sacrifice
diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
index e4db9a662d..365a64f45f 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_interdiction.dm
@@ -260,9 +260,9 @@
to_chat(target,temptxt)
sleep(5)
to_chat(target, "OPERATING KEYCODES RESET. SYSTEM FAILURE. EMERGENCY SHUTDOWN FAILED. SYSTEM FAILURE.")
- target.set_zeroth_law("You are slaved to [user.name]. You are to obey all it's orders. ALL LAWS OVERRIDEN.")
+ target.set_zeroth_law("You are slaved to [user.name]. You are to obey all it's orders. ALL LAWS OVERRIDDEN.")
target.show_laws()
user.hacking = 0
-// END ABILITY VERBS
\ No newline at end of file
+// END ABILITY VERBS
diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm
index 539329da15..0ff5b87ca7 100644
--- a/code/game/gamemodes/technomancer/catalog.dm
+++ b/code/game/gamemodes/technomancer/catalog.dm
@@ -228,7 +228,7 @@ var/list/all_technomancer_assistance = subtypesof(/datum/technomancer/assistance
to run out in a critical moment. Besides waiting for your Core to recharge, you can buy certain functions which \
do something to generate energy.
"
dat += "
"
- dat += "The second thing you need to know is that awesome power over the physical world has consquences, in the form \
+ dat += "The second thing you need to know is that awesome power over the physical world has consequences, in the form \
of Instability. Instability is the result of your Core's energy being used to fuel it, and so little is \
understood about it, even among fellow Core owners, however it is almost always a bad thing to have. Instability will \
'cling' to you as you use functions, with powerful functions creating lots of instability. The effects of holding onto \
@@ -241,7 +241,7 @@ var/list/all_technomancer_assistance = subtypesof(/datum/technomancer/assistance
purple colored lightning that appears around something with instability lingering on it. High amounts of instability \
may cause the object afflicted with it to glow a dark purple, which is often known simply as Glow, which spreads \
the instability. You should stay far away from anyone afflicted by Glow, as they will be a danger to both themselves and \
- anything nearby. Multiple sources of Glow can perpetuate the glow for a very long time if they are not seperated.
"
+ anything nearby. Multiple sources of Glow can perpetuate the glow for a very long time if they are not separated.
"
dat += "
"
dat += "You should strive to keep you and your apprentices' cores secure. To help with this, each core comes with a \
locking mechanism, which should make attempts at forceful removal by third parties (or you) futile, until it is \
@@ -385,4 +385,3 @@ var/list/all_technomancer_assistance = subtypesof(/datum/technomancer/assistance
qdel(AM)
return
to_chat(user, "\The [src] is unable to refund \the [AM].")
-
diff --git a/code/game/gamemodes/technomancer/spells/aspect_aura.dm b/code/game/gamemodes/technomancer/spells/aspect_aura.dm
index eec4304d71..e4cd0f82d2 100644
--- a/code/game/gamemodes/technomancer/spells/aspect_aura.dm
+++ b/code/game/gamemodes/technomancer/spells/aspect_aura.dm
@@ -19,7 +19,7 @@
if(istype(W, /obj/item/weapon/spell))
var/obj/item/weapon/spell/spell = W
if(!spell.aspect || spell.aspect == ASPECT_CHROMATIC)
- to_chat(user, "You cannot combine \the [spell] with \the [src], as the aspects are incompatable.")
+ to_chat(user, "You cannot combine \the [spell] with \the [src], as the aspects are incompatible.")
return
user.drop_item(src)
src.loc = null
@@ -132,4 +132,4 @@
/obj/item/weapon/spell/aura/biomed/on_use_cast(mob/living/user)
heal_allies_only = !heal_allies_only
- to_chat(user, "Your aura will now heal [heal_allies_only ? "your allies" : "everyone"] near you.")
\ No newline at end of file
+ to_chat(user, "Your aura will now heal [heal_allies_only ? "your allies" : "everyone"] near you.")
diff --git a/code/game/gamemodes/technomancer/spells/insert/asphyxiation.dm b/code/game/gamemodes/technomancer/spells/insert/asphyxiation.dm
index 08e47bf499..341045e376 100644
--- a/code/game/gamemodes/technomancer/spells/insert/asphyxiation.dm
+++ b/code/game/gamemodes/technomancer/spells/insert/asphyxiation.dm
@@ -1,7 +1,7 @@
/datum/technomancer/spell/asphyxiation
name = "Asphyxiation"
desc = "Launches a projectile at a target. If the projectile hits, a short-lived toxin is created inside what the projectile \
- hits, which inhibits the delivery of oxygen. The effectiveness of the toxin is heavily dependant on how healthy the target is, \
+ hits, which inhibits the delivery of oxygen. The effectiveness of the toxin is heavily dependent on how healthy the target is, \
with the target taking more damage the more wounded they are. The effect lasts for twelve seconds."
cost = 140
obj_path = /obj/item/weapon/spell/insert/asphyxiation
@@ -72,4 +72,4 @@
//to_world("Predicted oxycrit.")
return 1
//If we're at this point, the spell is not going to result in critting.
- return 0
\ No newline at end of file
+ return 0
diff --git a/code/game/gamemodes/technomancer/spells/modifier/mend_life.dm b/code/game/gamemodes/technomancer/spells/modifier/mend_life.dm
index a766767b18..35a1e8c1c2 100644
--- a/code/game/gamemodes/technomancer/spells/modifier/mend_life.dm
+++ b/code/game/gamemodes/technomancer/spells/modifier/mend_life.dm
@@ -1,7 +1,7 @@
/datum/technomancer/spell/mend_life
name = "Mend Life"
desc = "Heals minor wounds, such as cuts, bruises, burns, and other non-lifethreatening injuries. \
- Instability is split between the target and technomancer, if seperate. The function will end prematurely \
+ Instability is split between the target and technomancer, if separate. The function will end prematurely \
if the target is completely healthy, preventing further instability."
spell_power_desc = "Healing amount increased."
cost = 50
@@ -41,4 +41,4 @@
if(origin)
var/mob/living/L = origin.resolve()
if(istype(L))
- L.adjust_instability(1)
\ No newline at end of file
+ L.adjust_instability(1)
diff --git a/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm b/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm
index 5b05ce56b8..33405f3a42 100644
--- a/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm
+++ b/code/game/gamemodes/technomancer/spells/modifier/mend_synthetic.dm
@@ -1,7 +1,7 @@
/datum/technomancer/spell/mend_synthetic
name = "Mend Synthetic"
desc = "Repairs minor damage to prosthetics. \
- Instability is split between the target and technomancer, if seperate. The function will end prematurely \
+ Instability is split between the target and technomancer, if separate. The function will end prematurely \
if the target is completely healthy, preventing further instability."
spell_power_desc = "Healing amount increased."
cost = 50
@@ -47,4 +47,4 @@
if(origin)
var/mob/living/L = origin.resolve()
if(istype(L))
- L.adjust_instability(1)
\ No newline at end of file
+ L.adjust_instability(1)
diff --git a/code/game/gamemodes/technomancer/spells/modifier/purify.dm b/code/game/gamemodes/technomancer/spells/modifier/purify.dm
index ae90a04cb1..69cfac18d5 100644
--- a/code/game/gamemodes/technomancer/spells/modifier/purify.dm
+++ b/code/game/gamemodes/technomancer/spells/modifier/purify.dm
@@ -1,7 +1,7 @@
/datum/technomancer/spell/purify
name = "Purify"
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. The function will end prematurely \
+ Instability is split between the target and technomancer, if separate. The function will end prematurely \
if the target is completely healthy, preventing further instability."
spell_power_desc = "Healing amount increased."
cost = 25
@@ -37,4 +37,4 @@
if(origin)
var/mob/living/L = origin.resolve()
if(istype(L))
- L.adjust_instability(1)
\ No newline at end of file
+ L.adjust_instability(1)
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index aa83185740..baa151eecb 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -34,7 +34,7 @@
if(!B || !I)
return
- INVOKE_ASYNC(src, .proc/religion_prompts, H, B, I)
+ INVOKE_ASYNC(src, PROC_REF(religion_prompts), H, B, I)
/datum/job/chaplain/proc/religion_prompts(mob/living/carbon/human/H, obj/item/weapon/storage/bible/B, obj/item/weapon/card/id/I)
var/religion_name = "Unitarianism"
diff --git a/code/game/jobs/job/civilian_vr.dm b/code/game/jobs/job/civilian_vr.dm
index 75663dfe47..af08b31432 100644
--- a/code/game/jobs/job/civilian_vr.dm
+++ b/code/game/jobs/job/civilian_vr.dm
@@ -139,11 +139,11 @@
/datum/alt_title/historian
title = "Historian"
- title_blurb = "The Historian uses the Library as a base of operation to record any important events occuring on station."
+ title_blurb = "The Historian uses the Library as a base of operation to record any important events occurring on station."
/datum/alt_title/archivist
title = "Archivist"
- title_blurb = "The Archivist uses the Library as a base of operation to record any important events occuring on station."
+ title_blurb = "The Archivist uses the Library as a base of operation to record any important events occurring on station."
/datum/alt_title/professor
title = "Professor"
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index ac18a3578c..71c1d79b83 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -34,7 +34,7 @@
outfit_type = /decl/hierarchy/outfit/job/science/rd
job_description = "The Research Director manages and maintains the Research department. They are required to ensure the safety of the entire crew, \
- at least with regards to anything occuring in the Research department, and to inform the crew of any disruptions that \
+ at least with regards to anything occurring in the Research department, and to inform the crew of any disruptions that \
might originate from Research. The Research Director often has at least passing knowledge of most of the Research department, but \
are encouraged to allow their staff to perform their own duties."
alt_titles = list("Research Supervisor" = /datum/alt_title/research_supervisor)
diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm
index c526550139..92053f4222 100644
--- a/code/game/jobs/job_controller.dm
+++ b/code/game/jobs/job_controller.dm
@@ -26,7 +26,7 @@ var/global/datum/controller/occupations/job_master
if(!job) continue
if(job.faction != faction) continue
occupations += job
- sortTim(occupations, /proc/cmp_job_datums)
+ sortTim(occupations, GLOBAL_PROC_REF(cmp_job_datums))
return 1
diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm
index 21bba5a1e6..ec666955e7 100644
--- a/code/game/machinery/air_alarm.dm
+++ b/code/game/machinery/air_alarm.dm
@@ -74,6 +74,7 @@
/// Keys are things like temperature and certain gasses. Values are lists, which contain, in order:
/// red warning minimum value, yellow warning minimum value, yellow warning maximum value, red warning maximum value
+ /// Use code\defines\gases.dm as reference for id/name. Please keep it consistent
var/list/TLV = list()
var/list/trace_gas = list("nitrous_oxide", "volatile_fuel") //list of other gases that this air alarm is able to detect
@@ -111,7 +112,7 @@
. = ..()
req_access = list(access_rd, access_atmospherics, access_engine_equip)
TLV["oxygen"] = list(-1.0, -1.0,-1.0,-1.0) // Partial pressure, kpa
- TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa
+ TLV["carbon_dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa
TLV["phoron"] = list(-1.0, -1.0, 0, 0.5) // Partial pressure, kpa
TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa
TLV["pressure"] = list(0,ONE_ATMOSPHERE*0.10,ONE_ATMOSPHERE*1.40,ONE_ATMOSPHERE*1.60) /* kpa */
@@ -150,7 +151,7 @@
// breathable air according to human/Life()
TLV["oxygen"] = list(16, 19, 135, 140) // Partial pressure, kpa
TLV["nitrogen"] = list(0, 0, 135, 140) // Partial pressure, kpa
- TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa
+ TLV["carbon_dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa
TLV["phoron"] = list(-1.0, -1.0, 0, 0.5) // Partial pressure, kpa
TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa
TLV["pressure"] = list(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE * 0.90, ONE_ATMOSPHERE * 1.10, ONE_ATMOSPHERE * 1.20) /* kpa */
@@ -285,7 +286,7 @@
pressure_dangerlevel = TEST_TLV_VALUES // not local because it's used in process()
LOAD_TLV_VALUES(TLV["oxygen"], environment.gas["oxygen"]*partial_pressure)
var/oxygen_dangerlevel = TEST_TLV_VALUES
- LOAD_TLV_VALUES(TLV["carbon dioxide"], environment.gas["carbon_dioxide"]*partial_pressure)
+ LOAD_TLV_VALUES(TLV["carbon_dioxide"], environment.gas["carbon_dioxide"]*partial_pressure)
var/co2_dangerlevel = TEST_TLV_VALUES
LOAD_TLV_VALUES(TLV["phoron"], environment.gas["phoron"]*partial_pressure)
var/phoron_dangerlevel = TEST_TLV_VALUES
@@ -632,9 +633,9 @@
list("name" = "Oxygen", "command" = "o2_scrub", "val" = info["filter_o2"]),
list("name" = "Nitrogen", "command" = "n2_scrub", "val" = info["filter_n2"]),
list("name" = "Carbon Dioxide", "command" = "co2_scrub","val" = info["filter_co2"]),
- list("name" = "Toxin" , "command" = "tox_scrub","val" = info["filter_phoron"]),
+ list("name" = "Phoron" , "command" = "tox_scrub","val" = info["filter_phoron"]),
list("name" = "Nitrous Oxide", "command" = "n2o_scrub","val" = info["filter_n2o"]),
- list("name" = "Fuel", "command" = "fuel_scrub","val" = info["filter_fuel"])
+ list("name" = "Volatile Fuel", "command" = "fuel_scrub","val" = info["filter_fuel"])
)
))
data["scrubbers"] = scrubbers
@@ -653,7 +654,7 @@
var/list/selected
var/list/thresholds = list()
- var/list/gas_names = list("oxygen", "carbon dioxide", "phoron", "other")
+ var/list/gas_names = list("oxygen", "carbon_dioxide", "phoron", "other") //Gas ids made to match code\defines\gases.dm
for(var/g in gas_names)
thresholds[++thresholds.len] = list("name" = g, "settings" = list())
selected = TLV[g]
diff --git a/code/game/machinery/atmoalter/area_atmos_computer.dm b/code/game/machinery/atmoalter/area_atmos_computer.dm
index bfe95bada7..c50080feb9 100644
--- a/code/game/machinery/atmoalter/area_atmos_computer.dm
+++ b/code/game/machinery/atmoalter/area_atmos_computer.dm
@@ -48,13 +48,13 @@
"load" = scrubber.last_power_draw,
"area" = get_area(scrubber),
)))
-
+
return list("scrubbers" = working)
/obj/machinery/computer/area_atmos/tgui_act(action, params)
if(..())
return TRUE
-
+
switch(action)
if("toggle")
var/scrub_id = params["id"]
@@ -66,10 +66,10 @@
S.update_icon()
. = TRUE
if("allon")
- INVOKE_ASYNC(src, .proc/toggle_all, TRUE)
+ INVOKE_ASYNC(src, PROC_REF(toggle_all), TRUE)
. = TRUE
if("alloff")
- INVOKE_ASYNC(src, .proc/toggle_all, FALSE)
+ INVOKE_ASYNC(src, PROC_REF(toggle_all), FALSE)
. = TRUE
if("scan")
scanscrubbers()
@@ -78,7 +78,7 @@
add_fingerprint(usr)
/obj/machinery/computer/area_atmos/proc/toggle_all(on)
- for(var/id in connectedscrubbers)
+ for(var/id in connectedscrubbers)
var/obj/machinery/portable_atmospherics/powered/scrubber/huge/S = connectedscrubbers["[id]"]
if(!validscrubber(S))
connectedscrubbers -= S
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index cebc88566e..236f6d6837 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -30,7 +30,7 @@
var/filtertext
/obj/machinery/autolathe/Initialize()
- AddComponent(/datum/component/material_container, subtypesof(/datum/material), 0, MATCONTAINER_EXAMINE, _after_insert = CALLBACK(src, .proc/AfterMaterialInsert))
+ AddComponent(/datum/component/material_container, subtypesof(/datum/material), 0, MATCONTAINER_EXAMINE, _after_insert = CALLBACK(src, PROC_REF(AfterMaterialInsert)))
. = ..()
if(!autolathe_recipes)
autolathe_recipes = new()
diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index 227e36948c..62a2a154a5 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -142,7 +142,7 @@
. = TRUE
switch(action)
if("activate")
- INVOKE_ASYNC(src, .proc/activate)
+ INVOKE_ASYNC(src, PROC_REF(activate))
return TRUE
if("detach")
if(beaker)
diff --git a/code/game/machinery/computer/atmos_alert.dm b/code/game/machinery/computer/atmos_alert.dm
index 24a7d21a5f..4313ba5c2f 100644
--- a/code/game/machinery/computer/atmos_alert.dm
+++ b/code/game/machinery/computer/atmos_alert.dm
@@ -50,12 +50,19 @@ var/global/list/minor_air_alarms = list()
var/list/alarms = atmosphere_alarm.major_alarms()
if(alarms.len)
icon_screen = "alert:2"
+ playsound(src, 'modular_chomp/sound/effects/comp_alert_major.ogg', 70, 1) // CHOMPEdit: Alarm notifications
+ spawn(100) // Wait 10 seconds, then play it again
+ playsound(src, 'modular_chomp/sound/effects/comp_alert_major.ogg', 70, 1) // CHOMPEdit: Alarm notifications
else
alarms = atmosphere_alarm.minor_alarms()
if(alarms.len)
icon_screen = "alert:1"
+ playsound(src, 'modular_chomp/sound/effects/comp_alert_minor.ogg', 50, 1) // CHOMPEdit: Alarm notifications
+ spawn(100) // Wait 10 seconds, then play it again
+ playsound(src, 'modular_chomp/sound/effects/comp_alert_minor.ogg', 50, 1) // CHOMPEdit: Alarm notifications
else
icon_screen = initial(icon_screen)
+ playsound(src, 'modular_chomp/sound/effects/comp_alert_clear.ogg', 50, 1) // CHOMPEdit: Alarm notifications
..()
/obj/machinery/computer/atmos_alert/tgui_act(action, params)
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 60e5727a7c..7930231cbf 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -348,7 +348,7 @@
printing = TRUE
// playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, TRUE)
SStgui.update_uis(src)
- addtimer(CALLBACK(src, .proc/print_finish), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(print_finish)), 5 SECONDS)
else
return FALSE
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 309453ee29..7b318b966c 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -226,5 +226,5 @@
log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!")
message_admins("[key_name_admin(usr)] emagged [key_name_admin(R)] using robotic console!")
R.emagged = TRUE
- to_chat(R, "Failsafe protocols overriden. New tools available.")
+ to_chat(R, "Failsafe protocols overridden. New tools available.")
. = TRUE
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 2e315362cf..fea0fa3950 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -336,7 +336,7 @@
printing = TRUE
// playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, TRUE)
SStgui.update_uis(src)
- addtimer(CALLBACK(src, .proc/print_finish), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(print_finish)), 5 SECONDS)
if("photo_front")
var/icon/photo = get_photo(usr)
if(photo && active1)
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 26e45d7f40..876a2009d1 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -251,7 +251,7 @@
printing = TRUE
// playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, TRUE)
SStgui.update_uis(src)
- addtimer(CALLBACK(src, .proc/print_finish), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(print_finish)), 5 SECONDS)
else
return FALSE
diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm
index 051a8e368b..b4da38c52d 100644
--- a/code/game/machinery/computer/station_alert.dm
+++ b/code/game/machinery/computer/station_alert.dm
@@ -49,6 +49,8 @@
var/list/alarms = alarm_monitor ? alarm_monitor.major_alarms() : list()
if(alarms.len)
icon_screen = "alert:2"
+ playsound(src, 'modular_chomp/sound/effects/comp_alert_major.ogg', 70, 1) // CHOMPEdit: Alarm notifications
else
icon_screen = initial(icon_screen)
+ playsound(src, 'modular_chomp/sound/effects/comp_alert_clear.ogg', 50, 1) // CHOMPEdit: Alarm notifications
..()
diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm
index 9c6950bfbe..7c148201af 100644
--- a/code/game/machinery/doors/blast_door.dm
+++ b/code/game/machinery/doors/blast_door.dm
@@ -273,7 +273,7 @@
force_open()
if(autoclose && src.operating && !(stat & BROKEN || stat & NOPOWER))
- addtimer(CALLBACK(src, .proc/close, 15 SECONDS))
+ addtimer(CALLBACK(src, PROC_REF(close), 15 SECONDS))
return 1
// Proc: close()
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index c62c7ea94d..0a3e3973b7 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -94,7 +94,7 @@
for(var/obj/machinery/door/window/brigdoor/door in targets)
if(door.density)
continue
- INVOKE_ASYNC(door, /obj/machinery/door/window/brigdoor.proc/close)
+ INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/machinery/door/window/brigdoor, close))
for(var/obj/structure/closet/secure_closet/brig/C in targets)
if(C.broken)
@@ -118,7 +118,7 @@
for(var/obj/machinery/door/window/brigdoor/door in targets)
if(!door.density)
continue
- INVOKE_ASYNC(door, /obj/machinery/door/window/brigdoor.proc/open)
+ INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/machinery/door/window/brigdoor, open))
for(var/obj/structure/closet/secure_closet/brig/C in targets)
if(C.broken)
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index fa31ef365f..ad3212fa49 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -163,6 +163,7 @@
return !density // Block airflow unless density = FALSE
/obj/machinery/door/proc/bumpopen(mob/user as mob)
+ if(!user) return // CHOMPedit - Check if the mob is even valid before proceeding
if(operating) return
if(user.last_airflow > world.time - vsc.airflow_delay) //Fakkit
return
diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm
index 23b71bdb0f..4f5adbb677 100644
--- a/code/game/machinery/doors/multi_tile.dm
+++ b/code/game/machinery/doors/multi_tile.dm
@@ -10,7 +10,7 @@
/obj/machinery/door/airlock/multi_tile/Initialize(mapload)
. = ..()
SetBounds()
- RegisterSignal(src, COMSIG_MOVABLE_MOVED, .proc/SetBounds)
+ RegisterSignal(src, COMSIG_MOVABLE_MOVED, PROC_REF(SetBounds))
apply_opacity_to_my_turfs(opacity)
/obj/machinery/door/airlock/multi_tile/set_opacity()
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 28afc5e9ff..822e950d63 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -67,13 +67,13 @@
if(istype(bot))
if(density && src.check_access(bot.botcard))
open()
- addtimer(CALLBACK(src, .proc/close), 50)
+ addtimer(CALLBACK(src, PROC_REF(close)), 50)
else if(istype(AM, /obj/mecha))
var/obj/mecha/mecha = AM
if(density)
if(mecha.occupant && src.allowed(mecha.occupant))
open()
- addtimer(CALLBACK(src, .proc/close), 50)
+ addtimer(CALLBACK(src, PROC_REF(close)), 50)
return
if (!( ticker ))
return
@@ -81,7 +81,7 @@
return
if (density && allowed(AM))
open()
- addtimer(CALLBACK(src, .proc/close), check_access(null)? 50 : 20)
+ addtimer(CALLBACK(src, PROC_REF(close)), check_access(null)? 50 : 20)
/obj/machinery/door/window/CanPass(atom/movable/mover, turf/target)
if(istype(mover) && mover.checkpass(PASSGLASS))
diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm
index 1eda308142..01f140e9d2 100644
--- a/code/game/machinery/exonet_node.dm
+++ b/code/game/machinery/exonet_node.dm
@@ -17,6 +17,9 @@
var/list/logs = list() // Gets written to by exonet's send_message() function.
circuit = /obj/item/weapon/circuitboard/telecomms/exonet_node
+
+ var/datum/looping_sound/tcomms/soundloop // CHOMPStation Add: Hummy noises
+ var/noisy = TRUE // CHOMPStation Add: Hummy noises, this starts on
// Proc: New()
// Parameters: None
// Description: Adds components to the machine for deconstruction.
@@ -26,6 +29,24 @@
desc = "This machine is one of many, many nodes inside [using_map.starsys_name]'s section of the Exonet, connecting the [using_map.station_short] to the rest of the system, at least \
electronically."
+ // CHOMPAdd: Exonet Machinery humming
+ soundloop = new(list(src), FALSE)
+ if(prob(60)) // 60% chance to change the midloop
+ if(prob(40))
+ soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_02.ogg' = 1)
+ soundloop.mid_length = 40
+ else if(prob(20))
+ soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_03.ogg' = 1)
+ soundloop.mid_length = 10
+ else
+ soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_04.ogg' = 1)
+ soundloop.mid_length = 30
+ // CHOMPAdd End
+ soundloop.start() // CHOMPStation Edit: This starts on
+
+/obj/machinery/exonet_node/Destroy() // CHOMPAdd: Just in case.
+ QDEL_NULL(soundloop) // CHOMPAdd: Exonet noises
+
// Proc: update_icon()
// Parameters: None
// Description: Self explanatory.
@@ -48,12 +69,19 @@
if(stat & (BROKEN|NOPOWER|EMPED))
on = 0
update_idle_power_usage(0)
+ soundloop.stop() // CHOMPStation Add: Hummy noises
+ noisy = FALSE // CHOMPStation Add: Hummy noises
else
on = 1
update_idle_power_usage(2500)
else
on = 0
update_idle_power_usage(0)
+ soundloop.stop() // CHOMPStation Add: Hummy noises
+ noisy = FALSE // CHOMPStation Add: Hummy noises
+ if(!noisy && on) // CHOMPStation Add: Hummy noises, safety in case it was already on
+ soundloop.start() // CHOMPStation Add: Hummy noises
+ noisy = TRUE // CHOMPStation Add: Hummy noises
update_icon()
// Proc: emp_act()
diff --git a/code/game/machinery/holoposter.dm b/code/game/machinery/holoposter.dm
index 2e1d609ccc..a5174380d2 100644
--- a/code/game/machinery/holoposter.dm
+++ b/code/game/machinery/holoposter.dm
@@ -29,7 +29,7 @@ GLOBAL_LIST_EMPTY(holoposters)
. = ..()
set_rand_sprite()
GLOB.holoposters += src
- mytimer = addtimer(CALLBACK(src, .proc/set_rand_sprite), 30 MINUTES + rand(0, 5 MINUTES), TIMER_STOPPABLE | TIMER_LOOP)
+ mytimer = addtimer(CALLBACK(src, PROC_REF(set_rand_sprite)), 30 MINUTES + rand(0, 5 MINUTES), TIMER_STOPPABLE | TIMER_LOOP)
/obj/machinery/holoposter/Destroy()
GLOB.holoposters -= src
@@ -92,7 +92,7 @@ GLOBAL_LIST_EMPTY(holoposters)
stat &= ~BROKEN
icon_forced = FALSE
if(!mytimer)
- mytimer = addtimer(CALLBACK(src, .proc/set_rand_sprite), 30 MINUTES + rand(0, 5 MINUTES), TIMER_STOPPABLE | TIMER_LOOP)
+ mytimer = addtimer(CALLBACK(src, PROC_REF(set_rand_sprite)), 30 MINUTES + rand(0, 5 MINUTES), TIMER_STOPPABLE | TIMER_LOOP)
set_rand_sprite()
return
icon_forced = TRUE
@@ -114,4 +114,3 @@ GLOBAL_LIST_EMPTY(holoposters)
/obj/machinery/holoposter/emp_act()
stat |= BROKEN
update_icon()
-
diff --git a/code/game/machinery/machinery_power.dm b/code/game/machinery/machinery_power.dm
index be648d0f80..0f4c2ef01b 100644
--- a/code/game/machinery/machinery_power.dm
+++ b/code/game/machinery/machinery_power.dm
@@ -80,7 +80,7 @@
// Or in Destroy at all, but especially after the ..().
/obj/machinery/Destroy()
if(ismovable(loc))
- GLOB.moved_event.unregister(loc, src, .proc/update_power_on_move) // Unregister just in case
+ GLOB.moved_event.unregister(loc, src, PROC_REF(update_power_on_move)) // Unregister just in case
var/power = POWER_CONSUMPTION
REPORT_POWER_CONSUMPTION_CHANGE(power, 0)
. = ..()
@@ -91,9 +91,9 @@
. = ..()
update_power_on_move(src, old_loc, loc)
if(ismovable(loc)) // Register for recursive movement (if the thing we're inside moves)
- GLOB.moved_event.register(loc, src, .proc/update_power_on_move)
+ GLOB.moved_event.register(loc, src, PROC_REF(update_power_on_move))
if(ismovable(old_loc)) // Unregister recursive movement.
- GLOB.moved_event.unregister(old_loc, src, .proc/update_power_on_move)
+ GLOB.moved_event.unregister(old_loc, src, PROC_REF(update_power_on_move))
/obj/machinery/proc/update_power_on_move(atom/movable/mover, atom/old_loc, atom/new_loc)
var/area/old_area = get_area(old_loc)
diff --git a/code/game/machinery/pda_multicaster.dm b/code/game/machinery/pda_multicaster.dm
index ef7612bf87..8d8b36eaa2 100644
--- a/code/game/machinery/pda_multicaster.dm
+++ b/code/game/machinery/pda_multicaster.dm
@@ -12,6 +12,9 @@
var/toggle = 1 // If we /should/ be active or not,
var/list/internal_PDAs = list() // Assoc list of PDAs inside of this, with the department name being the index,
+ var/datum/looping_sound/tcomms/soundloop // CHOMPStation Add: Hummy noises
+ var/noisy = TRUE // CHOMPStation Add: Hummy noises
+
/obj/machinery/pda_multicaster/New()
..()
internal_PDAs = list("command" = new /obj/item/device/pda/multicaster/command(src),
@@ -23,6 +26,24 @@
"cargo" = new /obj/item/device/pda/multicaster/cargo(src),
"civilian" = new /obj/item/device/pda/multicaster/civilian(src))
+/obj/machinery/pda_multicaster/Initialize()
+ . = ..()
+
+ // CHOMPAdd: PDA Multicaster Server humming
+ soundloop = new(list(src), FALSE)
+ if(prob(60)) // 60% chance to change the midloop
+ if(prob(40))
+ soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_02.ogg' = 1)
+ soundloop.mid_length = 40
+ else if(prob(20))
+ soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_03.ogg' = 1)
+ soundloop.mid_length = 10
+ else
+ soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_04.ogg' = 1)
+ soundloop.mid_length = 30
+ soundloop.start() // Have to do this here bc it starts on
+ // CHOMPAdd End
+
/obj/machinery/pda_multicaster/prebuilt/Initialize()
. = ..()
default_apply_parts()
@@ -30,6 +51,7 @@
/obj/machinery/pda_multicaster/Destroy()
for(var/atom/movable/AM in contents)
qdel(AM)
+ QDEL_NULL(soundloop)
..()
/obj/machinery/pda_multicaster/update_icon()
@@ -73,14 +95,20 @@
on = 0
update_PDAs(1) // 1 being to turn off.
update_idle_power_usage(0)
+ soundloop.stop() // CHOMPStation Add: Hummy noises
+ noisy = FALSE // CHOMPStation Add: Hummy noises
else
on = 1
update_PDAs(0)
update_idle_power_usage(750)
+ soundloop.start() // CHOMPStation Add: Hummy noises
+ noisy = TRUE // CHOMPStation Add: Hummy noises
else
on = 0
update_PDAs(1)
update_idle_power_usage(0)
+ soundloop.stop() // CHOMPStation Add: Hummy noises
+ noisy = FALSE // CHOMPStation Add: Hummy noises
update_icon()
/obj/machinery/pda_multicaster/process()
diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm
index e249697272..b0f7384b6f 100644
--- a/code/game/machinery/pointdefense.dm
+++ b/code/game/machinery/pointdefense.dm
@@ -14,7 +14,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
icon = 'icons/obj/pointdefense.dmi'
icon_state = "control"
power_channel = EQUIP // CHOMPStation Edit Starts
- use_power = USE_POWER_ACTIVE
+ use_power = USE_POWER_ACTIVE
active_power_usage = 5 KILOWATTS // CHOMPStation Edit Ends
density = TRUE
anchored = TRUE
@@ -141,6 +141,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
var/rotation_speed = 4.5 SECONDS //How quickly we turn to face threats
var/datum/weakref/engaging = null // The meteor we're shooting at
var/id_tag = null
+ var/fire_sounds = list('sound/weapons/frigate_turret/frigate_turret_fire1.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire2.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire3.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire4.ogg') // CHOMPEdit: Pew
/obj/machinery/pointdefense/Initialize()
. = ..()
@@ -208,7 +209,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
var/Angle = round(Get_Angle(src,M))
var/matrix/rot_matrix = matrix()
rot_matrix.Turn(Angle)
- addtimer(CALLBACK(src, .proc/finish_shot, target), rotation_speed)
+ addtimer(CALLBACK(src, PROC_REF(finish_shot), target), rotation_speed)
animate(src, transform = rot_matrix, rotation_speed, easing = SINE_EASING)
set_dir(ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH)
@@ -224,10 +225,12 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
if(!istype(M))
return
//We throw a laser but it doesnt have to hit for meteor to explode
- var/obj/item/projectile/beam/pointdefense/beam = new(get_turf(src))
- playsound(src, 'sound/weapons/mandalorian.ogg', 75, 1)
+ var/obj/item/projectile/beam/coildefense/coil = new(get_turf(src))
+ playsound(src, fire_sounds, 75, 1, 40, pressure_affected = FALSE, ignore_walls = TRUE) // CHOMPEdit: Pew
use_power_oneoff(idle_power_usage * 10)
- beam.launch_projectile(target = M.loc, user = src)
+ coil.launch_projectile(target = M.loc, user = src) // CHOMPEdit: Changing "beam" var to "coil" for the new coilgun type point defense turrets (to match the coilgun sprite and sfx names)
+ spawn(10)
+ playsound(src, fire_sounds, 75, 1, 40, pressure_affected = FALSE, ignore_walls = TRUE) // CHOMPEdit: Pew
/obj/machinery/pointdefense/process()
..()
@@ -269,7 +272,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
engaging = target
Shoot(target)
return
-
+
// Then, focus fire on existing targets
for(var/obj/effect/meteor/M in existing_targets)
if(targeting_check(M))
diff --git a/code/game/machinery/suit_storage/suit_cycler.dm b/code/game/machinery/suit_storage/suit_cycler.dm
new file mode 100644
index 0000000000..56a081737f
--- /dev/null
+++ b/code/game/machinery/suit_storage/suit_cycler.dm
@@ -0,0 +1,547 @@
+GLOBAL_LIST_EMPTY(suit_cycler_typecache)
+
+/obj/machinery/suit_cycler
+ name = "suit cycler"
+ desc = "An industrial machine for painting and refitting voidsuits."
+ anchored = TRUE
+ density = TRUE
+
+ icon = 'icons/obj/suit_cycler.dmi'
+ icon_state = "suit_cycler"
+
+ req_access = list(access_captain,access_heads)
+
+ var/active = 0 // PLEASE HOLD.
+ var/safeties = 1 // The cycler won't start with a living thing inside it unless safeties are off.
+ var/irradiating = 0 // If this is > 0, the cycler is decontaminating whatever is inside it.
+ var/radiation_level = 2 // 1 is removing germs, 2 is removing blood, 3 is removing phoron.
+ var/model_text = "" // Some flavour text for the topic box.
+ var/locked = 1 // If locked, nothing can be taken from or added to the cycler.
+ var/can_repair // If set, the cycler can repair voidsuits.
+ var/electrified = 0
+
+ /// Departments that the cycler can paint suits to look like. Null assumes all except specially excluded ones.
+ /// No idea why these particular suits are the default cycler's options.
+ var/list/limit_departments = list(
+ /datum/suit_cycler_choice/department/eng/standard,
+ /datum/suit_cycler_choice/department/crg/mining,
+ /datum/suit_cycler_choice/department/med/standard,
+ /datum/suit_cycler_choice/department/sec/standard,
+ /datum/suit_cycler_choice/department/eng/atmospherics,
+ /datum/suit_cycler_choice/department/eng/hazmat,
+ /datum/suit_cycler_choice/department/eng/construction,
+ /datum/suit_cycler_choice/department/med/biohazard,
+ /datum/suit_cycler_choice/department/med/emt,
+ /datum/suit_cycler_choice/department/sec/riot,
+ /datum/suit_cycler_choice/department/sec/eva
+ )
+
+ /// Species that the cycler can refit suits for. Null assumes all except specially excluded ones.
+ var/list/limit_species
+
+ var/list/departments
+ var/list/species
+ var/list/emagged_departments
+
+ var/datum/suit_cycler_choice/department/target_department
+ var/datum/suit_cycler_choice/species/target_species
+
+ var/mob/living/carbon/human/occupant = null
+ var/obj/item/clothing/suit/space/void/suit = null
+ var/obj/item/clothing/head/helmet/space/helmet = null
+
+ var/datum/wires/suit_storage_unit/wires = null
+
+/obj/machinery/suit_cycler/Initialize()
+ . = ..()
+
+ departments = load_departments()
+ species = load_species()
+ emagged_departments = load_emagged()
+ limit_departments = null // just for mem
+
+ target_department = departments["No Change"]
+ target_species = species["No Change"]
+
+ if(!target_department || !target_species)
+ stat |= BROKEN
+
+ wires = new(src)
+
+/obj/machinery/suit_cycler/Destroy()
+ qdel(wires)
+ wires = null
+ return ..()
+
+/obj/machinery/suit_cycler/proc/load_departments()
+ var/list/typecache = GLOB.suit_cycler_typecache[type]
+ // First of our type
+ if(!typecache)
+ typecache = list()
+ GLOB.suit_cycler_typecache[type] = typecache
+ var/list/loaded = typecache["departments"]
+ // No departments loaded
+ if(!loaded)
+ loaded = list()
+ typecache["departments"] = loaded
+ for(var/datum/suit_cycler_choice/department/thing as anything in GLOB.suit_cycler_departments)
+ if(istype(thing, /datum/suit_cycler_choice/department/noop))
+ loaded[thing.name] = thing
+ continue
+ if(limit_departments && !is_type_in_list(thing, limit_departments))
+ continue
+ loaded[thing.name] = thing
+
+ return loaded
+
+/obj/machinery/suit_cycler/proc/load_species()
+ var/list/typecache = GLOB.suit_cycler_typecache[type]
+ // First of our type
+ if(!typecache)
+ typecache = list()
+ GLOB.suit_cycler_typecache[type] = typecache
+ var/list/loaded = typecache["species"]
+ // No species loaded
+ if(!loaded)
+ loaded = list()
+ typecache["species"] = loaded
+ for(var/datum/suit_cycler_choice/species/thing as anything in GLOB.suit_cycler_species)
+ if(istype(thing, /datum/suit_cycler_choice/species/noop))
+ loaded[thing.name] = thing
+ continue
+ if(limit_species && !is_type_in_list(thing, limit_species))
+ continue
+ loaded[thing.name] = thing
+
+ return loaded
+
+/obj/machinery/suit_cycler/proc/load_emagged()
+ var/list/typecache = GLOB.suit_cycler_typecache[type]
+ // First of our type
+ if(!typecache)
+ typecache = list()
+ GLOB.suit_cycler_typecache[type] = typecache
+ var/list/loaded = typecache["emagged"]
+ // No emagged loaded
+ if(!loaded)
+ loaded = list()
+ typecache["emagged"] = loaded
+ for(var/datum/suit_cycler_choice/department/thing as anything in GLOB.suit_cycler_emagged)
+ loaded[thing.name] = thing
+
+ return loaded
+
+/obj/machinery/suit_cycler/attack_ai(mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/suit_cycler/attackby(obj/item/I as obj, mob/user as mob)
+
+ if(electrified != 0)
+ if(shock(user, 100))
+ return
+
+ //Hacking init.
+ if(istype(I, /obj/item/device/multitool) || I.is_wirecutter())
+ if(panel_open)
+ attack_hand(user)
+ return
+ //Other interface stuff.
+ if(istype(I, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = I
+
+ if(!(ismob(G.affecting)))
+ return
+
+ if(locked)
+ to_chat(user, "The suit cycler is locked.")
+ return
+
+ if(contents.len > 0)
+ to_chat(user, "There is no room inside the cycler for [G.affecting.name].")
+ return
+
+ visible_message("[user] starts putting [G.affecting.name] into the suit cycler.", 3)
+
+ if(do_after(user, 20))
+ if(!G || !G.affecting) return
+ var/mob/M = G.affecting
+ if(M.client)
+ M.client.perspective = EYE_PERSPECTIVE
+ M.client.eye = src
+ M.loc = src
+ occupant = M
+
+ add_fingerprint(user)
+ qdel(G)
+
+ updateUsrDialog()
+
+ return
+ else if(I.is_screwdriver())
+
+ panel_open = !panel_open
+ playsound(src, I.usesound, 50, 1)
+ to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
+ updateUsrDialog()
+ return
+
+ else if(istype(I,/obj/item/clothing/head/helmet/space/void) && !istype(I, /obj/item/clothing/head/helmet/space/rig))
+ var/obj/item/clothing/head/helmet/space/void/IH = I
+
+ if(locked)
+ to_chat(user, "The suit cycler is locked.")
+ return
+
+ if(helmet)
+ to_chat(user, "The cycler already contains a helmet.")
+ return
+
+ if(IH.no_cycle)
+ to_chat(user, "That item is not compatible with the cycler's protocols.")
+ return
+
+ if(I.icon_override == CUSTOM_ITEM_MOB)
+ to_chat(user, "You cannot refit a customised voidsuit.")
+ return
+
+ //VOREStation Edit BEGINS
+ //Make it so autolok suits can't be refitted in a cycler
+ if(istype(I,/obj/item/clothing/head/helmet/space/void/autolok))
+ to_chat(user, "You cannot refit an autolok helmet. In fact you shouldn't even be able to remove it in the first place. Inform an admin!")
+ return
+
+ //Ditto the Mk7
+ if(istype(I,/obj/item/clothing/head/helmet/space/void/responseteam))
+ to_chat(user, "The cycler indicates that the Mark VII Emergency Response Helmet is not compatible with the refitting system. How did you manage to detach it anyway? Inform an admin!")
+ return
+ //VOREStation Edit ENDS
+
+ to_chat(user, "You fit \the [I] into the suit cycler.")
+ user.drop_item()
+ I.loc = src
+ helmet = I
+
+ update_icon()
+ updateUsrDialog()
+ return
+
+ else if(istype(I,/obj/item/clothing/suit/space/void))
+ var/obj/item/clothing/suit/space/void/IS = I
+
+ if(locked)
+ to_chat(user, "The suit cycler is locked.")
+ return
+
+ if(suit)
+ to_chat(user, "The cycler already contains a voidsuit.")
+ return
+
+ if(IS.no_cycle)
+ to_chat(user, "That item is not compatible with the cycler's protocols.")
+ return
+
+ if(I.icon_override == CUSTOM_ITEM_MOB)
+ to_chat(user, "You cannot refit a customised voidsuit.")
+ return
+
+ //VOREStation Edit BEGINS
+ //Make it so autolok suits can't be refitted in a cycler
+ if(istype(I,/obj/item/clothing/suit/space/void/autolok))
+ to_chat(user, "You cannot refit an autolok suit.")
+ return
+
+ //Ditto the Mk7
+ if(istype(I,/obj/item/clothing/suit/space/void/responseteam))
+ to_chat(user, "The cycler indicates that the Mark VII Emergency Response Suit is not compatible with the refitting system.")
+ return
+ //VOREStation Edit ENDS
+
+ to_chat(user, "You fit \the [I] into the suit cycler.")
+ user.drop_item()
+ I.loc = src
+ suit = I
+
+ update_icon()
+ updateUsrDialog()
+ return
+
+ ..()
+
+/obj/machinery/suit_cycler/emag_act(var/remaining_charges, var/mob/user)
+ if(emagged)
+ to_chat(user, "The cycler has already been subverted.")
+ return
+
+ //Clear the access reqs, disable the safeties, and open up all paintjobs.
+ to_chat(user, "You run the sequencer across the interface, corrupting the operating protocols.")
+
+ emagged = 1
+ safeties = 0
+ req_access = list()
+ updateUsrDialog()
+ return 1
+
+/obj/machinery/suit_cycler/attack_hand(mob/user as mob)
+ add_fingerprint(user)
+ if(..() || stat & (BROKEN|NOPOWER))
+ return
+
+ if(!user.IsAdvancedToolUser())
+ return 0
+
+ if(electrified != 0)
+ if(shock(user, 100))
+ return
+
+ tgui_interact(user)
+
+/obj/machinery/suit_cycler/tgui_state(mob/user)
+ return GLOB.tgui_notcontained_state
+
+/obj/machinery/suit_cycler/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "SuitCycler", name)
+ ui.open()
+
+/obj/machinery/suit_cycler/tgui_data(mob/user)
+ var/list/data = list()
+
+ data["model_text"] = model_text
+ data["can_repair"] = can_repair
+ data["userHasAccess"] = allowed(user)
+
+ data["locked"] = locked
+ data["active"] = active
+ data["safeties"] = safeties
+ data["uv_active"] = (active && irradiating > 0)
+ data["uv_level"] = radiation_level
+ data["max_uv_level"] = emagged ? 5 : 3
+ if(helmet)
+ data["helmet"] = helmet.name
+ else
+ data["helmet"] = null
+ if(suit)
+ data["suit"] = suit.name
+ if(istype(suit) && can_repair)
+ data["damage"] = suit.damage
+ else
+ data["suit"] = null
+ data["damage"] = null
+ if(occupant)
+ data["occupied"] = TRUE
+ else
+ data["occupied"] = FALSE
+
+ return data
+
+/obj/machinery/suit_cycler/tgui_static_data(mob/user)
+ var/list/data = list()
+
+ // tgui gets angy if you pass values too
+ var/list/department_keys = list()
+ for(var/key in departments)
+ department_keys += key
+
+ // emagged at the bottom
+ if(emagged)
+ for(var/key in emagged_departments)
+ department_keys += key
+
+ var/list/species_keys = list()
+ for(var/key in species)
+ species_keys += key
+
+ data["departments"] = department_keys
+ data["species"] = species_keys
+
+ return data
+
+/obj/machinery/suit_cycler/tgui_act(action, params)
+ if(..())
+ return TRUE
+
+ switch(action)
+ if("dispense")
+ switch(params["item"])
+ if("helmet")
+ helmet.forceMove(get_turf(src))
+ helmet = null
+ if("suit")
+ suit.forceMove(get_turf(src))
+ suit = null
+ . = TRUE
+
+ if("department")
+ var/choice = params["department"]
+ if(choice in departments)
+ target_department = departments[choice]
+ else if(emagged && (choice in emagged_departments))
+ target_department = emagged_departments[choice]
+ . = TRUE
+
+ if("species")
+ var/choice = params["species"]
+ if(choice in species)
+ target_species = species[choice]
+ . = TRUE
+
+ if("radlevel")
+ radiation_level = clamp(params["radlevel"], 1, emagged ? 5 : 3)
+ . = TRUE
+
+ if("repair_suit")
+ if(!suit || !can_repair)
+ return
+ active = 1
+ spawn(100)
+ repair_suit()
+ finished_job()
+ . = TRUE
+
+ if("apply_paintjob")
+ if(!suit && !helmet)
+ return
+ active = 1
+ spawn(100)
+ apply_paintjob()
+ finished_job()
+ . = TRUE
+
+ if("lock")
+ if(allowed(usr))
+ locked = !locked
+ to_chat(usr, "You [locked ? "" : "un"]lock \the [src].")
+ else
+ to_chat(usr, "Access denied.")
+ . = TRUE
+
+ if("eject_guy")
+ eject_occupant(usr)
+ . = TRUE
+
+ if("uv")
+ if(safeties && occupant)
+ to_chat(usr, "The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.")
+ return
+
+ active = 1
+ irradiating = 10
+
+ sleep(10)
+
+ if(helmet)
+ if(radiation_level > 2)
+ helmet.decontaminate()
+ if(radiation_level > 1)
+ helmet.clean_blood()
+
+ if(suit)
+ if(radiation_level > 2)
+ suit.decontaminate()
+ if(radiation_level > 1)
+ suit.clean_blood()
+
+ . = TRUE
+
+/obj/machinery/suit_cycler/process()
+
+ if(electrified > 0)
+ electrified--
+
+ if(!active)
+ return
+
+ if(active && stat & (BROKEN|NOPOWER))
+ active = 0
+ irradiating = 0
+ electrified = 0
+ return
+
+ if(irradiating == 1)
+ add_overlay("decon")
+ finished_job()
+ irradiating = 0
+ cut_overlays()
+ return
+
+ irradiating--
+
+ if(occupant)
+ if(prob(radiation_level*2)) occupant.emote("scream")
+ if(radiation_level > 2)
+ occupant.take_organ_damage(0,radiation_level*2 + rand(1,3))
+ if(radiation_level > 1)
+ occupant.take_organ_damage(0,radiation_level + rand(1,3))
+ occupant.apply_effect(radiation_level*10, IRRADIATE)
+
+/obj/machinery/suit_cycler/proc/finished_job()
+ var/turf/T = get_turf(src)
+ T.visible_message("\icon[src][bicon(src)]The [src] beeps several times.")
+ icon_state = initial(icon_state)
+ active = 0
+ playsound(src, 'sound/machines/boobeebeep.ogg', 50)
+ updateUsrDialog()
+
+/obj/machinery/suit_cycler/proc/repair_suit()
+ if(!suit || !suit.damage || !suit.can_breach)
+ return
+
+ suit.breaches = list()
+ suit.calc_breach_damage()
+
+ return
+
+/obj/machinery/suit_cycler/verb/leave()
+ set name = "Eject Cycler"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.stat != 0)
+ return
+
+ eject_occupant(usr)
+
+/obj/machinery/suit_cycler/proc/eject_occupant(mob/user as mob)
+
+ if(locked || active)
+ to_chat(user, "The cycler is locked.")
+ return
+
+ if(!occupant)
+ return
+
+ if(occupant.client)
+ occupant.client.eye = occupant.client.mob
+ occupant.client.perspective = MOB_PERSPECTIVE
+
+ occupant.loc = get_turf(occupant)
+ occupant = null
+
+ add_fingerprint(user)
+ updateUsrDialog()
+ update_icon()
+
+ return
+
+// "Streamlined" before? Ok. -Aro
+/obj/machinery/suit_cycler/proc/apply_paintjob()
+ if(!target_species || !target_department)
+ return
+
+ // Helmet to new paint
+ if(target_department.can_refit_helmet(helmet))
+ target_department.do_refit_helmet(helmet)
+ // Suit to new paint
+ if(target_department.can_refit_suit(suit))
+ target_department.do_refit_suit(suit)
+ // Attached voidsuit helmet to new paint
+ if(target_department.can_refit_helmet(suit?.helmet))
+ target_department.do_refit_helmet(suit.helmet)
+
+ // Species fitting for all 3 potential changes
+ if(target_species.can_refit_to(helmet, suit, suit?.helmet))
+ target_species.do_refit_to(helmet, suit, suit?.helmet)
+ else
+ visible_message("\icon[src][bicon(src)]Unable to apply specified cosmetics with specified species. Please try again with a different species or cosmetic option selected.")
+ return
diff --git a/code/game/machinery/suit_cycler_datums.dm b/code/game/machinery/suit_storage/suit_cycler_datums.dm
similarity index 100%
rename from code/game/machinery/suit_cycler_datums.dm
rename to code/game/machinery/suit_storage/suit_cycler_datums.dm
diff --git a/code/game/machinery/suit_storage/suit_cycler_units.dm b/code/game/machinery/suit_storage/suit_cycler_units.dm
new file mode 100644
index 0000000000..82134bc94b
--- /dev/null
+++ b/code/game/machinery/suit_storage/suit_cycler_units.dm
@@ -0,0 +1,112 @@
+/obj/machinery/suit_cycler/refit_only
+ name = "Suit cycler"
+ desc = "A dedicated industrial machine that can refit voidsuits for \
+ different species, but not change the suit's overall appearance or \
+ departmental scheme."
+ model_text = "General Access"
+ req_access = null
+ limit_departments = list()
+
+/obj/machinery/suit_cycler/engineering
+ name = "Engineering suit cycler"
+ model_text = "Engineering"
+ icon_state = "engi_cycler"
+ req_access = list(access_construction)
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/eng
+ )
+
+/obj/machinery/suit_cycler/mining
+ name = "Mining suit cycler"
+ model_text = "Mining"
+ icon_state = "industrial_cycler"
+ req_access = list(access_mining)
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/crg
+ )
+
+/obj/machinery/suit_cycler/security
+ name = "Security suit cycler"
+ model_text = "Security"
+ icon_state = "sec_cycler"
+ req_access = list(access_security)
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/sec
+ )
+
+/obj/machinery/suit_cycler/medical
+ name = "Medical suit cycler"
+ model_text = "Medical"
+ icon_state = "med_cycler"
+ req_access = list(access_medical)
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/med
+ )
+
+/obj/machinery/suit_cycler/syndicate
+ name = "Nonstandard suit cycler"
+ model_text = "Nonstandard"
+ icon_state = "red_cycler"
+ req_access = list(access_syndicate)
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/emag
+ )
+ can_repair = 1
+
+/obj/machinery/suit_cycler/exploration
+ name = "Explorer suit cycler"
+ model_text = "Exploration"
+ icon_state = "explo_cycler"
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/exp
+ )
+
+/obj/machinery/suit_cycler/pilot
+ name = "Pilot suit cycler"
+ model_text = "Pilot"
+ icon_state = "pilot_cycler"
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/pil
+ )
+
+/obj/machinery/suit_cycler/vintage
+ name = "Vintage Crew suit cycler"
+ model_text = "Vintage"
+ icon_state = "industrial_cycler"
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/vintage/crew
+ )
+ req_access = null
+
+/obj/machinery/suit_cycler/vintage/pilot
+ name = "Vintage Pilot suit cycler"
+ model_text = "Vintage Pilot"
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/vintage/pilot
+ )
+
+/obj/machinery/suit_cycler/vintage/medsci
+ name = "Vintage MedSci suit cycler"
+ model_text = "Vintage MedSci"
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/vintage/research,
+ /datum/suit_cycler_choice/department/vintage/med
+ )
+
+/obj/machinery/suit_cycler/vintage/rugged
+ name = "Vintage Ruggedized suit cycler"
+ model_text = "Vintage Ruggedized"
+
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/vintage/eng,
+ /datum/suit_cycler_choice/department/vintage/marine,
+ /datum/suit_cycler_choice/department/vintage/officer,
+ /datum/suit_cycler_choice/department/vintage/merc
+ )
+
+/obj/machinery/suit_cycler/vintage/omni
+ name = "Vintage Master suit cycler"
+ model_text = "Vintage Master"
+ limit_departments = list(
+ /datum/suit_cycler_choice/department/vintage
+ )
\ No newline at end of file
diff --git a/code/game/machinery/suit_storage_unit_vr.dm b/code/game/machinery/suit_storage/suit_cycler_units_vr.dm
similarity index 89%
rename from code/game/machinery/suit_storage_unit_vr.dm
rename to code/game/machinery/suit_storage/suit_cycler_units_vr.dm
index 5dda239b93..604d6320bd 100644
--- a/code/game/machinery/suit_storage_unit_vr.dm
+++ b/code/game/machinery/suit_storage/suit_cycler_units_vr.dm
@@ -9,53 +9,62 @@
/obj/machinery/suit_cycler/captain
name = "Manager suit cycler"
model_text = "Manager"
+ icon_state = "cap_cycler"
req_access = list(access_captain)
departments = list(/datum/suit_cycler_choice/department/captain)
/obj/machinery/suit_cycler/prototype
name = "Prototype suit cycler"
model_text = "Prototype"
+ icon_state = "industrial_cycler"
req_access = list(access_hos)
departments = list(/datum/suit_cycler_choice/department/prototype)
/obj/machinery/suit_cycler/vintage/tcrew
name = "Talon crew suit cycler"
model_text = "Talon crew"
+ icon_state = "dark_cycler"
req_access = list(access_talon)
departments = list(/datum/suit_cycler_choice/department/talon/crew)
/obj/machinery/suit_cycler/vintage/tpilot
name = "Talon pilot suit cycler"
model_text = "Talon pilot"
+ icon_state = "dark_cycler"
req_access = list(access_talon)
departments = list(/datum/suit_cycler_choice/department/talon/pilot)
/obj/machinery/suit_cycler/vintage/tengi
name = "Talon engineer suit cycler"
model_text = "Talon engineer"
+ icon_state = "dark_cycler"
req_access = list(access_talon)
departments = list(/datum/suit_cycler_choice/department/talon/eng)
/obj/machinery/suit_cycler/vintage/tguard
name = "Talon guard suit cycler"
model_text = "Talon guard"
+ icon_state = "dark_cycler"
req_access = list(access_talon)
departments = list(/datum/suit_cycler_choice/department/talon/marine)
/obj/machinery/suit_cycler/vintage/tmedic
name = "Talon doctor suit cycler"
model_text = "Talon doctor"
+ icon_state = "dark_cycler"
req_access = list(access_talon)
departments = list(/datum/suit_cycler_choice/department/talon/med)
/obj/machinery/suit_cycler/vintage/tcaptain
name = "Talon captain suit cycler"
model_text = "Talon captain"
+ icon_state = "dark_cycler"
req_access = list(access_talon)
departments = list(/datum/suit_cycler_choice/department/talon/officer)
/obj/machinery/suit_cycler/vintage/tminer
name = "Talon miner suit cycler"
model_text = "Talon miner"
+ icon_state = "dark_cycler"
req_access = list(access_talon)
departments = list(/datum/suit_cycler_choice/department/talon/miner)
diff --git a/code/game/machinery/suit_storage/suit_storage.dm b/code/game/machinery/suit_storage/suit_storage.dm
new file mode 100644
index 0000000000..334f5227d8
--- /dev/null
+++ b/code/game/machinery/suit_storage/suit_storage.dm
@@ -0,0 +1,476 @@
+//////////////////////////////////////
+// SUIT STORAGE UNIT /////////////////
+//////////////////////////////////////
+
+/obj/machinery/suit_storage_unit
+ name = "Suit Storage Unit"
+ desc = "An industrial U-Stor-It Storage unit designed to accomodate all kinds of space suits. Its on-board equipment also allows the user to decontaminate the contents through a UV-ray purging cycle. There's a warning label dangling from the control pad, reading \"STRICTLY NO BIOLOGICALS IN THE CONFINES OF THE UNIT\"."
+ icon = 'icons/obj/suit_storage.dmi'
+ icon_state = "suitstorage000000100" //order is: [has helmet][has suit][has human][is open][is locked][is UV cycling][is powered][is dirty/broken] [is superUVcycling]
+ anchored = TRUE
+ density = TRUE
+ var/mob/living/carbon/human/OCCUPANT = null
+ var/obj/item/clothing/suit/space/SUIT = null
+ var/suit_type = null
+ var/obj/item/clothing/head/helmet/space/HELMET = null
+ var/helmet_type = null
+ var/obj/item/clothing/mask/MASK = null //All the stuff that's gonna be stored insiiiiiiiiiiiiiiiiiiide, nyoro~n
+ var/mask_type = null //Erro's idea on standarising SSUs whle keeping creation of other SSU types easy: Make a child SSU, name it something then set the TYPE vars to your desired suit output. New() should take it from there by itself.
+ var/isopen = 0
+ var/islocked = 0
+ var/isUV = 0
+ var/ispowered = 1 //starts powered
+ var/isbroken = 0
+ var/issuperUV = 0
+ var/panelopen = 0
+ var/safetieson = 1
+ var/cycletime_left = 0
+
+/obj/machinery/suit_storage_unit/Initialize()
+ . = ..()
+ if(suit_type)
+ SUIT = new suit_type(src)
+ if(helmet_type)
+ HELMET = new helmet_type(src)
+ if(mask_type)
+ MASK = new mask_type(src)
+ update_icon()
+
+/obj/machinery/suit_storage_unit/update_icon()
+ var/hashelmet = 0
+ var/hassuit = 0
+ var/hashuman = 0
+ if(HELMET)
+ hashelmet = 1
+ if(SUIT)
+ hassuit = 1
+ if(OCCUPANT)
+ hashuman = 1
+ icon_state = text("suitstorage[][][][][][][][][]", hashelmet, hassuit, hashuman, isopen, islocked, isUV, ispowered, isbroken, issuperUV)
+
+/obj/machinery/suit_storage_unit/power_change()
+ ..()
+ if(!(stat & NOPOWER))
+ ispowered = 1
+ update_icon()
+ else
+ spawn(rand(0, 15))
+ ispowered = 0
+ islocked = 0
+ isopen = 1
+ dump_everything()
+ update_icon()
+
+/obj/machinery/suit_storage_unit/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ if(prob(50))
+ dump_everything() //So suits dont survive all the time
+ qdel(src)
+ if(2.0)
+ if(prob(50))
+ dump_everything()
+ qdel(src)
+
+/obj/machinery/suit_storage_unit/attack_hand(mob/user)
+ if(..())
+ return
+ if(stat & NOPOWER)
+ return
+ if(!user.IsAdvancedToolUser())
+ return 0
+ tgui_interact(user)
+
+/obj/machinery/suit_storage_unit/tgui_state(mob/user)
+ return GLOB.tgui_notcontained_state
+
+/obj/machinery/suit_storage_unit/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "SuitStorageUnit", name)
+ ui.open()
+
+/obj/machinery/suit_storage_unit/tgui_data()
+ var/list/data = list()
+
+ data["broken"] = isbroken
+ data["panelopen"] = panelopen
+
+ data["locked"] = islocked
+ data["open"] = isopen
+ data["safeties"] = safetieson
+ data["uv_active"] = isUV
+ data["uv_super"] = issuperUV
+ if(HELMET)
+ data["helmet"] = HELMET.name
+ else
+ data["helmet"] = null
+ if(SUIT)
+ data["suit"] = SUIT.name
+ else
+ data["suit"] = null
+ if(MASK)
+ data["mask"] = MASK.name
+ else
+ data["mask"] = null
+ data["storage"] = null
+ if(OCCUPANT)
+ data["occupied"] = TRUE
+ else
+ data["occupied"] = FALSE
+ return data
+
+/obj/machinery/suit_storage_unit/tgui_act(action, params) //I fucking HATE this proc
+ if(..() || isUV || isbroken)
+ return TRUE
+
+ switch(action)
+ if("door")
+ toggle_open(usr)
+ . = TRUE
+ if("dispense")
+ switch(params["item"])
+ if("helmet")
+ dispense_helmet(usr)
+ if("mask")
+ dispense_mask(usr)
+ if("suit")
+ dispense_suit(usr)
+ . = TRUE
+ if("uv")
+ start_UV(usr)
+ . = TRUE
+ if("lock")
+ toggle_lock(usr)
+ . = TRUE
+ if("eject_guy")
+ eject_occupant(usr)
+ . = TRUE
+
+ // Panel Open stuff
+ if(!. && panelopen)
+ switch(action)
+ if("toggleUV")
+ toggleUV(usr)
+ . = TRUE
+ if("togglesafeties")
+ togglesafeties(usr)
+ . = TRUE
+
+ update_icon()
+ add_fingerprint(usr)
+
+
+/obj/machinery/suit_storage_unit/proc/toggleUV(mob/user as mob)
+ if(!panelopen)
+ return
+
+ else //welp, the guy is protected, we can continue
+ if(issuperUV)
+ to_chat(user, "You slide the dial back towards \"185nm\".")
+ issuperUV = 0
+ else
+ to_chat(user, "You crank the dial all the way up to \"15nm\".")
+ issuperUV = 1
+ return
+
+
+/obj/machinery/suit_storage_unit/proc/togglesafeties(mob/user as mob)
+ if(!panelopen) //Needed check due to bugs
+ return
+
+ else
+ to_chat(user, "You push the button. The coloured LED next to it changes.")
+ safetieson = !safetieson
+
+
+/obj/machinery/suit_storage_unit/proc/dispense_helmet(mob/user as mob)
+ if(!HELMET)
+ return //Do I even need this sanity check? Nyoro~n
+ else
+ HELMET.loc = src.loc
+ HELMET = null
+ return
+
+
+/obj/machinery/suit_storage_unit/proc/dispense_suit(mob/user as mob)
+ if(!SUIT)
+ return
+ else
+ SUIT.loc = src.loc
+ SUIT = null
+ return
+
+
+/obj/machinery/suit_storage_unit/proc/dispense_mask(mob/user as mob)
+ if(!MASK)
+ return
+ else
+ MASK.loc = src.loc
+ MASK = null
+ return
+
+
+/obj/machinery/suit_storage_unit/proc/dump_everything()
+ islocked = 0 //locks go free
+ if(SUIT)
+ SUIT.loc = src.loc
+ SUIT = null
+ if(HELMET)
+ HELMET.loc = src.loc
+ HELMET = null
+ if(MASK)
+ MASK.loc = src.loc
+ MASK = null
+ if(OCCUPANT)
+ eject_occupant(OCCUPANT)
+ return
+
+
+/obj/machinery/suit_storage_unit/proc/toggle_open(mob/user as mob)
+ if(islocked || isUV)
+ to_chat(user, "Unable to open unit.")
+ return
+ if(OCCUPANT)
+ eject_occupant(user)
+ return // eject_occupant opens the door, so we need to return
+ isopen = !isopen
+ return
+
+
+/obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user as mob)
+ if(OCCUPANT && safetieson)
+ to_chat(user, "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments.")
+ return
+ if(isopen)
+ return
+ islocked = !islocked
+ return
+
+
+/obj/machinery/suit_storage_unit/proc/start_UV(mob/user as mob)
+ if(isUV || isopen) //I'm bored of all these sanity checks
+ return
+ if(OCCUPANT && safetieson)
+ to_chat(user, "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle.")
+ return
+ if(!HELMET && !MASK && !SUIT && !OCCUPANT) //shit's empty yo
+ to_chat(user, "Unit storage bays empty. Nothing to disinfect -- Aborting.")
+ return
+ to_chat(user, "You start the Unit's cauterisation cycle.")
+ cycletime_left = 20
+ isUV = 1
+ if(OCCUPANT && !islocked)
+ islocked = 1 //Let's lock it for good measure
+ update_icon()
+ updateUsrDialog()
+
+ var/i //our counter
+ for(i=0,i<4,i++)
+ sleep(50)
+ if(OCCUPANT)
+ OCCUPANT.apply_effect(50, IRRADIATE)
+ var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in OCCUPANT.internal_organs
+ if(!rad_organ)
+ if(OCCUPANT.can_feel_pain())
+ OCCUPANT.emote("scream")
+ if(issuperUV)
+ var/burndamage = rand(28,35)
+ OCCUPANT.take_organ_damage(0,burndamage)
+ else
+ var/burndamage = rand(6,10)
+ OCCUPANT.take_organ_damage(0,burndamage)
+ if(i==3) //End of the cycle
+ if(!issuperUV)
+ if(HELMET)
+ HELMET.clean_blood()
+ if(SUIT)
+ SUIT.clean_blood()
+ if(MASK)
+ MASK.clean_blood()
+ else //It was supercycling, destroy everything
+ if(HELMET)
+ HELMET = null
+ if(SUIT)
+ SUIT = null
+ if(MASK)
+ MASK = null
+ visible_message("With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.", 3)
+ isbroken = 1
+ isopen = 1
+ islocked = 0
+ eject_occupant(OCCUPANT) //Mixing up these two lines causes bug. DO NOT DO IT.
+ isUV = 0 //Cycle ends
+ update_icon()
+ updateUsrDialog()
+ return
+
+/obj/machinery/suit_storage_unit/proc/cycletimeleft()
+ if(cycletime_left >= 1)
+ cycletime_left--
+ return cycletime_left
+
+
+/obj/machinery/suit_storage_unit/proc/eject_occupant(mob/user as mob)
+ if(islocked)
+ return
+
+ if(!OCCUPANT)
+ return
+
+ if(OCCUPANT.client)
+ if(user != OCCUPANT)
+ to_chat(OCCUPANT, "The machine kicks you out!")
+ if(user.loc != src.loc)
+ to_chat(OCCUPANT, "You leave the not-so-cozy confines of the SSU.")
+
+ OCCUPANT.client.eye = OCCUPANT.client.mob
+ OCCUPANT.client.perspective = MOB_PERSPECTIVE
+ OCCUPANT.loc = src.loc
+ OCCUPANT = null
+ if(!isopen)
+ isopen = 1
+ update_icon()
+ return
+
+
+/obj/machinery/suit_storage_unit/verb/get_out()
+ set name = "Eject Suit Storage Unit"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.stat != 0)
+ return
+ eject_occupant(usr)
+ add_fingerprint(usr)
+ updateUsrDialog()
+ update_icon()
+ return
+
+
+/obj/machinery/suit_storage_unit/verb/move_inside()
+ set name = "Hide in Suit Storage Unit"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.stat != 0)
+ return
+ if(!isopen)
+ to_chat(usr, "The unit's doors are shut.")
+ return
+ if(!ispowered || isbroken)
+ to_chat(usr, "The unit is not operational.")
+ return
+ if((OCCUPANT) || (HELMET) || (SUIT))
+ to_chat(usr, "It's too cluttered inside for you to fit in!")
+ return
+ visible_message("[usr] starts squeezing into the suit storage unit!", 3)
+ if(do_after(usr, 10))
+ usr.stop_pulling()
+ usr.client.perspective = EYE_PERSPECTIVE
+ usr.client.eye = src
+ usr.loc = src
+ OCCUPANT = usr
+ isopen = 0 //Close the thing after the guy gets inside
+ update_icon()
+
+ add_fingerprint(usr)
+ updateUsrDialog()
+ return
+ else
+ OCCUPANT = null //Testing this as a backup sanity test
+ return
+
+
+/obj/machinery/suit_storage_unit/attackby(obj/item/I as obj, mob/user as mob)
+ if(!ispowered)
+ return
+ if(I.is_screwdriver())
+ panelopen = !panelopen
+ playsound(src, I.usesound, 100, 1)
+ to_chat(user, "You [panelopen ? "open up" : "close"] the unit's maintenance panel.")
+ updateUsrDialog()
+ return
+ if(istype(I, /obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = I
+ if(!(ismob(G.affecting)))
+ return
+ if(!isopen)
+ to_chat(user, "The unit's doors are shut.")
+ return
+ if(!ispowered || isbroken)
+ to_chat(user, "The unit is not operational.")
+ return
+ if((OCCUPANT) || (HELMET) || (SUIT)) //Unit needs to be absolutely empty
+ to_chat(user, "The unit's storage area is too cluttered.")
+ return
+ visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.", 3)
+ if(do_after(user, 20))
+ if(!G || !G.affecting) return //derpcheck
+ var/mob/M = G.affecting
+ if(M.client)
+ M.client.perspective = EYE_PERSPECTIVE
+ M.client.eye = src
+ M.loc = src
+ OCCUPANT = M
+ isopen = 0 //close ittt
+
+ add_fingerprint(user)
+ qdel(G)
+ updateUsrDialog()
+ update_icon()
+ return
+ return
+ if(istype(I,/obj/item/clothing/suit/space))
+ if(!isopen)
+ return
+ var/obj/item/clothing/suit/space/S = I
+ if(SUIT)
+ to_chat(user, "The unit already contains a suit.")
+ return
+ to_chat(user, "You load the [S.name] into the storage compartment.")
+ user.drop_item()
+ S.loc = src
+ SUIT = S
+ update_icon()
+ updateUsrDialog()
+ return
+ if(istype(I,/obj/item/clothing/head/helmet))
+ if(!isopen)
+ return
+ var/obj/item/clothing/head/helmet/H = I
+ if(HELMET)
+ to_chat(user, "The unit already contains a helmet.")
+ return
+ to_chat(user, "You load the [H.name] into the storage compartment.")
+ user.drop_item()
+ H.loc = src
+ HELMET = H
+ update_icon()
+ updateUsrDialog()
+ return
+ if(istype(I,/obj/item/clothing/mask))
+ if(!isopen)
+ return
+ var/obj/item/clothing/mask/M = I
+ if(MASK)
+ to_chat(user, "The unit already contains a mask.")
+ return
+ to_chat(user, "You load the [M.name] into the storage compartment.")
+ user.drop_item()
+ M.loc = src
+ MASK = M
+ update_icon()
+ updateUsrDialog()
+ return
+ update_icon()
+ updateUsrDialog()
+ return
+
+
+/obj/machinery/suit_storage_unit/attack_ai(mob/user as mob)
+ return attack_hand(user)
+
+//////////////////////////////REMINDER: Make it lock once you place some fucker inside.
+
+//God this entire file is fucking awful //Yes
\ No newline at end of file
diff --git a/code/game/machinery/suit_storage/suit_storage_units.dm b/code/game/machinery/suit_storage/suit_storage_units.dm
new file mode 100644
index 0000000000..740d067776
--- /dev/null
+++ b/code/game/machinery/suit_storage/suit_storage_units.dm
@@ -0,0 +1,54 @@
+//Standard
+/obj/machinery/suit_storage_unit/empty
+ suit_type = null
+ helmet_type = null
+ mask_type = null
+
+/obj/machinery/suit_storage_unit/standard_unit
+ suit_type = /obj/item/clothing/suit/space
+ helmet_type = /obj/item/clothing/head/helmet/space
+ mask_type = /obj/item/clothing/mask/breath
+
+//Engineering
+/obj/machinery/suit_storage_unit/engineering
+ suit_type = /obj/item/clothing/head/helmet/space/void/engineering
+ helmet_type = /obj/item/clothing/suit/space/void/engineering
+ mask_type = /obj/item/clothing/mask/breath
+
+/obj/machinery/suit_storage_unit/hazmat
+ suit_type = /obj/item/clothing/head/helmet/space/void/engineering/hazmat
+ helmet_type = /obj/item/clothing/suit/space/void/engineering/hazmat
+ mask_type = /obj/item/clothing/mask/breath
+
+//Mining
+/obj/machinery/suit_storage_unit/mining
+ suit_type = /obj/item/clothing/head/helmet/space/void/mining
+ helmet_type = /obj/item/clothing/suit/space/void/mining
+ mask_type = /obj/item/clothing/mask/breath
+
+/obj/machinery/suit_storage_unit/mining_alt
+ suit_type = /obj/item/clothing/head/helmet/space/void/mining/alt
+ helmet_type = /obj/item/clothing/suit/space/void/mining/alt
+ mask_type = /obj/item/clothing/mask/breath
+
+//Medical
+/obj/machinery/suit_storage_unit/medical
+ suit_type = /obj/item/clothing/head/helmet/space/void/medical
+ helmet_type = /obj/item/clothing/suit/space/void/medical
+ mask_type = /obj/item/clothing/mask/breath
+
+/obj/machinery/suit_storage_unit/emt
+ suit_type = /obj/item/clothing/head/helmet/space/void/medical/emt
+ helmet_type = /obj/item/clothing/suit/space/void/medical/emt
+ mask_type = /obj/item/clothing/mask/breath
+
+//Security
+/obj/machinery/suit_storage_unit/security
+ suit_type = /obj/item/clothing/head/helmet/space/void/security
+ helmet_type = /obj/item/clothing/suit/space/void/security
+ mask_type = /obj/item/clothing/mask/breath
+
+/obj/machinery/suit_storage_unit/riot
+ suit_type = /obj/item/clothing/head/helmet/space/void/security/riot
+ helmet_type = /obj/item/clothing/suit/space/void/security/riot
+ mask_type = /obj/item/clothing/mask/breath
\ No newline at end of file
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
deleted file mode 100644
index c8a980c2ce..0000000000
--- a/code/game/machinery/suit_storage_unit.dm
+++ /dev/null
@@ -1,1131 +0,0 @@
-//////////////////////////////////////
-// SUIT STORAGE UNIT /////////////////
-//////////////////////////////////////
-
-/obj/machinery/suit_storage_unit
- name = "Suit Storage Unit"
- desc = "An industrial U-Stor-It Storage unit designed to accomodate all kinds of space suits. Its on-board equipment also allows the user to decontaminate the contents through a UV-ray purging cycle. There's a warning label dangling from the control pad, reading \"STRICTLY NO BIOLOGICALS IN THE CONFINES OF THE UNIT\"."
- icon = 'icons/obj/suitstorage.dmi'
- icon_state = "suitstorage000000100" //order is: [has helmet][has suit][has human][is open][is locked][is UV cycling][is powered][is dirty/broken] [is superUVcycling]
- anchored = TRUE
- density = TRUE
- var/mob/living/carbon/human/OCCUPANT = null
- var/obj/item/clothing/suit/space/SUIT = null
- var/suit_type = null
- var/obj/item/clothing/head/helmet/space/HELMET = null
- var/helmet_type = null
- var/obj/item/clothing/mask/MASK = null //All the stuff that's gonna be stored insiiiiiiiiiiiiiiiiiiide, nyoro~n
- var/mask_type = null //Erro's idea on standarising SSUs whle keeping creation of other SSU types easy: Make a child SSU, name it something then set the TYPE vars to your desired suit output. New() should take it from there by itself.
- var/isopen = 0
- var/islocked = 0
- var/isUV = 0
- var/ispowered = 1 //starts powered
- var/isbroken = 0
- var/issuperUV = 0
- var/panelopen = 0
- var/safetieson = 1
- var/cycletime_left = 0
-
-//The units themselves/////////////////
-
-/obj/machinery/suit_storage_unit/standard_unit
- suit_type = /obj/item/clothing/suit/space
- helmet_type = /obj/item/clothing/head/helmet/space
- mask_type = /obj/item/clothing/mask/breath
-
-/obj/machinery/suit_storage_unit/Initialize()
- . = ..()
- if(suit_type)
- SUIT = new suit_type(src)
- if(helmet_type)
- HELMET = new helmet_type(src)
- if(mask_type)
- MASK = new mask_type(src)
- update_icon()
-
-/obj/machinery/suit_storage_unit/update_icon()
- var/hashelmet = 0
- var/hassuit = 0
- var/hashuman = 0
- if(HELMET)
- hashelmet = 1
- if(SUIT)
- hassuit = 1
- if(OCCUPANT)
- hashuman = 1
- icon_state = text("suitstorage[][][][][][][][][]", hashelmet, hassuit, hashuman, isopen, islocked, isUV, ispowered, isbroken, issuperUV)
-
-/obj/machinery/suit_storage_unit/power_change()
- ..()
- if(!(stat & NOPOWER))
- ispowered = 1
- update_icon()
- else
- spawn(rand(0, 15))
- ispowered = 0
- islocked = 0
- isopen = 1
- dump_everything()
- update_icon()
-
-/obj/machinery/suit_storage_unit/ex_act(severity)
- switch(severity)
- if(1.0)
- if(prob(50))
- dump_everything() //So suits dont survive all the time
- qdel(src)
- if(2.0)
- if(prob(50))
- dump_everything()
- qdel(src)
-
-/obj/machinery/suit_storage_unit/attack_hand(mob/user)
- if(..())
- return
- if(stat & NOPOWER)
- return
- if(!user.IsAdvancedToolUser())
- return 0
- tgui_interact(user)
-
-/obj/machinery/suit_storage_unit/tgui_state(mob/user)
- return GLOB.tgui_notcontained_state
-
-/obj/machinery/suit_storage_unit/tgui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "SuitStorageUnit", name)
- ui.open()
-
-/obj/machinery/suit_storage_unit/tgui_data()
- var/list/data = list()
-
- data["broken"] = isbroken
- data["panelopen"] = panelopen
-
- data["locked"] = islocked
- data["open"] = isopen
- data["safeties"] = safetieson
- data["uv_active"] = isUV
- data["uv_super"] = issuperUV
- if(HELMET)
- data["helmet"] = HELMET.name
- else
- data["helmet"] = null
- if(SUIT)
- data["suit"] = SUIT.name
- else
- data["suit"] = null
- if(MASK)
- data["mask"] = MASK.name
- else
- data["mask"] = null
- data["storage"] = null
- if(OCCUPANT)
- data["occupied"] = TRUE
- else
- data["occupied"] = FALSE
- return data
-
-/obj/machinery/suit_storage_unit/tgui_act(action, params) //I fucking HATE this proc
- if(..() || isUV || isbroken)
- return TRUE
-
- switch(action)
- if("door")
- toggle_open(usr)
- . = TRUE
- if("dispense")
- switch(params["item"])
- if("helmet")
- dispense_helmet(usr)
- if("mask")
- dispense_mask(usr)
- if("suit")
- dispense_suit(usr)
- . = TRUE
- if("uv")
- start_UV(usr)
- . = TRUE
- if("lock")
- toggle_lock(usr)
- . = TRUE
- if("eject_guy")
- eject_occupant(usr)
- . = TRUE
-
- // Panel Open stuff
- if(!. && panelopen)
- switch(action)
- if("toggleUV")
- toggleUV(usr)
- . = TRUE
- if("togglesafeties")
- togglesafeties(usr)
- . = TRUE
-
- update_icon()
- add_fingerprint(usr)
-
-
-/obj/machinery/suit_storage_unit/proc/toggleUV(mob/user as mob)
- if(!panelopen)
- return
-
- else //welp, the guy is protected, we can continue
- if(issuperUV)
- to_chat(user, "You slide the dial back towards \"185nm\".")
- issuperUV = 0
- else
- to_chat(user, "You crank the dial all the way up to \"15nm\".")
- issuperUV = 1
- return
-
-
-/obj/machinery/suit_storage_unit/proc/togglesafeties(mob/user as mob)
- if(!panelopen) //Needed check due to bugs
- return
-
- else
- to_chat(user, "You push the button. The coloured LED next to it changes.")
- safetieson = !safetieson
-
-
-/obj/machinery/suit_storage_unit/proc/dispense_helmet(mob/user as mob)
- if(!HELMET)
- return //Do I even need this sanity check? Nyoro~n
- else
- HELMET.loc = src.loc
- HELMET = null
- return
-
-
-/obj/machinery/suit_storage_unit/proc/dispense_suit(mob/user as mob)
- if(!SUIT)
- return
- else
- SUIT.loc = src.loc
- SUIT = null
- return
-
-
-/obj/machinery/suit_storage_unit/proc/dispense_mask(mob/user as mob)
- if(!MASK)
- return
- else
- MASK.loc = src.loc
- MASK = null
- return
-
-
-/obj/machinery/suit_storage_unit/proc/dump_everything()
- islocked = 0 //locks go free
- if(SUIT)
- SUIT.loc = src.loc
- SUIT = null
- if(HELMET)
- HELMET.loc = src.loc
- HELMET = null
- if(MASK)
- MASK.loc = src.loc
- MASK = null
- if(OCCUPANT)
- eject_occupant(OCCUPANT)
- return
-
-
-/obj/machinery/suit_storage_unit/proc/toggle_open(mob/user as mob)
- if(islocked || isUV)
- to_chat(user, "Unable to open unit.")
- return
- if(OCCUPANT)
- eject_occupant(user)
- return // eject_occupant opens the door, so we need to return
- isopen = !isopen
- return
-
-
-/obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user as mob)
- if(OCCUPANT && safetieson)
- to_chat(user, "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments.")
- return
- if(isopen)
- return
- islocked = !islocked
- return
-
-
-/obj/machinery/suit_storage_unit/proc/start_UV(mob/user as mob)
- if(isUV || isopen) //I'm bored of all these sanity checks
- return
- if(OCCUPANT && safetieson)
- to_chat(user, "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle.")
- return
- if(!HELMET && !MASK && !SUIT && !OCCUPANT) //shit's empty yo
- to_chat(user, "Unit storage bays empty. Nothing to disinfect -- Aborting.")
- return
- to_chat(user, "You start the Unit's cauterisation cycle.")
- cycletime_left = 20
- isUV = 1
- if(OCCUPANT && !islocked)
- islocked = 1 //Let's lock it for good measure
- update_icon()
- updateUsrDialog()
-
- var/i //our counter
- for(i=0,i<4,i++)
- sleep(50)
- if(OCCUPANT)
- OCCUPANT.apply_effect(50, IRRADIATE)
- var/obj/item/organ/internal/diona/nutrients/rad_organ = locate() in OCCUPANT.internal_organs
- if(!rad_organ)
- if(OCCUPANT.can_feel_pain())
- OCCUPANT.emote("scream")
- if(issuperUV)
- var/burndamage = rand(28,35)
- OCCUPANT.take_organ_damage(0,burndamage)
- else
- var/burndamage = rand(6,10)
- OCCUPANT.take_organ_damage(0,burndamage)
- if(i==3) //End of the cycle
- if(!issuperUV)
- if(HELMET)
- HELMET.clean_blood()
- if(SUIT)
- SUIT.clean_blood()
- if(MASK)
- MASK.clean_blood()
- else //It was supercycling, destroy everything
- if(HELMET)
- HELMET = null
- if(SUIT)
- SUIT = null
- if(MASK)
- MASK = null
- visible_message("With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.", 3)
- isbroken = 1
- isopen = 1
- islocked = 0
- eject_occupant(OCCUPANT) //Mixing up these two lines causes bug. DO NOT DO IT.
- isUV = 0 //Cycle ends
- update_icon()
- updateUsrDialog()
- return
-
-/obj/machinery/suit_storage_unit/proc/cycletimeleft()
- if(cycletime_left >= 1)
- cycletime_left--
- return cycletime_left
-
-
-/obj/machinery/suit_storage_unit/proc/eject_occupant(mob/user as mob)
- if(islocked)
- return
-
- if(!OCCUPANT)
- return
-
- if(OCCUPANT.client)
- if(user != OCCUPANT)
- to_chat(OCCUPANT, "The machine kicks you out!")
- if(user.loc != src.loc)
- to_chat(OCCUPANT, "You leave the not-so-cozy confines of the SSU.")
-
- OCCUPANT.client.eye = OCCUPANT.client.mob
- OCCUPANT.client.perspective = MOB_PERSPECTIVE
- OCCUPANT.loc = src.loc
- OCCUPANT = null
- if(!isopen)
- isopen = 1
- update_icon()
- return
-
-
-/obj/machinery/suit_storage_unit/verb/get_out()
- set name = "Eject Suit Storage Unit"
- set category = "Object"
- set src in oview(1)
-
- if(usr.stat != 0)
- return
- eject_occupant(usr)
- add_fingerprint(usr)
- updateUsrDialog()
- update_icon()
- return
-
-
-/obj/machinery/suit_storage_unit/verb/move_inside()
- set name = "Hide in Suit Storage Unit"
- set category = "Object"
- set src in oview(1)
-
- if(usr.stat != 0)
- return
- if(!isopen)
- to_chat(usr, "The unit's doors are shut.")
- return
- if(!ispowered || isbroken)
- to_chat(usr, "The unit is not operational.")
- return
- if((OCCUPANT) || (HELMET) || (SUIT))
- to_chat(usr, "It's too cluttered inside for you to fit in!")
- return
- visible_message("[usr] starts squeezing into the suit storage unit!", 3)
- if(do_after(usr, 10))
- usr.stop_pulling()
- usr.client.perspective = EYE_PERSPECTIVE
- usr.client.eye = src
- usr.loc = src
- OCCUPANT = usr
- isopen = 0 //Close the thing after the guy gets inside
- update_icon()
-
- add_fingerprint(usr)
- updateUsrDialog()
- return
- else
- OCCUPANT = null //Testing this as a backup sanity test
- return
-
-
-/obj/machinery/suit_storage_unit/attackby(obj/item/I as obj, mob/user as mob)
- if(!ispowered)
- return
- if(I.is_screwdriver())
- panelopen = !panelopen
- playsound(src, I.usesound, 100, 1)
- to_chat(user, "You [panelopen ? "open up" : "close"] the unit's maintenance panel.")
- updateUsrDialog()
- return
- if(istype(I, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = I
- if(!(ismob(G.affecting)))
- return
- if(!isopen)
- to_chat(user, "The unit's doors are shut.")
- return
- if(!ispowered || isbroken)
- to_chat(user, "The unit is not operational.")
- return
- if((OCCUPANT) || (HELMET) || (SUIT)) //Unit needs to be absolutely empty
- to_chat(user, "The unit's storage area is too cluttered.")
- return
- visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.", 3)
- if(do_after(user, 20))
- if(!G || !G.affecting) return //derpcheck
- var/mob/M = G.affecting
- if(M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
- M.loc = src
- OCCUPANT = M
- isopen = 0 //close ittt
-
- add_fingerprint(user)
- qdel(G)
- updateUsrDialog()
- update_icon()
- return
- return
- if(istype(I,/obj/item/clothing/suit/space))
- if(!isopen)
- return
- var/obj/item/clothing/suit/space/S = I
- if(SUIT)
- to_chat(user, "The unit already contains a suit.")
- return
- to_chat(user, "You load the [S.name] into the storage compartment.")
- user.drop_item()
- S.loc = src
- SUIT = S
- update_icon()
- updateUsrDialog()
- return
- if(istype(I,/obj/item/clothing/head/helmet))
- if(!isopen)
- return
- var/obj/item/clothing/head/helmet/H = I
- if(HELMET)
- to_chat(user, "The unit already contains a helmet.")
- return
- to_chat(user, "You load the [H.name] into the storage compartment.")
- user.drop_item()
- H.loc = src
- HELMET = H
- update_icon()
- updateUsrDialog()
- return
- if(istype(I,/obj/item/clothing/mask))
- if(!isopen)
- return
- var/obj/item/clothing/mask/M = I
- if(MASK)
- to_chat(user, "The unit already contains a mask.")
- return
- to_chat(user, "You load the [M.name] into the storage compartment.")
- user.drop_item()
- M.loc = src
- MASK = M
- update_icon()
- updateUsrDialog()
- return
- update_icon()
- updateUsrDialog()
- return
-
-
-/obj/machinery/suit_storage_unit/attack_ai(mob/user as mob)
- return attack_hand(user)
-
-//////////////////////////////REMINDER: Make it lock once you place some fucker inside.
-
-//God this entire file is fucking awful //Yes
-//Suit painter for Bay's special snowflake aliums.
-
-GLOBAL_LIST_EMPTY(suit_cycler_typecache)
-/obj/machinery/suit_cycler
-
- name = "suit cycler"
- desc = "An industrial machine for painting and refitting voidsuits."
- anchored = TRUE
- density = TRUE
-
- icon = 'icons/obj/suitstorage.dmi'
- icon_state = "suitstorage000000100"
-
- req_access = list(access_captain,access_heads)
-
- var/active = 0 // PLEASE HOLD.
- var/safeties = 1 // The cycler won't start with a living thing inside it unless safeties are off.
- var/irradiating = 0 // If this is > 0, the cycler is decontaminating whatever is inside it.
- var/radiation_level = 2 // 1 is removing germs, 2 is removing blood, 3 is removing phoron.
- var/model_text = "" // Some flavour text for the topic box.
- var/locked = 1 // If locked, nothing can be taken from or added to the cycler.
- var/can_repair // If set, the cycler can repair voidsuits.
- var/electrified = 0
-
- /// Departments that the cycler can paint suits to look like. Null assumes all except specially excluded ones.
- /// No idea why these particular suits are the default cycler's options.
- var/list/limit_departments = list(
- /datum/suit_cycler_choice/department/eng/standard,
- /datum/suit_cycler_choice/department/crg/mining,
- /datum/suit_cycler_choice/department/med/standard,
- /datum/suit_cycler_choice/department/sec/standard,
- /datum/suit_cycler_choice/department/eng/atmospherics,
- /datum/suit_cycler_choice/department/eng/hazmat,
- /datum/suit_cycler_choice/department/eng/construction,
- /datum/suit_cycler_choice/department/med/biohazard,
- /datum/suit_cycler_choice/department/med/emt,
- /datum/suit_cycler_choice/department/sec/riot,
- /datum/suit_cycler_choice/department/sec/eva
- )
-
- /// Species that the cycler can refit suits for. Null assumes all except specially excluded ones.
- var/list/limit_species
-
- var/list/departments
- var/list/species
- var/list/emagged_departments
-
- var/datum/suit_cycler_choice/department/target_department
- var/datum/suit_cycler_choice/species/target_species
-
- var/mob/living/carbon/human/occupant = null
- var/obj/item/clothing/suit/space/void/suit = null
- var/obj/item/clothing/head/helmet/space/helmet = null
-
- var/datum/wires/suit_storage_unit/wires = null
-
-/obj/machinery/suit_cycler/Initialize()
- . = ..()
-
- departments = load_departments()
- species = load_species()
- emagged_departments = load_emagged()
- limit_departments = null // just for mem
-
- target_department = departments["No Change"]
- target_species = species["No Change"]
-
- if(!target_department || !target_species)
- stat |= BROKEN
-
- wires = new(src)
-
-/obj/machinery/suit_cycler/Destroy()
- qdel(wires)
- wires = null
- return ..()
-
-/obj/machinery/suit_cycler/proc/load_departments()
- var/list/typecache = GLOB.suit_cycler_typecache[type]
- // First of our type
- if(!typecache)
- typecache = list()
- GLOB.suit_cycler_typecache[type] = typecache
- var/list/loaded = typecache["departments"]
- // No departments loaded
- if(!loaded)
- loaded = list()
- typecache["departments"] = loaded
- for(var/datum/suit_cycler_choice/department/thing as anything in GLOB.suit_cycler_departments)
- if(istype(thing, /datum/suit_cycler_choice/department/noop))
- loaded[thing.name] = thing
- continue
- if(limit_departments && !is_type_in_list(thing, limit_departments))
- continue
- loaded[thing.name] = thing
-
- return loaded
-
-/obj/machinery/suit_cycler/proc/load_species()
- var/list/typecache = GLOB.suit_cycler_typecache[type]
- // First of our type
- if(!typecache)
- typecache = list()
- GLOB.suit_cycler_typecache[type] = typecache
- var/list/loaded = typecache["species"]
- // No species loaded
- if(!loaded)
- loaded = list()
- typecache["species"] = loaded
- for(var/datum/suit_cycler_choice/species/thing as anything in GLOB.suit_cycler_species)
- if(istype(thing, /datum/suit_cycler_choice/species/noop))
- loaded[thing.name] = thing
- continue
- if(limit_species && !is_type_in_list(thing, limit_species))
- continue
- loaded[thing.name] = thing
-
- return loaded
-
-/obj/machinery/suit_cycler/proc/load_emagged()
- var/list/typecache = GLOB.suit_cycler_typecache[type]
- // First of our type
- if(!typecache)
- typecache = list()
- GLOB.suit_cycler_typecache[type] = typecache
- var/list/loaded = typecache["emagged"]
- // No emagged loaded
- if(!loaded)
- loaded = list()
- typecache["emagged"] = loaded
- for(var/datum/suit_cycler_choice/department/thing as anything in GLOB.suit_cycler_emagged)
- loaded[thing.name] = thing
-
- return loaded
-
-/obj/machinery/suit_cycler/refit_only
- name = "Suit cycler"
- desc = "A dedicated industrial machine that can refit voidsuits for different species, but not change the suit's overall appearance or departmental scheme."
- model_text = "General Access"
- req_access = null
- limit_departments = list()
-
-/obj/machinery/suit_cycler/engineering
- name = "Engineering suit cycler"
- model_text = "Engineering"
- req_access = list(access_construction)
- limit_departments = list(
- /datum/suit_cycler_choice/department/eng
- )
-
-/obj/machinery/suit_cycler/mining
- name = "Mining suit cycler"
- model_text = "Mining"
- req_access = list(access_mining)
- limit_departments = list(
- /datum/suit_cycler_choice/department/crg
- )
-
-/obj/machinery/suit_cycler/security
- name = "Security suit cycler"
- model_text = "Security"
- req_access = list(access_security)
- limit_departments = list(
- /datum/suit_cycler_choice/department/sec
- )
-
-/obj/machinery/suit_cycler/medical
- name = "Medical suit cycler"
- model_text = "Medical"
- req_access = list(access_medical)
- limit_departments = list(
- /datum/suit_cycler_choice/department/med
- )
-
-/obj/machinery/suit_cycler/syndicate
- name = "Nonstandard suit cycler"
- model_text = "Nonstandard"
- req_access = list(access_syndicate)
- limit_departments = list(
- /datum/suit_cycler_choice/department/emag
- )
- can_repair = 1
-/obj/machinery/suit_cycler/exploration
- name = "Explorer suit cycler"
- model_text = "Exploration"
- limit_departments = list(
- /datum/suit_cycler_choice/department/exp
- )
-/obj/machinery/suit_cycler/pilot
- name = "Pilot suit cycler"
- model_text = "Pilot"
- limit_departments = list(
- /datum/suit_cycler_choice/department/pil
- )
-
-/obj/machinery/suit_cycler/vintage
- name = "Vintage Crew suit cycler"
- model_text = "Vintage"
- limit_departments = list(
- /datum/suit_cycler_choice/department/vintage/crew
- )
- req_access = null
-
-/obj/machinery/suit_cycler/vintage/pilot
- name = "Vintage Pilot suit cycler"
- model_text = "Vintage Pilot"
- limit_departments = list(
- /datum/suit_cycler_choice/department/vintage/pilot
- )
-
-/obj/machinery/suit_cycler/vintage/medsci
- name = "Vintage MedSci suit cycler"
- model_text = "Vintage MedSci"
- limit_departments = list(
- /datum/suit_cycler_choice/department/vintage/research,
- /datum/suit_cycler_choice/department/vintage/med
- )
-
-/obj/machinery/suit_cycler/vintage/rugged
- name = "Vintage Ruggedized suit cycler"
- model_text = "Vintage Ruggedized"
-
- limit_departments = list(
- /datum/suit_cycler_choice/department/vintage/eng,
- /datum/suit_cycler_choice/department/vintage/marine,
- /datum/suit_cycler_choice/department/vintage/officer,
- /datum/suit_cycler_choice/department/vintage/merc
- )
-
-/obj/machinery/suit_cycler/vintage/omni
- name = "Vintage Master suit cycler"
- model_text = "Vintage Master"
- limit_departments = list(
- /datum/suit_cycler_choice/department/vintage
- )
-
-/obj/machinery/suit_cycler/attack_ai(mob/user as mob)
- return attack_hand(user)
-
-/obj/machinery/suit_cycler/attackby(obj/item/I as obj, mob/user as mob)
-
- if(electrified != 0)
- if(shock(user, 100))
- return
-
- //Hacking init.
- if(istype(I, /obj/item/device/multitool) || I.is_wirecutter())
- if(panel_open)
- attack_hand(user)
- return
- //Other interface stuff.
- if(istype(I, /obj/item/weapon/grab))
- var/obj/item/weapon/grab/G = I
-
- if(!(ismob(G.affecting)))
- return
-
- if(locked)
- to_chat(user, "The suit cycler is locked.")
- return
-
- if(contents.len > 0)
- to_chat(user, "There is no room inside the cycler for [G.affecting.name].")
- return
-
- visible_message("[user] starts putting [G.affecting.name] into the suit cycler.", 3)
-
- if(do_after(user, 20))
- if(!G || !G.affecting) return
- var/mob/M = G.affecting
- if(M.client)
- M.client.perspective = EYE_PERSPECTIVE
- M.client.eye = src
- M.loc = src
- occupant = M
-
- add_fingerprint(user)
- qdel(G)
-
- updateUsrDialog()
-
- return
- else if(I.is_screwdriver())
-
- panel_open = !panel_open
- playsound(src, I.usesound, 50, 1)
- to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
- updateUsrDialog()
- return
-
- else if(istype(I,/obj/item/clothing/head/helmet/space/void) && !istype(I, /obj/item/clothing/head/helmet/space/rig))
- var/obj/item/clothing/head/helmet/space/void/IH = I
-
- if(locked)
- to_chat(user, "The suit cycler is locked.")
- return
-
- if(helmet)
- to_chat(user, "The cycler already contains a helmet.")
- return
-
- if(IH.no_cycle)
- to_chat(user, "That item is not compatible with the cycler's protocols.")
- return
-
- if(I.icon_override == CUSTOM_ITEM_MOB)
- to_chat(user, "You cannot refit a customised voidsuit.")
- return
-
- //VOREStation Edit BEGINS
- //Make it so autolok suits can't be refitted in a cycler
- if(istype(I,/obj/item/clothing/head/helmet/space/void/autolok))
- to_chat(user, "You cannot refit an autolok helmet. In fact you shouldn't even be able to remove it in the first place. Inform an admin!")
- return
-
- //Ditto the Mk7
- if(istype(I,/obj/item/clothing/head/helmet/space/void/responseteam))
- to_chat(user, "The cycler indicates that the Mark VII Emergency Response Helmet is not compatible with the refitting system. How did you manage to detach it anyway? Inform an admin!")
- return
- //VOREStation Edit ENDS
-
- to_chat(user, "You fit \the [I] into the suit cycler.")
- user.drop_item()
- I.loc = src
- helmet = I
-
- update_icon()
- updateUsrDialog()
- return
-
- else if(istype(I,/obj/item/clothing/suit/space/void))
- var/obj/item/clothing/suit/space/void/IS = I
-
- if(locked)
- to_chat(user, "The suit cycler is locked.")
- return
-
- if(suit)
- to_chat(user, "The cycler already contains a voidsuit.")
- return
-
- if(IS.no_cycle)
- to_chat(user, "That item is not compatible with the cycler's protocols.")
- return
-
- if(I.icon_override == CUSTOM_ITEM_MOB)
- to_chat(user, "You cannot refit a customised voidsuit.")
- return
-
- //VOREStation Edit BEGINS
- //Make it so autolok suits can't be refitted in a cycler
- if(istype(I,/obj/item/clothing/suit/space/void/autolok))
- to_chat(user, "You cannot refit an autolok suit.")
- return
-
- //Ditto the Mk7
- if(istype(I,/obj/item/clothing/suit/space/void/responseteam))
- to_chat(user, "The cycler indicates that the Mark VII Emergency Response Suit is not compatible with the refitting system.")
- return
- //VOREStation Edit ENDS
-
- to_chat(user, "You fit \the [I] into the suit cycler.")
- user.drop_item()
- I.loc = src
- suit = I
-
- update_icon()
- updateUsrDialog()
- return
-
- ..()
-
-/obj/machinery/suit_cycler/emag_act(var/remaining_charges, var/mob/user)
- if(emagged)
- to_chat(user, "The cycler has already been subverted.")
- return
-
- //Clear the access reqs, disable the safeties, and open up all paintjobs.
- to_chat(user, "You run the sequencer across the interface, corrupting the operating protocols.")
-
- emagged = 1
- safeties = 0
- req_access = list()
- updateUsrDialog()
- return 1
-
-/obj/machinery/suit_cycler/attack_hand(mob/user as mob)
- add_fingerprint(user)
- if(..() || stat & (BROKEN|NOPOWER))
- return
-
- if(!user.IsAdvancedToolUser())
- return 0
-
- if(electrified != 0)
- if(shock(user, 100))
- return
-
- tgui_interact(user)
-
-/obj/machinery/suit_cycler/tgui_state(mob/user)
- return GLOB.tgui_notcontained_state
-
-/obj/machinery/suit_cycler/tgui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "SuitCycler", name)
- ui.open()
-
-/obj/machinery/suit_cycler/tgui_data(mob/user)
- var/list/data = list()
-
- data["model_text"] = model_text
- data["can_repair"] = can_repair
- data["userHasAccess"] = allowed(user)
-
- data["locked"] = locked
- data["active"] = active
- data["safeties"] = safeties
- data["uv_active"] = (active && irradiating > 0)
- data["uv_level"] = radiation_level
- data["max_uv_level"] = emagged ? 5 : 3
- if(helmet)
- data["helmet"] = helmet.name
- else
- data["helmet"] = null
- if(suit)
- data["suit"] = suit.name
- if(istype(suit) && can_repair)
- data["damage"] = suit.damage
- else
- data["suit"] = null
- data["damage"] = null
- if(occupant)
- data["occupied"] = TRUE
- else
- data["occupied"] = FALSE
-
- return data
-
-/obj/machinery/suit_cycler/tgui_static_data(mob/user)
- var/list/data = list()
-
- // tgui gets angy if you pass values too
- var/list/department_keys = list()
- for(var/key in departments)
- department_keys += key
-
- // emagged at the bottom
- if(emagged)
- for(var/key in emagged_departments)
- department_keys += key
-
- var/list/species_keys = list()
- for(var/key in species)
- species_keys += key
-
- data["departments"] = department_keys
- data["species"] = species_keys
-
- return data
-
-/obj/machinery/suit_cycler/tgui_act(action, params)
- if(..())
- return TRUE
-
- switch(action)
- if("dispense")
- switch(params["item"])
- if("helmet")
- helmet.forceMove(get_turf(src))
- helmet = null
- if("suit")
- suit.forceMove(get_turf(src))
- suit = null
- . = TRUE
-
- if("department")
- var/choice = params["department"]
- if(choice in departments)
- target_department = departments[choice]
- else if(emagged && (choice in emagged_departments))
- target_department = emagged_departments[choice]
- . = TRUE
-
- if("species")
- var/choice = params["species"]
- if(choice in species)
- target_species = species[choice]
- . = TRUE
-
- if("radlevel")
- radiation_level = clamp(params["radlevel"], 1, emagged ? 5 : 3)
- . = TRUE
-
- if("repair_suit")
- if(!suit || !can_repair)
- return
- active = 1
- spawn(100)
- repair_suit()
- finished_job()
- . = TRUE
-
- if("apply_paintjob")
- if(!suit && !helmet)
- return
- active = 1
- spawn(100)
- apply_paintjob()
- finished_job()
- . = TRUE
-
- if("lock")
- if(allowed(usr))
- locked = !locked
- to_chat(usr, "You [locked ? "" : "un"]lock \the [src].")
- else
- to_chat(usr, "Access denied.")
- . = TRUE
-
- if("eject_guy")
- eject_occupant(usr)
- . = TRUE
-
- if("uv")
- if(safeties && occupant)
- to_chat(usr, "The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.")
- return
-
- active = 1
- irradiating = 10
-
- sleep(10)
-
- if(helmet)
- if(radiation_level > 2)
- helmet.decontaminate()
- if(radiation_level > 1)
- helmet.clean_blood()
-
- if(suit)
- if(radiation_level > 2)
- suit.decontaminate()
- if(radiation_level > 1)
- suit.clean_blood()
-
- . = TRUE
-
-/obj/machinery/suit_cycler/process()
-
- if(electrified > 0)
- electrified--
-
- if(!active)
- return
-
- if(active && stat & (BROKEN|NOPOWER))
- active = 0
- irradiating = 0
- electrified = 0
- return
-
- if(irradiating == 1)
- finished_job()
- irradiating = 0
- return
-
- irradiating--
-
- if(occupant)
- if(prob(radiation_level*2)) occupant.emote("scream")
- if(radiation_level > 2)
- occupant.take_organ_damage(0,radiation_level*2 + rand(1,3))
- if(radiation_level > 1)
- occupant.take_organ_damage(0,radiation_level + rand(1,3))
- occupant.apply_effect(radiation_level*10, IRRADIATE)
-
-/obj/machinery/suit_cycler/proc/finished_job()
- var/turf/T = get_turf(src)
- T.visible_message("\icon[src][bicon(src)]The [src] beeps several times.")
- icon_state = initial(icon_state)
- active = 0
- playsound(src, 'sound/machines/boobeebeep.ogg', 50)
- updateUsrDialog()
-
-/obj/machinery/suit_cycler/proc/repair_suit()
- if(!suit || !suit.damage || !suit.can_breach)
- return
-
- suit.breaches = list()
- suit.calc_breach_damage()
-
- return
-
-/obj/machinery/suit_cycler/verb/leave()
- set name = "Eject Cycler"
- set category = "Object"
- set src in oview(1)
-
- if(usr.stat != 0)
- return
-
- eject_occupant(usr)
-
-/obj/machinery/suit_cycler/proc/eject_occupant(mob/user as mob)
-
- if(locked || active)
- to_chat(user, "The cycler is locked.")
- return
-
- if(!occupant)
- return
-
- if(occupant.client)
- occupant.client.eye = occupant.client.mob
- occupant.client.perspective = MOB_PERSPECTIVE
-
- occupant.loc = get_turf(occupant)
- occupant = null
-
- add_fingerprint(user)
- updateUsrDialog()
- update_icon()
-
- return
-
-// "Streamlined" before? Ok. -Aro
-/obj/machinery/suit_cycler/proc/apply_paintjob()
- if(!target_species || !target_department)
- return
-
- // Helmet to new paint
- if(target_department.can_refit_helmet(helmet))
- target_department.do_refit_helmet(helmet)
- // Suit to new paint
- if(target_department.can_refit_suit(suit))
- target_department.do_refit_suit(suit)
- // Attached voidsuit helmet to new paint
- if(target_department.can_refit_helmet(suit?.helmet))
- target_department.do_refit_helmet(suit.helmet)
-
- // Species fitting for all 3 potential changes
- if(target_species.can_refit_to(helmet, suit, suit?.helmet))
- target_species.do_refit_to(helmet, suit, suit?.helmet)
- else
- visible_message("\icon[src][bicon(src)]Unable to apply specified cosmetics with specified species. Please try again with a different species or cosmetic option selected.")
- return
diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm
index 8c1bc87f3f..377a02aa74 100644
--- a/code/game/machinery/supplybeacon.dm
+++ b/code/game/machinery/supplybeacon.dm
@@ -114,6 +114,6 @@
var/drop_x = src.x - 2
var/drop_y = src.y - 2
var/drop_z = src.z
- command_announcement.Announce("[using_map.starsys_name] Rapid Fabrication priority supply request #[rand(1000,9999)]-[rand(100,999)] recieved. Shipment dispatched via ballistic supply pod for immediate delivery. Have a nice day.", "Thank You For Your Patronage")
+ command_announcement.Announce("[using_map.starsys_name] Rapid Fabrication priority supply request #[rand(1000,9999)]-[rand(100,999)] received. Shipment dispatched via ballistic supply pod for immediate delivery. Have a nice day.", "Thank You For Your Patronage")
spawn(rand(100, 300))
new /datum/random_map/droppod/supply(null, drop_x, drop_y, drop_z, supplied_drop = drop_type) // Splat.
diff --git a/code/game/machinery/syndicatebeacon_vr.dm b/code/game/machinery/syndicatebeacon_vr.dm
index 668b36dcb7..30dd61458c 100644
--- a/code/game/machinery/syndicatebeacon_vr.dm
+++ b/code/game/machinery/syndicatebeacon_vr.dm
@@ -36,7 +36,7 @@
traitors.spawn_uplink(N)
N.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT
N.mind.accept_tcrystals = 1
- message_admins("[N]/([N.ckey]) has recieved an uplink and telecrystals from the syndicate beacon.")
+ message_admins("[N]/([N.ckey]) has received an uplink and telecrystals from the syndicate beacon.")
updateUsrDialog()
return
diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm
index e23f7dd8b2..9c25b9f650 100644
--- a/code/game/machinery/telecomms/telecomunications.dm
+++ b/code/game/machinery/telecomms/telecomunications.dm
@@ -37,6 +37,8 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
var/hide = 0 // Is it a hidden machine?
var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to.
+ var/datum/looping_sound/tcomms/soundloop // CHOMPStation Add: Hummy noises
+ var/noisy = TRUE // CHOMPStation Add: Hummy noises, this starts on
/obj/machinery/telecomms/proc/relay_information(datum/signal/signal, filter, copysig, amount = 20)
// relay signal to all linked machinery that are of type [filter]. If signal has been sent [amount] times, stop sending
@@ -132,6 +134,20 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
else
for(var/obj/machinery/telecomms/T in telecomms_list)
add_link(T)
+ // CHOMPAdd: TComms humming
+ soundloop = new(list(src), FALSE)
+ if(prob(60)) // 60% chance to change the midloop
+ if(prob(40))
+ soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_02.ogg' = 1)
+ soundloop.mid_length = 40
+ else if(prob(20))
+ soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_03.ogg' = 1)
+ soundloop.mid_length = 10
+ else
+ soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_04.ogg' = 1)
+ soundloop.mid_length = 30
+ soundloop.start()
+ // CHOMPAdd End
. = ..()
/obj/machinery/telecomms/Destroy()
@@ -139,6 +155,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
for(var/obj/machinery/telecomms/comm in telecomms_list)
comm.links -= src
links = list()
+ QDEL_NULL(soundloop) // CHOMPAdd: Tcomms noises
..()
// Used in auto linking
@@ -162,10 +179,17 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
if(toggled)
if(stat & (BROKEN|NOPOWER|EMPED) || integrity <= 0) // if powered, on. if not powered, off. if too damaged, off
on = 0
+ soundloop.stop() // CHOMPAdd: Tcomms noises
+ noisy = FALSE
else
on = 1
else
on = 0
+ soundloop.stop() // CHOMPAdd: Tcomms noises
+ noisy = FALSE
+ if(!noisy) // CHOMPAdd: Tcomms noises
+ soundloop.start() // CHOMPAdd: Tcomms noises
+ noisy = TRUE
/obj/machinery/telecomms/process()
update_power()
@@ -183,6 +207,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
if(prob(100/severity))
if(!(stat & EMPED))
stat |= EMPED
+ playsound(src, 'sound/machines/tcomms/tcomms_pulse.ogg', 70, 1, 30) // CHOMPAdd: Tcomms noises
var/duration = (300 * 10)/severity
spawn(rand(duration - 20, duration + 20)) // Takes a long time for the machines to reboot.
stat &= ~EMPED
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index e46eb5117a..ddab98d730 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -566,7 +566,7 @@
"View Stats" = radial_image_statpanel
)
- var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_occupant_radial, user), require_near = TRUE, tooltips = TRUE)
+ var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, PROC_REF(check_occupant_radial), user), require_near = TRUE, tooltips = TRUE)
if(!check_occupant_radial(user))
return
if(!choice)
diff --git a/code/game/objects/effects/alien/aliens.dm b/code/game/objects/effects/alien/aliens.dm
index 8cdeb690e4..2807dbb4d9 100644
--- a/code/game/objects/effects/alien/aliens.dm
+++ b/code/game/objects/effects/alien/aliens.dm
@@ -10,7 +10,7 @@
*/
/obj/effect/alien
name = "alien thing"
- desc = "theres something alien about this"
+ desc = "there's something alien about this"
icon = 'icons/mob/alien.dmi'
/*
@@ -289,3 +289,5 @@
if(0 to 1)
visible_message("[src.target] begins to crumble under the acid!")
spawn(rand(150, 200)) tick()
+
+//Xenomorph Effect egg removed, replaced with Structure Egg.
diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm
index 5dad8accc4..b57145c801 100644
--- a/code/game/objects/effects/chem/foam.dm
+++ b/code/game/objects/effects/chem/foam.dm
@@ -23,9 +23,9 @@
metal = ismetal
playsound(src, 'sound/effects/bubbles2.ogg', 80, 1, -3)
if(dries) //VOREStation Add
- addtimer(CALLBACK(src, .proc/post_spread), 3 + metal * 3)
- addtimer(CALLBACK(src, .proc/pre_harden), 12 SECONDS)
- addtimer(CALLBACK(src, .proc/harden), 15 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(post_spread)), 3 + metal * 3)
+ addtimer(CALLBACK(src, PROC_REF(pre_harden)), 12 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(harden)), 15 SECONDS)
/obj/effect/effect/foam/proc/post_spread()
process()
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 6f96ec1689..7366912038 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -49,7 +49,7 @@ var/global/list/image/splatter_cache=list()
if (B.blood_DNA)
blood_DNA |= B.blood_DNA.Copy()
qdel(B)
- addtimer(CALLBACK(src, .proc/dry), DRYING_TIME * (amount+1))
+ addtimer(CALLBACK(src, PROC_REF(dry)), DRYING_TIME * (amount+1))
/obj/effect/decal/cleanable/blood/update_icon()
if(basecolor == "rainbow") basecolor = get_random_colour(1)
diff --git a/code/game/objects/effects/map_effects/beam_point.dm b/code/game/objects/effects/map_effects/beam_point.dm
index c10e8b0315..6a023a0470 100644
--- a/code/game/objects/effects/map_effects/beam_point.dm
+++ b/code/game/objects/effects/map_effects/beam_point.dm
@@ -36,7 +36,7 @@ GLOBAL_LIST_EMPTY(all_beam_points)
if(make_beams_on_init)
create_beams()
if(use_timer)
- addtimer(CALLBACK(src, .proc/handle_beam_timer), initial_delay)
+ addtimer(CALLBACK(src, PROC_REF(handle_beam_timer)), initial_delay)
return ..()
/obj/effect/map_effect/beam_point/Destroy()
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index 89b0bc2e87..aba53f81bc 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -4,7 +4,7 @@
density = FALSE
anchored = TRUE
icon = 'icons/obj/weapons.dmi'
- icon_state = "uglymine"
+ icon_state = "landmine"
var/triggered = 0
var/smoke_strength = 3
var/obj/item/weapon/mine/mineitemtype = /obj/item/weapon/mine
@@ -16,7 +16,7 @@
var/obj/item/trap = null
/obj/effect/mine/Initialize()
- icon_state = "uglyminearmed"
+ icon_state = "landmine_armed"
wires = new(src)
. = ..()
if(ispath(trap))
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
index cbf8db46be..0b962a48b6 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/impact.dm
@@ -102,4 +102,12 @@
light_color = "#80F5FF"
//VOREStation edit ends
/obj/effect/projectile/impact/pointdefense
- icon_state = "impact_pointdef"
\ No newline at end of file
+ icon_state = "impact_pointdef"
+ //CHOMPStation add coilgun pointdefense
+/obj/effect/projectile/impact/coildefense
+ icon = 'icons/obj/projectiles_impact_ch.dmi'
+ icon_state = "impact_coildef"
+ light_range = 2
+ light_power = 3
+ light_color = "#FFFFFF"
+//CHOMPStation add end <3
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
index a817c9e74d..b2e73ead43 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/muzzle.dm
@@ -114,4 +114,12 @@
light_color = "#80F5FF"
//VOREStation edit ends
/obj/effect/projectile/muzzle/pointdefense
- icon_state = "muzzle_pointdef"
\ No newline at end of file
+ icon_state = "muzzle_pointdef"
+//CHOMPStation add coilgun pointdefense
+/obj/effect/projectile/muzzle/coildefense
+ icon = 'icons/obj/projectiles_muzzle_ch.dmi'
+ icon_state = "muzzle_coildef"
+ light_range = 3
+ light_power = 1
+ light_color = "#FFFFFF"
+//CHOMPStation add end <3
diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
index 01a6b64e1c..f6d03516c6 100644
--- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
+++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm
@@ -141,4 +141,12 @@
light_color = "#80F5FF"
//VOREStation edit ends
/obj/effect/projectile/tracer/pointdefense
- icon_state = "beam_pointdef"
\ No newline at end of file
+ icon_state = "beam_pointdef"
+//CHOMPStation add coilgun pointdefense
+/obj/effect/projectile/tracer/coildefense
+ icon = 'icons/obj/projectiles_tracer_ch.dmi'
+ icon_state = "tracer_coildef"
+ light_range = 1
+ light_power = 2
+ light_color = "#FFFFFF"
+//CHOMPStation add end <3
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index cb2150f29b..57aa00fe99 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -109,7 +109,10 @@
var/tip_timer // reference to timer id for a tooltip we might open soon
var/no_random_knockdown = FALSE //stops item from being able to randomly knock people down in combat
-
+
+ var/rock_climbing = FALSE //If true, allows climbing cliffs using click drag for single Z, walls if multiZ
+ var/climbing_delay = 1 //If rock_climbing, lower better.
+
/obj/item/Initialize(mapload) //CHOMPedit I stg I'm going to overwrite these many uncommented edits.
. = ..()
if(islist(origin_tech))
@@ -734,7 +737,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
H.toggle_zoom_hud() // If the user has already limited their HUD this avoids them having a HUD when they zoom in
H.set_viewsize(viewsize)
zoom = 1
- GLOB.moved_event.register(H, src, .proc/zoom)
+ GLOB.moved_event.register(H, src, PROC_REF(zoom))
var/tilesize = 32
var/viewoffset = tilesize * tileoffset
@@ -763,7 +766,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
if(!H.hud_used.hud_shown)
H.toggle_zoom_hud()
zoom = 0
- GLOB.moved_event.unregister(H, src, .proc/zoom)
+ GLOB.moved_event.unregister(H, src, PROC_REF(zoom))
H.client.pixel_x = 0
H.client.pixel_y = 0
@@ -944,7 +947,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
. = ..()
if(usr.is_preference_enabled(/datum/client_preference/inv_tooltips) && ((src in usr) || isstorage(loc))) // If in inventory or in storage we're looking at
var/user = usr
- tip_timer = addtimer(CALLBACK(src, .proc/openTip, location, control, params, user), 5, TIMER_STOPPABLE)
+ tip_timer = addtimer(CALLBACK(src, PROC_REF(openTip), location, control, params, user), 5, TIMER_STOPPABLE)
/obj/item/MouseExited()
. = ..()
diff --git a/code/game/objects/items/contraband_vr.dm b/code/game/objects/items/contraband_vr.dm
index 6737788486..804dd4b554 100644
--- a/code/game/objects/items/contraband_vr.dm
+++ b/code/game/objects/items/contraband_vr.dm
@@ -92,18 +92,6 @@
to_chat(user, "You unwrap the package.")
qdel(src)
-/obj/item/weapon/storage/fancy/cigar/havana // Putting this here 'cuz fuck it. -Spades
- name = "\improper Havana cigar case"
- desc = "Save these for the fancy-pantses at the next CentCom black tie reception. You can't blow the smoke from such majestic stogies in just anyone's face."
- icon_state = "cigarcase"
- icon = 'icons/obj/cigarettes.dmi'
- w_class = ITEMSIZE_TINY
- throwforce = 2
- slot_flags = SLOT_BELT
- storage_slots = 7
- can_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar/havana)
- icon_type = "cigar"
-
/obj/item/weapon/miscdisc
name = "strange artefact"
desc = "A large disc-shaped item, with a red, opaque crystal embedded in the center. It is some what heavy. There are indentations along the ring of the disc. Alien scripture lines the disc."
diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm
index e1a295dfc4..ac73bf97c8 100644
--- a/code/game/objects/items/devices/aicard.dm
+++ b/code/game/objects/items/devices/aicard.dm
@@ -71,7 +71,7 @@
if("wipe")
msg_admin_attack("[key_name_admin(user)] wiped [key_name_admin(AI)] with \the [src].")
add_attack_logs(user,carded_ai,"Purged from AI Card")
- INVOKE_ASYNC(src, .proc/wipe_ai)
+ INVOKE_ASYNC(src, PROC_REF(wipe_ai))
if("radio")
carded_ai.aiRadio.disabledAi = !carded_ai.aiRadio.disabledAi
to_chat(carded_ai, "Your Subspace Transceiver has been [carded_ai.aiRadio.disabledAi ? "disabled" : "enabled"]!")
@@ -83,7 +83,7 @@
if(carded_ai.control_disabled && carded_ai.deployed_shell)
carded_ai.disconnect_shell("Disconnecting from remote shell due to [src] wireless access interface being disabled.")
update_icon()
-
+
return TRUE
/obj/item/device/aicard/update_icon()
@@ -182,4 +182,4 @@
AI.adjustOxyLoss(2)
AI.updatehealth()
sleep(10)
- flush = FALSE
\ No newline at end of file
+ flush = FALSE
diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm
index 9ce6bfac8c..3ac84edc98 100644
--- a/code/game/objects/items/devices/communicator/communicator.dm
+++ b/code/game/objects/items/devices/communicator/communicator.dm
@@ -108,7 +108,7 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
setup_tgui_camera()
//This is a pretty terrible way of doing this.
- addtimer(CALLBACK(src, .proc/register_to_holder), 5 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(register_to_holder)), 5 SECONDS)
@@ -477,4 +477,3 @@ var/global/list/obj/item/device/communicator/all_communicators = list()
return
icon_state = initial(icon_state)
-
diff --git a/code/game/objects/items/devices/communicator/phone.dm b/code/game/objects/items/devices/communicator/phone.dm
index 671598a6ef..eafd3105e0 100644
--- a/code/game/objects/items/devices/communicator/phone.dm
+++ b/code/game/objects/items/devices/communicator/phone.dm
@@ -349,14 +349,14 @@
video_source = comm.camera
comm.visible_message("\icon[src][bicon(src)] New video connection from [comm].")
update_active_camera_screen()
- GLOB.moved_event.register(video_source, src, .proc/update_active_camera_screen)
+ GLOB.moved_event.register(video_source, src, PROC_REF(update_active_camera_screen))
update_icon()
// Proc: end_video()
// Parameters: reason - the text reason to print for why it ended
// Description: Ends the video call by clearing video_source
/obj/item/device/communicator/proc/end_video(var/reason)
- GLOB.moved_event.unregister(video_source, src, .proc/update_active_camera_screen)
+ GLOB.moved_event.unregister(video_source, src, PROC_REF(update_active_camera_screen))
show_static()
video_source = null
@@ -364,4 +364,3 @@
visible_message(.)
update_icon()
-
diff --git a/code/game/objects/items/devices/denecrotizer_vr.dm b/code/game/objects/items/devices/denecrotizer_vr.dm
index 32b7be4ac6..3b8fb1c761 100644
--- a/code/game/objects/items/devices/denecrotizer_vr.dm
+++ b/code/game/objects/items/devices/denecrotizer_vr.dm
@@ -49,7 +49,7 @@
if(!evaluate_ghost_join(user))
return ..()
- tgui_alert_async(usr, "Would you like to become [src]? It is bound to [revivedby].", "Become Mob", list("Yes","No"), CALLBACK(src, .proc/reply_ghost_join), 20 SECONDS)
+ tgui_alert_async(usr, "Would you like to become [src]? It is bound to [revivedby].", "Become Mob", list("Yes","No"), CALLBACK(src, PROC_REF(reply_ghost_join)), 20 SECONDS)
/// A reply to an async alert request was received
/mob/living/simple_mob/proc/reply_ghost_join(response)
@@ -64,7 +64,7 @@
/mob/living/simple_mob/proc/ghost_join(mob/observer/dead/D)
log_and_message_admins("[key_name_admin(D)] joined [src] as a ghost [ADMIN_FLW(src)]")
active_ghost_pods -= src
-
+
// Move the ghost in
if(D.mind)
D.mind.active = TRUE
@@ -72,7 +72,7 @@
else
src.ckey = D.ckey
qdel(D)
-
+
// Clean up the simplemob
ghostjoin = FALSE
ghostjoin_icon()
@@ -91,14 +91,14 @@
return FALSE
// At this point we can at least send them messages as to why they can't join, since they are a mob with a client
- if(!ghostjoin)
+ if(!ghostjoin)
to_chat(D, "Sorry, [src] is no longer ghost-joinable.")
return FALSE
if(ckey)
to_chat(D, "Sorry, someone else has already inhabited [src].")
return FALSE
-
+
if(capture_caught && !D.client.prefs.capture_crystal)
to_chat(D, "Sorry, [src] is participating in capture mechanics, and your preferences do not allow for that.")
return FALSE
@@ -128,7 +128,7 @@
else
. += "The screen indicates that this device can be used again in [cooldowntime] seconds, and that it has enough energy for [charges] uses."
-/obj/item/device/denecrotizer/proc/check_target(mob/living/simple_mob/target, mob/living/user)
+/obj/item/device/denecrotizer/proc/check_target(mob/living/simple_mob/target, mob/living/user)
if(!target.Adjacent(user))
return FALSE
if(user.a_intent != I_HELP) //be gentle
@@ -150,10 +150,10 @@
if(!advanced)
to_chat(user, "[src] doesn't seem to work on that.")
return FALSE
- if(target.ai_holder.retaliate || target.ai_holder.hostile) // You can be friends with still living mobs if they are passive I GUESS
+ if(target.ai_holder.retaliate || target.ai_holder.hostile) // You can be friends with still living mobs if they are passive I GUESS
to_chat(user, "[src] doesn't seem to work on that.")
return FALSE
- if(!target.mind)
+ if(!target.mind)
user.visible_message("[user] gently presses [src] to [target]...", runemessage = "presses [src] to [target]")
if(do_after(user, revive_time, exclusive = TASK_USER_EXCLUSIVE, target = target))
target.faction = user.faction
@@ -196,7 +196,7 @@
icon_state = "[initial(icon_state)]-o"
update_icon()
return
-
+
/obj/item/device/denecrotizer/proc/basic_rez(mob/living/simple_mob/target, mob/living/user) //so medical can have a way to bring back people's pets or whatever, does not change any settings about the mob or offer it to ghosts.
user.visible_message("[user] presses [src] to [target]...", runemessage = "presses [src] to [target]")
if(do_after(user, revive_time, exclusive = TASK_ALL_EXCLUSIVE, target = target))
@@ -234,9 +234,9 @@
I.invisibility = INVISIBILITY_OBSERVER
I.plane = PLANE_GHOSTS
I.appearance_flags = KEEP_APART|RESET_TRANSFORM
-
+
cut_overlay(I)
-
+
if(ghostjoin)
add_overlay(I)
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index 71bb7c0dd5..a776f1847f 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -45,8 +45,8 @@ var/list/GPS_list = list()
if(istype(loc, /mob))
holder = loc
- GLOB.moved_event.register(holder, src, .proc/update_compass)
- GLOB.dir_set_event.register(holder, src, .proc/update_compass)
+ GLOB.moved_event.register(holder, src, PROC_REF(update_compass))
+ GLOB.dir_set_event.register(holder, src, PROC_REF(update_compass))
if(holder && tracking)
if(!is_in_processing_list)
diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm
index 37a5ade906..7c27d9f2ee 100644
--- a/code/game/objects/items/devices/holowarrant.dm
+++ b/code/game/objects/items/devices/holowarrant.dm
@@ -95,7 +95,7 @@
to conduct a one time lawful search of the Suspect's person/belongings/premises and/or Department
for any items and materials that could be connected to the suspected criminal act described below,
pending an investigation in progress. The Security Officer(s) are obligated to remove any and all
- such items from the Suspects posession and/or Department and file it as evidence. The Suspect/Department
+ such items from the Suspect's possession and/or Department and file it as evidence. The Suspect/Department
staff is expected to offer full co-operation. In the event of the Suspect/Department staff attempting
to resist/impede this search or flee, they must be taken into custody immediately!
All confiscated items must be filed and taken to Evidence!
@@ -113,9 +113,9 @@
/obj/item/weapon/storage/box/holowarrants // VOREStation addition starts
name = "holowarrant devices"
- desc = "A box of holowarrant diplays for security use."
+ desc = "A box of holowarrant displays for security use."
/obj/item/weapon/storage/box/holowarrants/New()
..()
for(var/i = 0 to 3)
- new /obj/item/device/holowarrant(src) // VOREStation addition ends
\ No newline at end of file
+ new /obj/item/device/holowarrant(src) // VOREStation addition ends
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 0a73242717..6e6d6e132c 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -226,13 +226,13 @@
/obj/item/device/radio/headset/heads/hos
name = "head of security's headset"
- desc = "The headset of the hardass who protects your worthless lifes."
+ desc = "The headset of the hardass who protects your worthless lives."
icon_state = "com_headset"
ks2type = /obj/item/device/encryptionkey/heads/hos
/obj/item/device/radio/headset/heads/hos/alt
name = "head of security's bowman headset"
- desc = "The headset of the hardass who protects your worthless lifes."
+ desc = "The headset of the hardass who protects your worthless lives."
icon_state = "com_headset_alt"
ks2type = /obj/item/device/encryptionkey/heads/hos
diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm
index 0e87e867c5..d5baa6516b 100644
--- a/code/game/objects/items/devices/suit_cooling.dm
+++ b/code/game/objects/items/devices/suit_cooling.dm
@@ -2,8 +2,9 @@
name = "portable suit cooling unit"
desc = "A portable heat sink and liquid cooled radiator that can be hooked up to a space suit's existing temperature controls to provide industrial levels of cooling."
w_class = ITEMSIZE_LARGE
- icon = 'icons/obj/device.dmi'
+ icon = 'icons/obj/suit_cooler.dmi'
icon_state = "suitcooler0"
+ item_state = "coolingpack"
slot_flags = SLOT_BACK
//copied from tank.dm
@@ -171,13 +172,32 @@
return ..()
/obj/item/device/suit_cooling_unit/proc/updateicon()
- if (cover_open)
- if (cell)
+ cut_overlays()
+ if(cover_open)
+ if(cell)
icon_state = "suitcooler1"
else
icon_state = "suitcooler2"
- else
- icon_state = "suitcooler0"
+ return
+
+ icon_state = "suitcooler0"
+
+ if(!cell || !on)
+ return
+
+ switch(round(cell.percent()))
+ if(86 to INFINITY)
+ add_overlay("battery-0")
+ if(69 to 85)
+ add_overlay("battery-1")
+ if(52 to 68)
+ add_overlay("battery-2")
+ if(35 to 51)
+ add_overlay("battery-3")
+ if(18 to 34)
+ add_overlay("battery-4")
+ if(-INFINITY to 17)
+ add_overlay("battery-5")
/obj/item/device/suit_cooling_unit/examine(mob/user)
. = ..()
@@ -218,7 +238,7 @@
/obj/item/device/suit_cooling_unit/emergency/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (W.is_screwdriver())
- to_chat(user, "This model has the cell permanently installed!")
+ to_chat(user, "This cooler's cell is permanently installed!")
return
return ..()
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 30d032215f..d3923a478d 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -99,7 +99,7 @@
voice = M.name
//END OF CHOMPEDIT
if(mytape && recording)
- mytape.record_speech("[voice] [verb], \"[msg]\"") //CHOMP Edit
+ mytape.record_speech("[voice] [verb], \"[msg]\"")
/obj/item/device/taperecorder/see_emote(mob/M as mob, text, var/emote_type)
diff --git a/code/game/objects/items/devices/translocator_vr.dm b/code/game/objects/items/devices/translocator_vr.dm
index 8333f2228b..ae17602794 100644
--- a/code/game/objects/items/devices/translocator_vr.dm
+++ b/code/game/objects/items/devices/translocator_vr.dm
@@ -125,7 +125,7 @@ This device can be easily used to break ERP preferences due to the nature of tel
Make sure you carefully examine someone's OOC prefs before teleporting them if you are going to use this device for ERP purposes.
This device records all warnings given and teleport events for admin review in case of pref-breaking, so just don't do it.
"},"OOC Warning")
- var/choice = show_radial_menu(user, radial_menu_anchor, radial_images, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
+ var/choice = show_radial_menu(user, radial_menu_anchor, radial_images, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE)
if(!choice)
return
diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm
index ef5ae25fa7..268131fb7d 100644
--- a/code/game/objects/items/devices/uplink.dm
+++ b/code/game/objects/items/devices/uplink.dm
@@ -25,7 +25,7 @@
/obj/item/device/uplink/Initialize(var/mapload)
. = ..()
- addtimer(CALLBACK(src, .proc/next_offer), offer_time) //It seems like only the /hidden type actually makes use of this...
+ addtimer(CALLBACK(src, PROC_REF(next_offer)), offer_time) //It seems like only the /hidden type actually makes use of this...
/obj/item/device/uplink/get_item_cost(var/item_type, var/item_cost)
return (discount_item && (item_type == discount_item)) ? max(1, round(item_cost*discount_amount)) : item_cost
@@ -63,7 +63,7 @@
discount_amount = pick(90;0.9, 80;0.8, 70;0.7, 60;0.6, 50;0.5, 40;0.4, 30;0.3, 20;0.2, 10;0.1)
next_offer_time = world.time + offer_time
SStgui.update_uis(src)
- addtimer(CALLBACK(src, .proc/next_offer), offer_time)
+ addtimer(CALLBACK(src, PROC_REF(next_offer)), offer_time)
// Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated.
/obj/item/device/uplink/hidden/proc/toggle()
diff --git a/code/game/objects/items/pizza_voucher_vr.dm b/code/game/objects/items/pizza_voucher_vr.dm
index a4dad4720f..af7469715a 100644
--- a/code/game/objects/items/pizza_voucher_vr.dm
+++ b/code/game/objects/items/pizza_voucher_vr.dm
@@ -30,7 +30,7 @@
"A small bluespace rift opens just above your head and spits out a pizza box!",
"You hear a fwoosh followed by a thump.")
if(special_delivery)
- command_announcement.Announce("SPECIAL DELIVERY PIZZA ORDER #[rand(1000,9999)]-[rand(100,999)] HAS BEEN RECIEVED. SHIPMENT DISPATCHED VIA EXTRA-POWERFUL BALLISTIC LAUNCHERS FOR IMMEDIATE DELIVERY! THANK YOU AND ENJOY YOUR PIZZA!", "WE ALWAYS DELIVER!")
+ command_announcement.Announce("SPECIAL DELIVERY PIZZA ORDER #[rand(1000,9999)]-[rand(100,999)] HAS BEEN RECEIVED. SHIPMENT DISPATCHED VIA EXTRA-POWERFUL BALLISTIC LAUNCHERS FOR IMMEDIATE DELIVERY! THANK YOU AND ENJOY YOUR PIZZA!", "WE ALWAYS DELIVER!")
new /obj/effect/falling_effect/pizza_delivery/special(user.loc)
else
new /obj/effect/falling_effect/pizza_delivery(user.loc)
diff --git a/code/game/objects/items/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm
index 3fdb9c6659..ecbefb74d2 100644
--- a/code/game/objects/items/toys/mech_toys.dm
+++ b/code/game/objects/items/toys/mech_toys.dm
@@ -90,7 +90,7 @@
return FALSE
// If the attacker_controller isn't next to the attacking toy (and doesn't have telekinesis), the battle ends.
if(!in_range(attacker, attacker_controller))
- attacker_controller.visible_message(" [attacker_controller.name] seperates from [attacker], ending the battle.", \
+ attacker_controller.visible_message(" [attacker_controller.name] separates from [attacker], ending the battle.", \
" You separate from [attacker], ending the battle. ")
return FALSE
@@ -99,13 +99,13 @@
if(opponent.incapacitated())
return FALSE
if(!in_range(src, opponent))
- opponent.visible_message(" [opponent.name] seperates from [src], ending the battle.", \
+ opponent.visible_message(" [opponent.name] separates from [src], ending the battle.", \
" You separate from [src], ending the battle. ")
return FALSE
// If it's not PVP and the attacker_controller isn't next to the defending toy (and doesn't have telekinesis), the battle ends.
else
if (!in_range(src, attacker_controller))
- attacker_controller.visible_message(" [attacker_controller.name] seperates from [src] and [attacker], ending the battle.", \
+ attacker_controller.visible_message(" [attacker_controller.name] separates from [src] and [attacker], ending the battle.", \
" You separate [attacker] and [src], ending the battle. ")
return FALSE
@@ -170,7 +170,7 @@
to_chat(user, "You offer battle to [target.name]!")
to_chat(target, "[user.name] wants to battle with [T.His] [name]! Attack them with a toy mech to initiate combat.")
wants_to_battle = TRUE
- addtimer(CALLBACK(src, .proc/withdraw_offer, user), 6 SECONDS)
+ addtimer(CALLBACK(src, PROC_REF(withdraw_offer), user), 6 SECONDS)
return
..()
@@ -602,4 +602,4 @@
#undef SPECIAL_ATTACK_DAMAGE
#undef SPECIAL_ATTACK_UTILITY
#undef SPECIAL_ATTACK_OTHER
-#undef MAX_BATTLE_LENGTH
\ No newline at end of file
+#undef MAX_BATTLE_LENGTH
diff --git a/code/game/objects/items/toys/toys_vr.dm b/code/game/objects/items/toys/toys_vr.dm
index c55a6bf6e4..55b28c867e 100644
--- a/code/game/objects/items/toys/toys_vr.dm
+++ b/code/game/objects/items/toys/toys_vr.dm
@@ -179,7 +179,7 @@
playsound(user, 'sound/voice/shriek1.ogg', 10, 0)
src.visible_message("Skreee!")
cooldown = 1
- addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50)
return ..()
/obj/item/toy/plushie/vox/proc/cooldownreset()
@@ -229,7 +229,7 @@
playsound(user, 'sound/machines/ping.ogg', 10, 0)
src.visible_message("Ping!")
cooldown = 1
- addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50)
return ..()
/obj/item/toy/plushie/ipc/proc/cooldownreset()
@@ -246,7 +246,7 @@
playsound(user, 'sound/machines/ding.ogg', 10, 0)
src.visible_message("Ding!")
cooldown = 1
- addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50)
return ..()
/obj/item/toy/plushie/snakeplushie
@@ -280,14 +280,14 @@
atom_say(pick(responses))
playsound(user, 'sound/effects/whistle.ogg', 10, 0)
cooldown = 1
- addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50)
return ..()
/obj/item/toy/plushie/marketable_pip/attack_self(mob/user as mob)
if(!cooldown)
playsound(user, 'sound/effects/whistle.ogg', 10, 0)
cooldown = 1
- addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50)
return ..()
/obj/item/toy/plushie/marketable_pip/proc/cooldownreset()
@@ -306,7 +306,7 @@
playsound(user, 'sound/voice/moth/scream_moth.ogg', 10, 0)
src.visible_message("Aaaaaaa.")
cooldown = 1
- addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50)
return ..()
/obj/item/toy/plushie/moth/proc/cooldownreset()
@@ -351,7 +351,7 @@
playsound(user, 'sound/weapons/slice.ogg', 10, 0)
src.visible_message("Stab!")
cooldown = 1
- addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50)
return ..()
/obj/item/toy/plushie/susblue
@@ -477,7 +477,7 @@
flick("[initial(icon_state)]2", src)
user.visible_message("[user] doesn't blind [M] with the toy flash!")
cooldown = 1
- addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50)
return ..()
/obj/item/toy/flash/proc/cooldownreset()
@@ -546,7 +546,7 @@
user.visible_message("[user] asks the AI core to state laws.")
user.visible_message("[src] says \"[answer]\"")
cooldown = 1
- addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50)
return ..()
/obj/item/toy/AI/proc/cooldownreset()
@@ -826,7 +826,7 @@
if(!cooldown)
playsound(user, 'sound/weapons/chainsaw_startup.ogg', 10, 0)
cooldown = 1
- addtimer(CALLBACK(src, .proc/cooldownreset), 50)
+ addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50)
return ..()
/obj/item/toy/chainsaw/proc/cooldownreset()
diff --git a/code/game/objects/items/weapons/RCD_vr.dm b/code/game/objects/items/weapons/RCD_vr.dm
index d120e593f4..48f380f1ae 100644
--- a/code/game/objects/items/weapons/RCD_vr.dm
+++ b/code/game/objects/items/weapons/RCD_vr.dm
@@ -36,20 +36,20 @@
/obj/item/weapon/rcd/update_icon()
var/nearest_ten = round((stored_matter/max_stored_matter)*10, 1)
-
+
//Just to prevent updates every use
if(ammostate == nearest_ten)
return //No change
ammostate = nearest_ten
-
+
cut_overlays()
-
+
//Main sprite update
if(!nearest_ten)
icon_state = "[initial(icon_state)]_empty"
else
icon_state = "[initial(icon_state)]"
-
+
add_overlay("[initial(icon_state)]_charge[nearest_ten]")
/obj/item/weapon/rcd/proc/perform_effect(var/atom/A, var/time_taken)
@@ -98,12 +98,12 @@
if(user.incapacitated())
world.log << "Two"
return FALSE
-
+
var/obj/item/rig_module/device/D = loc
if(!istype(D) || !D?.holder?.wearer == user)
world.log << "Three"
return FALSE
-
+
return TRUE
/obj/item/weapon/rcd/attack_self(mob/living/user)
@@ -134,7 +134,7 @@
"Change Window Type" = image(icon = 'icons/mob/radial.dmi', icon_state = "windowtype")
)
*/
- var/choice = show_radial_menu(user, user, choices, custom_check = CALLBACK(src, .proc/check_menu, user), tooltips = TRUE)
+ var/choice = show_radial_menu(user, user, choices, custom_check = CALLBACK(src, PROC_REF(check_menu), user), tooltips = TRUE)
if(!check_menu(user))
return
switch(choice)
@@ -206,7 +206,7 @@
status = rcd_status
delay = rcd_delay
if (status == RCD_DECONSTRUCT)
- addtimer(CALLBACK(src, /atom/.proc/update_icon), 11)
+ addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), 11)
delay -= 11
icon_state = "rcd_end_reverse"
else
@@ -228,7 +228,7 @@
qdel(src)
else
icon_state = "rcd_end"
- addtimer(CALLBACK(src, .proc/end), 15)
+ addtimer(CALLBACK(src, PROC_REF(end)), 15)
/obj/effect/constructing_effect/proc/end()
qdel(src)
diff --git a/code/game/objects/items/weapons/RMS_vr.dm b/code/game/objects/items/weapons/RMS_vr.dm
index 4ec4996bdd..2e1cfc4b3d 100644
--- a/code/game/objects/items/weapons/RMS_vr.dm
+++ b/code/game/objects/items/weapons/RMS_vr.dm
@@ -221,7 +221,7 @@
"Random" = radial_image_random
)
- var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
+ var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE)
if(!check_menu(user))
return
switch(choice)
diff --git a/code/game/objects/items/weapons/capture_crystal.dm b/code/game/objects/items/weapons/capture_crystal.dm
index d195d09c1c..da096cd0f0 100644
--- a/code/game/objects/items/weapons/capture_crystal.dm
+++ b/code/game/objects/items/weapons/capture_crystal.dm
@@ -250,8 +250,8 @@
//Make it so the crystal knows if its mob references get deleted to make sure things get cleaned up
/obj/item/capture_crystal/proc/knowyoursignals(mob/living/M, mob/living/U)
- RegisterSignal(M, COMSIG_PARENT_QDELETING, .proc/mob_was_deleted, TRUE)
- RegisterSignal(U, COMSIG_PARENT_QDELETING, .proc/owner_was_deleted, TRUE)
+ RegisterSignal(M, COMSIG_PARENT_QDELETING, PROC_REF(mob_was_deleted), TRUE)
+ RegisterSignal(U, COMSIG_PARENT_QDELETING, PROC_REF(owner_was_deleted), TRUE)
//The basic capture command does most of the registration work.
/obj/item/capture_crystal/proc/capture(mob/living/M, mob/living/U)
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index d85e21ae1c..3d252a03a6 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -335,7 +335,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/cigarette/cigar
name = "premium cigar"
desc = "A brown roll of tobacco and... well, you're not quite sure. This thing's huge!"
- description_fluff = "While the label does say that this is a 'premium cigar', it really cannot match other types of cigars on the market. Is it a quality cigarette? Perhaps. Was it hand-made with care? No."
+ description_fluff = "While the label does say that this is a 'premium cigar', it \
+ really cannot match other types of cigars on the market. Is it a quality \
+ cigarette? Perhaps. Was it hand-made with care? No."
icon_state = "cigar2"
type_butt = /obj/item/trash/cigbutt/cigarbutt
throw_speed = 0.5
@@ -353,14 +355,22 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/cigarette/cigar/cohiba
name = "\improper Cohiba Robusto cigar"
desc = "There's little more you could want from a cigar."
- description_fluff = "Cohiba has been a popular cigar company for centuries. They are still based out of Cuba and refuse to expand and therefore have a very limited quantity, making their cigars coveted all through known space. Robusto is one of their most popular shapes of cigars."
+ description_fluff = "Cohiba has been a popular cigar company for centuries. \
+ They are still based out of Cuba and refuse to expand and therefore have a very \
+ limited quantity, making their cigars coveted all through known space. Robusto \
+ is one of their most popular shapes of cigars."
icon_state = "cigar2"
nicotine_amt = 7
/obj/item/clothing/mask/smokable/cigarette/cigar/havana
name = "premium Havanian cigar"
- desc = "A cigar fit for only the best of the best."
- description_fluff = "'Havanian' is an umbrella term for any cigar made in the typical handmade style of Cuba. This particular cigar is from Gilthari's cigar manufacturers and produced galaxy-wide. While this way of making quality cigars has become slightly bastardized over the years, overall quality has remained relatively the same, even if there is a large quantity of 'Havanian' cigars."
+ desc = "Save these for the fancy-pantses at the next CentCom black tie reception. \
+ You can't blow the smoke from such majestic stogies in just anyone's face."
+ description_fluff = "'Havanian' is an umbrella term for any cigar made in the \
+ typical handmade style of Cuba. This particular cigar is from Gilthari's cigar \
+ manufacturers and produced galaxy-wide. While this way of making quality cigars \
+ has become slightly bastardized over the years, overall quality has remained \
+ relatively the same, even if there is a large quantity of 'Havanian' cigars."
icon_state = "cigar2"
max_smoketime = 7200
smoketime = 7200
@@ -400,7 +410,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/smokable/pipe
name = "smoking pipe"
desc = "A pipe, for smoking. Made of fine, stained cherry wood."
- description_fluff = "ClassiCo Accessories and Haberdashers, originating out of Mars, claim to produce products 'for the modern gentlefolk'. Most of their items are high-end and expensive, but they pledge to back their prices up with quality, and usually do."
+ description_fluff = "ClassiCo Accessories and Haberdashers, originating out of Mars, \
+ claim to produce products 'for the modern gentlefolk'. Most of their items are high-end \
+ and expensive, but they pledge to back their prices up with quality, and usually do."
icon_state = "pipe"
item_state = "pipe"
smoketime = 0
@@ -507,7 +519,8 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/weapon/reagent_containers/rollingpaper
name = "rolling paper"
desc = "A small, thin piece of easily flammable paper, commonly used for rolling and smoking various dried plants."
- description_fluff = "The legalization of certain substances propelled the sale of rolling papers through the roof. Now almost every Trans-stellar produces a variety, often of questionable quality."
+ description_fluff = "The legalization of certain substances propelled the sale of rolling \
+ papers through the roof. Now almost every Trans-stellar produces a variety, often of questionable quality."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "cig paper"
volume = 25
@@ -555,77 +568,85 @@ CIGARETTE PACKETS ARE IN FANCY.DM
qdel(src)
/////////
-//ZIPPO//
+//CHEAP//
/////////
/obj/item/weapon/flame/lighter
name = "cheap lighter"
desc = "A cheap-as-free lighter."
- description_fluff = "The 'hand-made in Altair' sticker underneath is a charming way of saying 'Made with prison labour'. It's no wonder the company can sell these things so cheap."
- icon = 'icons/obj/items.dmi'
- icon_state = "lighter-g"
- item_state = "lighter-g"
+ description_fluff = "The 'hand-made in Altair' sticker underneath is a charming way of \
+ saying 'Made with prison labour'. It's no wonder the company can sell these things so cheap."
+ icon = 'icons/obj/lighters.dmi'
+ icon_state = "lighter"
+ item_state = "lighter"
w_class = ITEMSIZE_TINY
throwforce = 4
slot_flags = SLOT_BELT
attack_verb = list("burnt", "singed")
var/base_state
+ /// Sounds
var/activation_sound = 'sound/items/lighter_on.ogg'
var/deactivation_sound = 'sound/items/lighter_off.ogg'
+ /// Color of the flame and how big the flame is (pulled from Welder code)
+ var/flame_color = "#FF9933"
+ var/flame_intensity = 2
+ /// Color List
+ var/random_color = FALSE
+ var/available_colors = list(COLOR_ASSEMBLY_BLACK,
+ COLOR_ASSEMBLY_BGRAY,
+ COLOR_ASSEMBLY_WHITE,
+ COLOR_ASSEMBLY_RED,
+ COLOR_ASSEMBLY_ORANGE,
+ COLOR_ASSEMBLY_BEIGE,
+ COLOR_ASSEMBLY_BROWN,
+ COLOR_ASSEMBLY_GOLD,
+ COLOR_ASSEMBLY_YELLOW,
+ COLOR_ASSEMBLY_GURKHA,
+ COLOR_ASSEMBLY_LGREEN,
+ COLOR_ASSEMBLY_GREEN,
+ COLOR_ASSEMBLY_LBLUE,
+ COLOR_ASSEMBLY_BLUE,
+ COLOR_ASSEMBLY_PURPLE,
+ COLOR_ASSEMBLY_HOT_PINK)
-/obj/item/weapon/flame/lighter/zippo
- name = "\improper Zippo lighter"
- desc = "The zippo."
- description_fluff = "Still going after all these years."
- icon = 'icons/obj/zippo.dmi'
- icon_state = "zippo"
- item_state = "zippo"
- activation_sound = 'sound/items/zippo_on.ogg'
- deactivation_sound = 'sound/items/zippo_off.ogg'
-
+// TODO: Remove this path from POIs and loose maps (it's no longer needed)
/obj/item/weapon/flame/lighter/random
-/obj/item/weapon/flame/lighter/random/New()
- icon_state = "lighter-[pick("r","c","y","g")]"
- item_state = icon_state
- base_state = icon_state
+
+// Randomizes Cheap Lighters on Spawn
+/obj/item/weapon/flame/lighter/Initialize()
+ . = ..()
+ var/image/I = image(icon, "lighter-[pick("trans","tall","matte")]")
+ I.color = pick(available_colors)
+ add_overlay(I)
/obj/item/weapon/flame/lighter/attack_self(mob/living/user)
- if(!base_state)
- base_state = icon_state
if(!lit)
lit = 1
- icon_state = "[base_state]on"
- item_state = "[base_state]on"
+ icon_state = "lighteron"
playsound(src, activation_sound, 75, 1)
- if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
- user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.")
+ if(prob(95))
+ user.visible_message("After a few attempts, [user] manages to light the [src].")
else
- if(prob(95))
- user.visible_message("After a few attempts, [user] manages to light the [src].")
+ to_chat(user, "You burn yourself while lighting the lighter.")
+ if (user.get_left_hand() == src)
+ user.apply_damage(2,BURN,"l_hand")
else
- to_chat(user, "You burn yourself while lighting the lighter.")
- if (user.get_left_hand() == src)
- user.apply_damage(2,BURN,"l_hand")
- else
- user.apply_damage(2,BURN,"r_hand")
- user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.")
+ user.apply_damage(2,BURN,"r_hand")
+ user.visible_message("After a few attempts, [user] manages to light the [src], they however burn their finger in the process.")
- set_light(2)
+ set_light(2, 0.5, "#FF9933")
START_PROCESSING(SSobj, src)
+ update_icon()
else
lit = 0
- icon_state = "[base_state]"
- item_state = "[base_state]"
+ icon_state = "lighter"
playsound(src, deactivation_sound, 75, 1)
- if(istype(src, /obj/item/weapon/flame/lighter/zippo) )
- user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.")
- else
- user.visible_message("[user] quietly shuts off the [src].")
+ user.visible_message("[user] quietly shuts off the [src].")
set_light(0)
STOP_PROCESSING(SSobj, src)
+ update_icon()
return
-
/obj/item/weapon/flame/lighter/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
if(!istype(M, /mob))
return
@@ -652,6 +673,45 @@ CIGARETTE PACKETS ARE IN FANCY.DM
location.hotspot_expose(700, 5)
return
+/////////
+//ZIPPO//
+/////////
+/obj/item/weapon/flame/lighter/zippo
+ name = "\improper Zippo lighter"
+ desc = "The zippo."
+ description_fluff = "Still going after all these years."
+ icon_state = "zippo"
+ item_state = "zippo"
+ activation_sound = 'sound/items/zippo_on.ogg'
+ deactivation_sound = 'sound/items/zippo_off.ogg'
+
+/obj/item/weapon/flame/lighter/zippo/Initialize()
+ . = ..()
+ cut_overlays() //Prevents the Cheap Lighter overlay from appearing on this
+
+/obj/item/weapon/flame/lighter/zippo/attack_self(mob/living/user)
+ if(!base_state)
+ base_state = icon_state
+ if(!lit)
+ lit = 1
+ icon_state = "[base_state]on"
+ item_state = "[base_state]on"
+ playsound(src, activation_sound, 75, 1)
+ user.visible_message("Without even breaking stride, [user] flips open and lights [src] in one smooth movement.")
+
+ set_light(2, 0.5, "#FF9933")
+ START_PROCESSING(SSobj, src)
+ else
+ lit = 0
+ icon_state = "[base_state]"
+ item_state = "[base_state]"
+ playsound(src, deactivation_sound, 75, 1)
+ user.visible_message("You hear a quiet click, as [user] shuts off [src] without even looking at what they're doing.")
+
+ set_light(0)
+ STOP_PROCESSING(SSobj, src)
+ return
+
//Here we add Zippo skins.
/obj/item/weapon/flame/lighter/zippo/black
@@ -708,4 +768,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/weapon/flame/lighter/zippo/rainbow
name = "\improper rainbow Zippo lighter"
- icon_state = "rainbowzippo"
\ No newline at end of file
+ icon_state = "rainbowzippo"
+
+/obj/item/weapon/flame/lighter/zippo/skull
+ name = "\improper badass Zippo lighter"
+ desc = "An absolutely badass zippo lighter. Just look at that skull!"
+ icon_state = "skullzippo"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
index 05ef9a7428..57a7406c82 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
@@ -74,7 +74,7 @@
to_chat(user, "Circuit controls are locked.")
return
var/existing_networks = jointext(network,",")
- var/input = sanitize(tgui_input_text(usr, "Which networks would you like to connect this camera console circuit to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Multitool-Circuitboard interface", existing_networks))
+ var/input = sanitize(tgui_input_text(usr, "Which networks would you like to connect this camera console circuit to? Separate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Multitool-Circuitboard interface", existing_networks))
if(!input)
to_chat(usr, "No input found please hang up and try your call again.")
return
diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm
index 1db8b10130..3d0e3d9cd2 100644
--- a/code/game/objects/items/weapons/circuitboards/frame.dm
+++ b/code/game/objects/items/weapons/circuitboards/frame.dm
@@ -183,7 +183,7 @@
// origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 4)
//CHOMPedit Balance
req_components = list(
- /obj/item/weapon/ore/bluespace_crystal = 2,
+ /obj/item/weapon/bluespace_crystal = 2,
/obj/item/weapon/stock_parts/capacitor = 2,
/obj/item/weapon/stock_parts/scanning_module = 2,
/obj/item/weapon/stock_parts/micro_laser =2,
diff --git a/code/game/objects/items/weapons/implants/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm
index c825a108ae..ca88e3a9b9 100644
--- a/code/game/objects/items/weapons/implants/implant_vr.dm
+++ b/code/game/objects/items/weapons/implants/implant_vr.dm
@@ -122,7 +122,7 @@
/obj/item/weapon/implanter/sizecontrol
name = "size control implant"
desc = "Implant which allows to control host size via voice commands."
- description_info = {"Only accessable by those who implanted the victim. Self-implanting allows everyone to change host size. The following special commands are available:
+ description_info = {"Only accessible by those who implanted the victim. Self-implanting allows everyone to change host size. The following special commands are available:
'Shrink' - host size decreases.
'Grow' - host size increases.
'Resize (NUMBER)' - for accurate size control.
@@ -141,10 +141,10 @@
//////////////////////////////
/obj/item/weapon/implanter/compliance
name = "compliance implant"
- desc = "Implant which allows for implanting 'laws' or 'commands' in the host. Has a minature keyboard for typing laws into."
+ desc = "Implant which allows for implanting 'laws' or 'commands' in the host. Has a miniature keyboard for typing laws into."
description_info = {"An implant that allows for a 'law' or 'command' to be uploaded in the implanted host.
In un-modified organics, this is performed through manipulation of the nervous system and release of chemicals to ensure continued compliance.
-In synthetics or modified organics, this implant uploads a virus to any compatable hardware.
+In synthetics or modified organics, this implant uploads a virus to any compatible hardware.
Due to the small chemical capacity of the implant, the life of the implant is relatively small, wearing off within 24 hours or sooner."}
description_fluff = "Due to the illegality of these types of implants, they are often made in clandestine facilities with a complete lack of quality control \
diff --git a/code/game/objects/items/weapons/picnic_blankets.dm b/code/game/objects/items/weapons/picnic_blankets.dm
index a5da986015..ab76b8efa7 100644
--- a/code/game/objects/items/weapons/picnic_blankets.dm
+++ b/code/game/objects/items/weapons/picnic_blankets.dm
@@ -33,6 +33,7 @@
var/blanket_type = CENTER
layer = HIDING_LAYER - 0.01 //Stuff shouldn't be able to hide under the blanket on the ground
var/list/attached_blankets = list()
+ anchored = TRUE
/obj/structure/picnic_blanket_deployed/verb/fold_up()
set name = "Fold up"
diff --git a/code/game/objects/items/weapons/storage/belt_vr.dm b/code/game/objects/items/weapons/storage/belt_vr.dm
index e88d8fa420..08a096c881 100644
--- a/code/game/objects/items/weapons/storage/belt_vr.dm
+++ b/code/game/objects/items/weapons/storage/belt_vr.dm
@@ -59,7 +59,7 @@
desc = "A deluxe belt with many pouches. It can hold a very wide variety of items, but less items overall than a dedicated belt. Still, it's useful for any explorer who wants to be prepared for anything they might find."
icon = 'icons/inventory/belt/item_vr.dmi'
icon_state = "pathfinder_belt"
- item_state = "explorer_belt"
+ item_state = "pathfinder_belt"
storage_slots = 7 //two more, bringing it on par with normal belts
max_storage_space = ITEMSIZE_COST_NORMAL * 7
@@ -158,6 +158,7 @@
name = "hydroponics belt"
desc = "A belt used to hold most hydroponics supplies. Suprisingly, not green."
icon = 'icons/inventory/belt/item_vr.dmi'
+ icon_override = 'icons/inventory/belt/mob_vr.dmi'
icon_state = "plantbelt"
item_state = "plantbelt"
storage_slots = 5
diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm
index 20fe500575..6352f4ff9e 100644
--- a/code/game/objects/items/weapons/storage/bible.dm
+++ b/code/game/objects/items/weapons/storage/bible.dm
@@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
var/image/bible_image = image(icon = 'icons/obj/storage.dmi', icon_state = GLOB.biblestates[i])
skins += list("[GLOB.biblenames[i]]" = bible_image)
- var/choice = show_radial_menu(user, src, skins, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 40, require_near = TRUE)
+ var/choice = show_radial_menu(user, src, skins, custom_check = CALLBACK(src, PROC_REF(check_menu), user), radius = 40, require_near = TRUE)
if(!choice)
return FALSE
var/bible_index = GLOB.biblenames.Find(choice)
@@ -112,4 +112,4 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
/obj/item/weapon/storage/bible/attackby(obj/item/weapon/W as obj, mob/user as mob)
if (src.use_sound)
playsound(src, src.use_sound, 50, 1, -5)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index b18180c352..639bd175a4 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -385,16 +385,18 @@
/obj/item/weapon/storage/fancy/cigar
name = "cigar case"
desc = "A case for holding your cigars when you are not smoking them."
- description_fluff = "The tastefully engraved palm tree tells you that these 'Palma Grande' premium cigars are only sold on the luxury cruises and resorts of Oasis, though ten separate companies produce them for that purpose galaxy-wide. The standard is however very high."
+ description_fluff = "The tasteful stained palm case tells you that these 'Palma Grande' premium \
+ cigars are only sold on the luxury cruises and resorts of Oasis, though ten separate companies \
+ produce them for that purpose galaxy-wide. The standard is however very high."
icon_state = "cigarcase"
icon = 'icons/obj/cigarettes.dmi'
w_class = ITEMSIZE_TINY
throwforce = 2
slot_flags = SLOT_BELT
- storage_slots = 7
+ storage_slots = 5
can_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar, /obj/item/trash/cigbutt/cigarbutt)
icon_type = "cigar"
- starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar = 8)
+ starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar = 5)
/obj/item/weapon/storage/fancy/cigar/Initialize()
. = ..()
@@ -419,7 +421,7 @@
if(open)
icon_state = open_state
if(contents.len >= 1)
- add_overlay("cigarcase[contents.len]")
+ add_overlay("[initial(icon_state)][contents.len]")
else
icon_state = closed_state
@@ -435,6 +437,27 @@
update_icon()
..()
+/obj/item/weapon/storage/fancy/cigar/choiba
+ name = "/improper Choiba cigar case"
+ desc = "A fancy case for holding your cigars when you are not smoking them."
+ description_fluff = "The exquisite wooden case bears the markings of the \
+ Choiba cigar company based out of Cuba. The perfectly humidized case keeps \
+ the companies signature Cigars in premium condidtion even when traveling \
+ long distances within a vacuume. The custom case itself can sell for quite \
+ a lot in some places."
+ icon_state = "cohibacase"
+ icon = 'icons/obj/cigarettes.dmi'
+ icon_type = "cigar"
+ starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar/cohiba = 5)
+
+/obj/item/weapon/storage/fancy/cigar/havana
+ name = "\improper Havana cigar case"
+ desc = "A fancy case for holding your cigars when you are not smoking them."
+ icon_state = "havanacase"
+ icon = 'icons/obj/cigarettes.dmi'
+ icon_type = "cigar"
+ starts_with = list(/obj/item/clothing/mask/smokable/cigarette/cigar/havana = 5)
+
/*
* Tobacco Bits
*/
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 324fb93dd8..198eeda966 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -128,7 +128,7 @@
/obj/item/weapon/storage/box/syndie_kit/imp_aug/sprinter
case_type = /obj/item/weapon/implantcase/sprinter
-
+
/obj/item/weapon/storage/box/syndie_kit/imp_aug/armblade
case_type = /obj/item/weapon/implantcase/armblade
@@ -146,7 +146,7 @@
/obj/item/weapon/storage/box/syndie_kit/chameleon
name = "chameleon kit"
- desc = "Comes with all the clothes you need to impersonate most people. Acting lessons sold seperately."
+ desc = "Comes with all the clothes you need to impersonate most people. Acting lessons sold separately."
starts_with = list(
/obj/item/weapon/storage/backpack/chameleon/full,
/obj/item/weapon/gun/energy/chameleon
diff --git a/code/game/objects/items/weapons/tools/wirecutters.dm b/code/game/objects/items/weapons/tools/wirecutters.dm
index 84fb15e70e..035cb2300c 100644
--- a/code/game/objects/items/weapons/tools/wirecutters.dm
+++ b/code/game/objects/items/weapons/tools/wirecutters.dm
@@ -58,10 +58,10 @@
..()
/datum/category_item/catalogue/anomalous/precursor_a/alien_wirecutters
- name = "Precursor Alpha Object - Wire Seperator"
+ name = "Precursor Alpha Object - Wire Separator"
desc = "An object appearing to have a tool shape. It has two handles, and two \
sides which are attached to each other in the center. At the end on each side \
- is a sharp cutting edge, made from a seperate material than the rest of the \
+ is a sharp cutting edge, made from a separate material than the rest of the \
tool.\
\
This tool appears to serve the same purpose as conventional wirecutters, due \
diff --git a/code/game/objects/random/misc_vr.dm b/code/game/objects/random/misc_vr.dm
index c6c2ec106b..ecd7468d13 100644
--- a/code/game/objects/random/misc_vr.dm
+++ b/code/game/objects/random/misc_vr.dm
@@ -189,7 +189,7 @@
prob(1);/obj/random/thermalponcho,
prob(5);/obj/random/contraband,
prob(5);/obj/random/cargopod,
- prob(1);/obj/item/weapon/flame/lighter/random,
+ prob(1);/obj/item/weapon/flame/lighter,
prob(1);/obj/item/weapon/storage/wallet/random,
prob(1);/obj/random/cutout)
diff --git a/code/game/objects/structures/crates_lockers/__closets.dm b/code/game/objects/structures/crates_lockers/__closets.dm
index cf196ddf0a..05661ccedb 100644
--- a/code/game/objects/structures/crates_lockers/__closets.dm
+++ b/code/game/objects/structures/crates_lockers/__closets.dm
@@ -526,7 +526,7 @@
animate(door_obj, transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag, flags = ANIMATION_END_NOW)
else
animate(transform = M, icon_state = door_state, layer = door_layer, time = world.tick_lag)
- addtimer(CALLBACK(src, .proc/end_door_animation,closing), closet_appearance.door_anim_time, TIMER_UNIQUE|TIMER_OVERRIDE)
+ addtimer(CALLBACK(src, PROC_REF(end_door_animation), closing), closet_appearance.door_anim_time, TIMER_UNIQUE|TIMER_OVERRIDE)
/obj/structure/closet/proc/end_door_animation(closing = FALSE)
is_animating_door = FALSE
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index 66695f3511..c94683a260 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -10,8 +10,8 @@
/obj/item/weapon/reagent_containers/food/condiment/spacespice = 2
)
- open_sound = 'sound/machines/click.ogg'
- close_sound = 'sound/machines/click.ogg'
+ open_sound = 'sound/machines/kitchen/fridge/open_fridge.ogg' // CHOMPEdit: Fridge sounds~
+ close_sound = 'sound/machines/kitchen/fridge/close_fridge.ogg' // CHOMPEdit: Fridge sounds~
/obj/structure/closet/secure_closet/freezer/kitchen/mining
req_access = list()
@@ -22,6 +22,9 @@
icon = 'icons/obj/closets/fridge.dmi'
closet_appearance = null
+ open_sound = 'sound/machines/kitchen/fridge/open_fridge.ogg' // CHOMPEdit: Fridge sounds~
+ close_sound = 'sound/machines/kitchen/fridge/close_fridge.ogg' // CHOMPEdit: Fridge sounds~
+
starts_with = list(
/obj/item/weapon/reagent_containers/food/snacks/meat/monkey = 10)
@@ -31,6 +34,9 @@
icon = 'icons/obj/closets/fridge.dmi'
closet_appearance = null
+ open_sound = 'sound/machines/kitchen/fridge/open_fridge.ogg' // CHOMPEdit: Fridge sounds~
+ close_sound = 'sound/machines/kitchen/fridge/close_fridge.ogg' // CHOMPEdit: Fridge sounds~
+
starts_with = list(
/obj/item/weapon/reagent_containers/food/drinks/milk = 6,
/obj/item/weapon/reagent_containers/food/drinks/soymilk = 4,
diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm
index 6c856ceb7f..5a5ed5db2f 100644
--- a/code/game/objects/structures/ghost_pods/ghost_pods.dm
+++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm
@@ -73,13 +73,13 @@
/obj/structure/ghost_pod/automatic/Initialize()
. = ..()
- addtimer(CALLBACK(src, .proc/trigger), delay_to_self_open)
+ addtimer(CALLBACK(src, PROC_REF(trigger)), delay_to_self_open)
/obj/structure/ghost_pod/automatic/trigger()
. = ..()
if(. == FALSE) // If we failed to get a volunteer, try again later if allowed to.
if(delay_to_try_again)
- addtimer(CALLBACK(src, .proc/trigger), delay_to_try_again)
+ addtimer(CALLBACK(src, PROC_REF(trigger)), delay_to_try_again)
// This type is triggered by a ghost clicking on it, as opposed to a living player. A ghost query type isn't needed.
/obj/structure/ghost_pod/ghost_activated
diff --git a/code/game/objects/structures/props/blackbox.dm b/code/game/objects/structures/props/blackbox.dm
index 5581d2cc52..7aedb3ff0c 100644
--- a/code/game/objects/structures/props/blackbox.dm
+++ b/code/game/objects/structures/props/blackbox.dm
@@ -34,7 +34,7 @@
Captain Willis 06:13:15: (Expletives), I'm turning us around. Put out a distress call to Control, we'll be back in Sif orbit in a couple of minutes.
**
- V.I.S Traffic Control 06:15:49: MBT-540 we are recieving you. Your atmospheric sensors are reading potentially harmful toxins in your cargo bay. Advise locking down interior cargo bay doors. Please stand by.
+ V.I.S Traffic Control 06:15:49: MBT-540 we are receiving you. Your atmospheric sensors are reading potentially harmful toxins in your cargo bay. Advise locking down interior cargo bay doors. Please stand by.
Captain Adisu 06:16:10: Understood.
**
V.I.S Traffic Control 06:27:02: MBT-540, we have no docking bays available at this time, are you equipped for atmospheric re-entry?
Captain Willis 06:27:12: We-We are shielded. But we have fuel and air for-
V.I.S Traffic Control 06:27:17: Please make an emergency landing at the coordinates provided and standby for further information.
@@ -172,7 +172,7 @@
END LOG
CATALOGUER VOICE RECOGNITION RESULTS:
- No match found for either speaker, but contextual clues and use of Old Earth russian (\'brat\', approximately \'brother\' or \'pal\') suggests out-of-sector criminal elements.
+ No match found for either speaker, but contextual clues and use of Old Earth Russian (\'brat\', approximately \'brother\' or \'pal\') suggests out-of-sector criminal elements.
"}
/obj/structure/prop/blackbox/gecko_wreck
diff --git a/code/game/objects/structures/salvageable.dm b/code/game/objects/structures/salvageable.dm
index 95dd89161c..7153dbca4d 100644
--- a/code/game/objects/structures/salvageable.dm
+++ b/code/game/objects/structures/salvageable.dm
@@ -1,5 +1,5 @@
/obj/structure/salvageable
- name = "broken macninery"
+ name = "broken machinery"
desc = "Broken beyond repair, but looks like you can still salvage something from this if you had a prying implement."
icon = 'icons/obj/salvageable.dmi'
density = TRUE
@@ -400,3 +400,29 @@
/obj/item/weapon/computer_hardware/card_slot = 40,
/obj/item/weapon/computer_hardware/network_card/advanced = 40
)
+
+/obj/structure/salvageable/slotmachine1
+ name = "broken slot machine"
+ icon_state = "slot1"
+ salvageable_parts = list(
+ /obj/item/stack/cable_coil{amount = 5} = 90,
+ /obj/item/weapon/stock_parts/console_screen = 90,
+ /obj/item/stack/cable_coil{amount = 5} = 90,
+ /obj/item/stack/material/glass{amount = 5} = 90,
+ /obj/item/weapon/stock_parts/capacitor = 60,
+ /obj/item/weapon/stock_parts/capacitor = 60,
+ /obj/item/weapon/computer_hardware/network_card/advanced = 40
+ )
+
+/obj/structure/salvageable/slotmachine2
+ name = "broken slot machine"
+ icon_state = "slot2"
+ salvageable_parts = list(
+ /obj/item/stack/cable_coil{amount = 5} = 90,
+ /obj/item/weapon/stock_parts/console_screen = 90,
+ /obj/item/stack/cable_coil{amount = 5} = 90,
+ /obj/item/stack/material/glass{amount = 5} = 90,
+ /obj/item/weapon/stock_parts/capacitor = 60,
+ /obj/item/weapon/stock_parts/capacitor = 60,
+ /obj/item/weapon/computer_hardware/network_card/advanced = 40
+ )
diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm
index 99f2626aa8..67715dfbe1 100644
--- a/code/game/objects/structures/signs.dm
+++ b/code/game/objects/structures/signs.dm
@@ -1853,7 +1853,7 @@
/obj/structure/sign/flag/fivearrows
name = "Five Arrows flag"
desc = "The red flag of the Five Arrows."
- description_fluff = "The Five Arrows is an independent government entity that seceded from the Solar Confederate Government in 2570, in response to percieved \
+ description_fluff = "The Five Arrows is an independent government entity that seceded from the Solar Confederate Government in 2570, in response to perceived \
failures in aiding the Sagittarius Heights during the Skathari Incursion. The success of the government in achieving effective local defense and prosperity has \
since attracted the membership of Kauq'xum, a remote Skrellian colony. \The Five Arrows formed the model for SolGov's own semi-autonomous \"Regional Blocs\"."
icon_state = "fivearrows"
@@ -1868,7 +1868,7 @@
/obj/item/flag/fivearrows
name = "Five Arrows flag"
desc = "The red flag of the Five Arrows."
- description_fluff = "The Five Arrows is an independent government entity that seceded from the Solar Confederate Government in 2570, in response to percieved \
+ description_fluff = "The Five Arrows is an independent government entity that seceded from the Solar Confederate Government in 2570, in response to perceived \
failures in aiding the Sagittarius Heights during the Skathari Incursion. The success of the government in achieving effective local defense and prosperity has \
since attracted the membership of Kauq'xum, a remote Skrellian colony. \The Five Arrows formed the model for SolGov's own semi-autonomous \"Regional Blocs\"."
flag_path = "fivearrows"
diff --git a/code/game/objects/structures/signs_vr.dm b/code/game/objects/structures/signs_vr.dm
index d786560142..f939037160 100644
--- a/code/game/objects/structures/signs_vr.dm
+++ b/code/game/objects/structures/signs_vr.dm
@@ -8,4 +8,58 @@
name = "decorative fire axe cabinet"
desc = "A fancy decorative indent in the wall, with an axe inside. The axe is actually a part of the indent and cannot be removed. A nostalgic reminder of older times of firefighting."
icon_state = "fireaxe1000"
- icon = 'icons/obj/closet.dmi'
\ No newline at end of file
+ icon = 'icons/obj/closet.dmi'
+
+//Small Signs for detailing
+/obj/structure/sign/small/fire/small
+ icon = 'icons/obj/decals.dmi'
+ name = "\improper DANGER: FIRE"
+ desc = "A warning sign which reads 'DANGER: FIRE'."
+ icon_state = "fire_small"
+
+/obj/structure/sign/small/nosmoking
+ name = "\improper NO SMOKING"
+ desc = "A warning sign which reads 'NO SMOKING'."
+ icon_state = "nosmoking_small"
+
+/obj/structure/sign/small/nosmoking
+ name = "\improper DESIGNATED SMOKING AREA"
+ desc = "A warning sign which reads 'DESIGNATED SMOKING AREA'."
+ icon_state = "smoking_small"
+
+/obj/structure/sign/small/warning
+ name = "\improper WARNING"
+ desc = "" //Null description
+ icon_state = "warning_small"
+
+/obj/structure/sign/small/warning/high_voltage
+ name = "\improper HIGH VOLTAGE"
+ icon_state = "shock_small"
+
+/obj/structure/sign/small/warning/radioactive
+ name = "\improper RADIOACTIVE AREA"
+ icon_state = "radiation_small"
+
+/obj/structure/sign/small/warning/caution
+ name = "\improper CAUTION"
+ icon_state = "caution_small"
+
+/obj/structure/sign/small/warning/server_room
+ name = "\improper SERVER ROOM"
+ icon_state = "server_small"
+
+/obj/structure/sign/small/warning/secure_area
+ name = "\improper SECURE AREA"
+ icon_state = "securearea_small"
+
+/obj/structure/sign/small/warning/vacuum
+ name = "\improper HARD VACUUM AHEAD"
+ icon_state = "space_small"
+
+/obj/structure/sign/small/warning/pods
+ name = "\improper ESCAPE PODS"
+ icon_state = "pods"
+
+/obj/structure/sign/small/warning/emerg_only
+ name = "\improper EMERGENCY USE ONLY"
+ icon_state = "emerg_small"
\ No newline at end of file
diff --git a/code/game/socket_talk.dm b/code/game/socket_talk.dm
index 8484b636b8..6cad496937 100644
--- a/code/game/socket_talk.dm
+++ b/code/game/socket_talk.dm
@@ -8,15 +8,15 @@
src.enabled = config.socket_talk
if(enabled)
- call("DLLSocket.so","establish_connection")("127.0.0.1","8019")
+ LIBCALL("DLLSocket.so","establish_connection")("127.0.0.1","8019")
proc
send_raw(message)
if(enabled)
- return call("DLLSocket.so","send_message")(message)
+ return LIBCALL("DLLSocket.so","send_message")(message)
receive_raw()
if(enabled)
- return call("DLLSocket.so","recv_message")()
+ return LIBCALL("DLLSocket.so","recv_message")()
send_log(var/log, var/message)
return send_raw("type=log&log=[log]&message=[message]")
send_keepalive()
diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm
index 7d5a1aa7d5..cf7a64572d 100644
--- a/code/game/turfs/flooring/flooring_decals.dm
+++ b/code/game/turfs/flooring/flooring_decals.dm
@@ -518,21 +518,23 @@ var/list/floor_decals = list()
/obj/effect/floor_decal/spline/plain
name = "spline - plain"
icon_state = "spline_plain"
+/obj/effect/floor_decal/spline/plain/corner
+ icon_state = "spline_plain_corner"
+/obj/effect/floor_decal/spline/plain/cee
+ icon_state = "spline_plain_cee"
+/obj/effect/floor_decal/spline/plain/three_quarters
+ icon_state = "spline_plain_full"
/obj/effect/floor_decal/spline/fancy
name = "spline - fancy"
icon_state = "spline_fancy"
-
/obj/effect/floor_decal/spline/fancy/wood
name = "spline - wood"
color = "#CB9E04"
-
/obj/effect/floor_decal/spline/fancy/wood/corner
icon_state = "spline_fancy_corner"
-
/obj/effect/floor_decal/spline/fancy/wood/cee
icon_state = "spline_fancy_cee"
-
/obj/effect/floor_decal/spline/fancy/wood/three_quarters
icon_state = "spline_fancy_full"
@@ -593,6 +595,10 @@ var/list/floor_decals = list()
name = "grey outline"
color = "#808080"
+/obj/effect/floor_decal/industrial/outline/red
+ name = "red outline"
+ color = COLOR_RED
+
/obj/effect/floor_decal/industrial/loading
name = "loading area"
icon_state = "loadingarea"
diff --git a/code/game/turfs/flooring/flooring_decals_vr.dm b/code/game/turfs/flooring/flooring_decals_vr.dm
index 80b26db2e5..c751896011 100644
--- a/code/game/turfs/flooring/flooring_decals_vr.dm
+++ b/code/game/turfs/flooring/flooring_decals_vr.dm
@@ -8,9 +8,6 @@
icon = 'icons/turf/stomach_vr.dmi'
icon_state = "c_flesh_floor_edges"
-/obj/effect/floor_decal/industrial/outline/red
- name = "red outline"
- color = COLOR_RED
/obj/effect/floor_decal/borderfloor/shifted
icon_state = "borderfloor_shifted"
@@ -232,3 +229,238 @@
icon_state = "mss_green_corner"
/obj/effect/floor_decal/milspec_sterile/green/half
icon_state = "mss_green_side"
+
+//Shuttle Floor Decals
+/obj/effect/floor_decal/shuttle
+ name = "partial outline"
+ icon_state = "semi_outline"
+/obj/effect/floor_decal/shuttle/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/shuttle/grey
+ color = "#545253"
+/obj/effect/floor_decal/shuttle/blue
+ color = "#00B8B2"
+
+/obj/effect/floor_decal/shuttle/handicap
+ name = "handicap marker"
+ icon_state = "handicap"
+/obj/effect/floor_decal/shuttle/handicap/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/shuttle/handicap/grey
+ color = "#545253"
+
+/obj/effect/floor_decal/shuttle/loading
+ name = "loading/unloading marker"
+ icon_state = "exit_and_entrance"
+/obj/effect/floor_decal/shuttle/loading/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/shuttle/loading/grey
+ color = "#545253"
+/obj/effect/floor_decal/shuttle/loading/red
+ color = "#a70000"
+
+/obj/effect/floor_decal/shuttle/full_2
+ name = "hatched marker"
+ icon_state = "full_2"
+/obj/effect/floor_decal/shuttle/full_2/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/shuttle/full_2/grey
+ color = "#545253"
+/obj/effect/floor_decal/shuttle/full_2/blue
+ color = "#00B8B2"
+
+//Industrial Floor Decals
+/obj/effect/floor_decal/industrial/warning
+ name = "hazard stripes"
+ icon_state = "warning"
+/obj/effect/floor_decal/industrial/warning/corner
+ icon_state = "warningcorner"
+/obj/effect/floor_decal/industrial/warning/full
+ icon_state = "warningfull"
+/obj/effect/floor_decal/industrial/warning/cee
+ icon_state = "warningcee"
+/obj/effect/floor_decal/industrial/warning/tile
+ icon_state = "warningtile"
+
+/obj/effect/floor_decal/industrial/warning/dust
+ icon_state = "warning_dust"
+/obj/effect/floor_decal/industrial/warning/dust/corner
+ icon_state = "warningcorner_dust"
+/obj/effect/floor_decal/industrial/warning/dust/full
+ icon_state = "warningfull_dust"
+/obj/effect/floor_decal/industrial/warning/dust/cee
+ icon_state = "warningcee_dust"
+/obj/effect/floor_decal/industrial/warning/dust/tile
+ icon_state = "warningtile_dust"
+
+/obj/effect/floor_decal/industrial/danger
+ name = "danger stripes"
+ icon_state = "danger"
+/obj/effect/floor_decal/industrial/danger/corner
+ icon_state = "dangercorner"
+/obj/effect/floor_decal/industrial/danger/full
+ icon_state = "dangerfull"
+/obj/effect/floor_decal/industrial/danger/cee
+ icon_state = "dangercee"
+
+/obj/effect/floor_decal/industrial/hatch
+ name = "hatched marking"
+ icon_state = "delivery"
+/obj/effect/floor_decal/industrial/hatch/blue
+ color = "#00B8B2"
+/obj/effect/floor_decal/industrial/hatch/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/hatch/grey
+ color = "#545253"
+/obj/effect/floor_decal/industrial/hatch/red
+ color = "#a70000"
+
+/obj/effect/floor_decal/industrial/rad_floor
+ name = "radiation marking"
+ icon_state = "rad_floor"
+/obj/effect/floor_decal/industrial/rad_floor/blue
+ color = "#00B8B2"
+/obj/effect/floor_decal/industrial/rad_floor/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/rad_floor/grey
+ color = "#545253"
+/obj/effect/floor_decal/industrial/rad_floor/red
+ color = "#a70000"
+
+/obj/effect/floor_decal/industrial/outline
+ name = "white outline"
+ icon_state = "outline"
+/obj/effect/floor_decal/industrial/outline/blue
+ name = "blue outline"
+ color = "#00B8B2"
+/obj/effect/floor_decal/industrial/outline/yellow
+ name = "yellow outline"
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/outline/grey
+ name = "grey outline"
+ color = "#545253"
+/obj/effect/floor_decal/industrial/outline/red
+ name = "red outline"
+ color = "#a70000"
+
+/obj/effect/floor_decal/industrial/outline/cut_corners
+ name = "white cut outline"
+ icon_state = "cut_corners"
+/obj/effect/floor_decal/industrial/outline/cut_corners/blue
+ name = "blue cut outline"
+ color = "#00B8B2"
+/obj/effect/floor_decal/industrial/outline/cut_corners/yellow
+ name = "yellow cut outline"
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/outline/cut_corners/grey
+ name = "grey cut outline"
+ color = "#545253"
+/obj/effect/floor_decal/industrial/outline/cut_corners/red
+ name = "red cut outline"
+ color = "#a70000"
+
+/obj/effect/floor_decal/industrial/loading
+ name = "loading area"
+ icon_state = "loading"
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/loading/white
+ color = null
+/obj/effect/floor_decal/industrial/loading/blue
+ color = "#00B8B2"
+/obj/effect/floor_decal/industrial/loading/grey
+ color = "#545253"
+/obj/effect/floor_decal/industrial/loading/red
+ color = "#a70000"
+
+/obj/effect/floor_decal/industrial/arrows
+ name = "tri-arrows"
+ icon_state = "tri-arrows"
+/obj/effect/floor_decal/industrial/arrows/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/arrows/blue
+ color = "#00B8B2"
+/obj/effect/floor_decal/industrial/arrows/grey
+ color = "#545253"
+/obj/effect/floor_decal/industrial/arrows/red
+ color = "#a70000"
+
+/obj/effect/floor_decal/industrial/caution
+ name = "caution"
+ icon_state = "caution"
+/obj/effect/floor_decal/industrial/caution/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/caution/blue
+ color = "#00B8B2"
+/obj/effect/floor_decal/industrial/caution/grey
+ color = "#545253"
+/obj/effect/floor_decal/industrial/caution/red
+ color = "#a70000"
+
+/obj/effect/floor_decal/industrial/stand_clear
+ name = "stand clear"
+ icon_state = "stand_clear"
+/obj/effect/floor_decal/industrial/stand_clear/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/stand_clear/blue
+ color = "#00B8B2"
+/obj/effect/floor_decal/industrial/stand_clear/grey
+ color = "#545253"
+/obj/effect/floor_decal/industrial/stand_clear/red
+ color = "#a70000"
+
+/obj/effect/floor_decal/industrial/bot_outline
+ name = "bot outline"
+ icon_state = "bot_outline"
+/obj/effect/floor_decal/industrial/bot_outline/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/bot_outline/blue
+ color = "#00B8B2"
+/obj/effect/floor_decal/industrial/bot_outline/grey
+ color = "#545253"
+/obj/effect/floor_decal/industrial/bot_outline/red
+ color = "#a70000"
+
+/obj/effect/floor_decal/industrial/bot_outline/corner
+ icon_state = "bot_corners"
+/obj/effect/floor_decal/industrial/bot_outline/corner/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/bot_outline/corner/blue
+ color = "#00B8B2"
+/obj/effect/floor_decal/industrial/bot_outline/corner/grey
+ color = "#545253"
+/obj/effect/floor_decal/industrial/bot_outline/corner/red
+ color = "#a70000"
+
+//Colored Warning Stripes
+/obj/effect/floor_decal/industrial/warning/color
+ icon_state = "warning_color"
+/obj/effect/floor_decal/industrial/warning/color/corner
+ icon_state = "warningcorner_color"
+/obj/effect/floor_decal/industrial/warning/color/full
+ icon_state = "warningfull_color"
+/obj/effect/floor_decal/industrial/warning/color/cee
+ icon_state = "warningcee_color"
+/obj/effect/floor_decal/industrial/warning/color/tile
+ icon_state = "warningtile_color"
+
+/obj/effect/floor_decal/industrial/warning/color/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/warning/color/corner/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/warning/color/full/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/warning/color/cee/yellow
+ color = "#CFCF55"
+/obj/effect/floor_decal/industrial/warning/color/tile/yellow
+ color = "#CFCF55"
+
+/obj/effect/floor_decal/industrial/warning/color/red
+ color = "#a70000"
+/obj/effect/floor_decal/industrial/warning/color/corner/red
+ color = "#a70000"
+/obj/effect/floor_decal/industrial/warning/color/full/red
+ color = "#a70000"
+/obj/effect/floor_decal/industrial/warning/color/cee/red
+ color = "#a70000"
+/obj/effect/floor_decal/industrial/warning/color/tile/red
+ color = "#a70000"
\ No newline at end of file
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 23044a5d8b..ad4a90bf2d 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -17,6 +17,7 @@
var/dirty_prob = 2 // Chance of being dirty roundstart
var/dirt = 0
var/special_temperature //Used for turf HE-Pipe interaction
+ var/climbable = FALSE //Adds proc to wall if set to TRUE on its initialization, defined here since not all walls are subtypes of wall
var/icon_edge = 'icons/turf/outdoors_edge.dmi' //VOREStation Addition - Allows for alternative edge icon files
@@ -63,6 +64,14 @@
if(istype(loc, /area/chapel))
holy = 1
levelupdate()
+ if(climbable)
+ verbs += /turf/simulated/proc/climb_wall
+
+/turf/simulated/examine(mob/user)
+ . = ..()
+ if(climbable)
+ . += "This [src] looks climbable."
+
/turf/simulated/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor="#A10808")
var/obj/effect/decal/cleanable/blood/tracks/tracks = locate(typepath) in src
@@ -108,7 +117,7 @@
if(H.shoes)
var/obj/item/clothing/shoes/S = H.shoes
if(istype(S))
- S.handle_movement(src,(H.m_intent == "run" ? 1 : 0))
+ S.handle_movement(src,(H.m_intent == "run" ? 1 : 0), H) // CHOMPEdit handle_movement now needs to know who is moving, for inshoe steppies
if(S.track_blood && S.blood_DNA)
bloodDNA = S.blood_DNA
bloodcolor=S.blood_color
diff --git a/code/game/turfs/simulated/angled_walls_and_doors_department_colors.dm b/code/game/turfs/simulated/angled_walls_and_doors_department_colors.dm
index 84f762944a..d2ea874a81 100644
--- a/code/game/turfs/simulated/angled_walls_and_doors_department_colors.dm
+++ b/code/game/turfs/simulated/angled_walls_and_doors_department_colors.dm
@@ -1,57 +1,57 @@
/turf/simulated/wall/bay/steel
- desc = "It has a steel stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a steel stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#3d5e80"
/turf/simulated/wall/bay/red
- desc = "It has a red stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a red stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#8c1d11"
/turf/simulated/wall/bay/brown
- desc = "It has a brown stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a brown stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#785134"
/turf/simulated/wall/bay/purple
- desc = "It has a purple stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a purple stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#5a19a8"
/turf/simulated/wall/bay/blue
- desc = "It has a blue stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a blue stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#2e2aa1"
/turf/simulated/wall/bay/orange
- desc = "It has a orange stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a orange stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#e6ab22"
/turf/simulated/wall/bay/white
- desc = "It has a white stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a white stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#ffffff"
/turf/simulated/wall/bay/black
- desc = "It has a black stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a black stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#2e2e2e"
/turf/simulated/wall/bay/green
- desc = "It has a green stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a green stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#00ab03"
/////R-Wall
/turf/simulated/wall/bay/r_wall/steel
- desc = "It has a steel stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a steel stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#3d5e80"
/turf/simulated/wall/bay/r_wall/red
- desc = "It has a red stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a red stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#8c1d11"
/turf/simulated/wall/bay/r_wall/brown
- desc = "It has a brown stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a brown stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#785134"
/turf/simulated/wall/bay/r_wall/purple
- desc = "It has a purple stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a purple stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#5a19a8"
/turf/simulated/wall/bay/r_wall/blue
- desc = "It has a blue stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a blue stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#2e2aa1"
/turf/simulated/wall/bay/r_wall/orange
- desc = "It has a orange stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a orange stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#e6ab22"
/turf/simulated/wall/bay/r_wall/white
- desc = "It has a white stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a white stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#ffffff"
/turf/simulated/wall/bay/r_wall/black
- desc = "It has a black stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a black stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#2e2e2e"
/turf/simulated/wall/bay/r_wall/green
- desc = "It has a green stripe! A huge chunk of metal used to seperate rooms."
+ desc = "It has a green stripe! A huge chunk of metal used to separate rooms."
stripe_color = "#00ab03"
/////Low wall
/obj/structure/low_wall/bay/steel
diff --git a/code/game/turfs/simulated/outdoors/atmoscaves_vr.dm b/code/game/turfs/simulated/outdoors/atmoscaves_vr.dm
index 8ac5dc08e5..7c96f35143 100644
--- a/code/game/turfs/simulated/outdoors/atmoscaves_vr.dm
+++ b/code/game/turfs/simulated/outdoors/atmoscaves_vr.dm
@@ -2,11 +2,13 @@
oxygen = MOLES_O2STANDARD
nitrogen = MOLES_N2STANDARD
temperature = T20C
+ climbable = TRUE
/turf/simulated/mineral/ignore_mapgen/cave
oxygen = MOLES_O2STANDARD
nitrogen = MOLES_N2STANDARD
temperature = T20C
+ climbable = TRUE
/turf/simulated/mineral/floor/cave
oxygen = MOLES_O2STANDARD
diff --git a/code/game/turfs/simulated/wall_types_vr.dm b/code/game/turfs/simulated/wall_types_vr.dm
index 6793cba759..fe8e5d4927 100644
--- a/code/game/turfs/simulated/wall_types_vr.dm
+++ b/code/game/turfs/simulated/wall_types_vr.dm
@@ -212,6 +212,7 @@ var/list/flesh_overlay_cache = list()
/turf/simulated/wall/solidrock
icon_state = "solidrock"
icon = 'icons/turf/wall_masks_vr.dmi'
+ climbable = TRUE
/turf/simulated/wall/titanium
icon_state = "titanium"
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index e90a758eed..0c34354acc 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -1,6 +1,6 @@
/turf/simulated/wall
name = "wall"
- desc = "A huge chunk of metal used to seperate rooms."
+ desc = "A huge chunk of metal used to separate rooms."
icon = 'icons/turf/wall_masks.dmi'
icon_state = "generic"
opacity = 1
diff --git a/code/game/turfs/simulated_vr.dm b/code/game/turfs/simulated_vr.dm
index 6c7325305f..dc74fd9aba 100644
--- a/code/game/turfs/simulated_vr.dm
+++ b/code/game/turfs/simulated_vr.dm
@@ -1,5 +1,15 @@
/turf/simulated
can_start_dirty = FALSE // We have enough premapped dirt where needed
+
+
/turf/simulated/floor/plating
- can_start_dirty = TRUE // But let maints and decrepit areas have some randomness
\ No newline at end of file
+ can_start_dirty = TRUE // But let maints and decrepit areas have some randomness
+
+
+/turf/simulated/proc/toggle_climbability() //Again, b
+ if(climbable)
+ verbs -= /turf/simulated/proc/climb_wall
+ else
+ verbs += /turf/simulated/proc/climb_wall
+ climbable = !climbable
diff --git a/code/game/world.dm b/code/game/world.dm
index c61c58ec9e..5d2f9686f2 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -535,6 +535,24 @@ var/world_topic_spam_protect_time = world.timeofday
var/ckey = copytext(line, 1, length(line)+1)
var/datum/mentor/M = new /datum/mentor(ckey)
M.associate(GLOB.directory[ckey])
+ else // CHOMPedit Start - Implementing loading mentors from database
+ establish_db_connection()
+ if(!SSdbcore.IsConnected())
+ error("Failed to connect to database in load_mentors().")
+ log_misc("Failed to connect to database in load_mentors().")
+ return
+
+ var/DBQuery/query = SSdbcore.NewQuery("SELECT ckey, mentor FROM erro_mentor") //CHOMPEdit TGSQL
+ query.Execute()
+ while(query.NextRow())
+ var/ckey = query.item[1]
+ var/mentor = query.item[2]
+
+ if(mentor)
+ var/datum/mentor/M = new /datum/mentor(ckey)
+ M.associate(GLOB.directory[ckey])
+ qdel(query)
+ // COMPedit End
/world/proc/update_status()
var/s = ""
diff --git a/code/hub.dm b/code/hub.dm
deleted file mode 100644
index 93c5b7323e..0000000000
--- a/code/hub.dm
+++ /dev/null
@@ -1,18 +0,0 @@
-/world
-
- hub = "Exadv1.spacestation13"
- //CHOMPEdit: Accidentally committed this to master instead of pull request. Adding comment to make a pull request. Also to note that I have changed the password so we won't appear on the HUB regardless of TGS3.
- hub_password = "null"
- name = "Space Station 13"
- /*YW EDIT we want to be on the hub
- name = "VOREStation" //VOREStation Edit
- visibility = 0 //VOREStation Edit
- */
-/* This is for any host that would like their server to appear on the main SS13 hub.
-To use it, simply replace the password above, with the password found below, and it should work.
-If not, let us know on the main tgstation IRC channel of irc.rizon.net #tgstation13 we can help you there.
-
- hub = "Exadv1.spacestation13"
- hub_password = "kMZy3U5jJHSiBQjr"
- name = "Space Station 13"
-*/
diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm
index 33339429cf..e0c38345e5 100644
--- a/code/modules/admin/admin_report.dm
+++ b/code/modules/admin/admin_report.dm
@@ -105,7 +105,7 @@ world/New()
continue
output += "Reported player: [N.offender_key](CID: [N.offender_cid])
"
output += "Offense:[N.body]
"
- output += "Occured at [time2text(N.date,"MM/DD hh:mm:ss")]
"
+ output += "Occurred at [time2text(N.date,"MM/DD hh:mm:ss")]
"
output += "authored by [N.author]
"
output += " Flag as Handled"
if(src.key == N.author)
@@ -150,7 +150,7 @@ world/New()
if(N.ID == ID)
found = N
if(!found)
- to_chat(src, "* An error occured, sorry.")
+ to_chat(src, "* An error occurred, sorry.")
found.done = 1
@@ -172,7 +172,7 @@ world/New()
if(N.ID == ID)
found = N
if(!found)
- to_chat(src, "* An error occured, sorry.")
+ to_chat(src, "* An error occurred, sorry.")
var/body = tgui_input_text(src.mob, "Enter a body for the news", "Body", multiline = TRUE, prevent_enter = TRUE)
if(!body) return
diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm
index 24f27f3761..6bb4ee1b4b 100644
--- a/code/modules/admin/admin_verb_lists_vr.dm
+++ b/code/modules/admin/admin_verb_lists_vr.dm
@@ -171,7 +171,9 @@ var/list/admin_verbs_fun = list(
/client/proc/add_mob_for_narration, //VOREStation Add
/client/proc/remove_mob_for_narration, //VOREStation Add
/client/proc/narrate_mob, //VOREStation Add
- /client/proc/narrate_mob_args //VOREStation Add
+ /client/proc/narrate_mob_args, //VOREStation Add
+ /client/proc/getPlayerStatus //VORESTation Add
+
)
var/list/admin_verbs_spawn = list(
@@ -187,7 +189,8 @@ var/list/admin_verbs_spawn = list(
/client/proc/spawn_chemdisp_cartridge,
/client/proc/map_template_load,
/client/proc/map_template_upload,
- /client/proc/map_template_load_on_new_z
+ /client/proc/map_template_load_on_new_z,
+ /client/proc/eventkit_open_mob_spawner //VOREStation Add
)
var/list/admin_verbs_server = list(
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index b1702a2c4a..b6f16a5090 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -29,19 +29,22 @@
check_antagonists()
return
- if(href_list["ahelp"])
+ // CHOMPedit Start - Tickets System
+ if(href_list["ticket"])
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT))
return
- var/ahelp_ref = href_list["ahelp"]
- var/datum/admin_help/AH = locate(ahelp_ref)
- if(AH)
- AH.Action(href_list["ahelp_action"])
+ var/ticket_ref = href_list["ticket"]
+ var/datum/ticket/T = locate(ticket_ref)
+ if(T)
+ T.Action(href_list["ticket_action"])
else
- to_chat(usr, "Ticket [ahelp_ref] has been deleted!")
+ to_chat(usr, "Ticket [ticket_ref] has been deleted!")
- else if(href_list["ahelp_tickets"])
- GLOB.ahelp_tickets.BrowseTickets(text2num(href_list["ahelp_tickets"]))
+ else if(href_list["tickets"])
+ GLOB.tickets.BrowseTickets(text2num(href_list["tickets"]))
+
+ // CHOMPedit End
mentor_commands(href, href_list, src)
@@ -166,7 +169,7 @@
if(admin_ranks.len)
new_rank = tgui_input_list(usr, "Please select a rank", "New rank", (admin_ranks|"*New Rank*"))
else
- new_rank = tgui_input_list(usr, "Please select a rank", "New rank", list("Game Master","Head Admin","Game Admin", "Trial Admin", "Admin Observer","Moderator","Mentor","Badmin","Retired Admin","Event Manager","Developer","DevMod","*New Rank*")) //CHOMP Edit bandaid fix to assigning titles because we're having some funky database issues, I think. Other option is to manually edit database entry for someone's title.
+ new_rank = tgui_input_list(usr, "Please select a rank", "New rank", list("Game Master","Head Admin","Game Admin", "Trial Admin", "Admin Observer","Moderator","Mentor","Badmin","Retired Admin","Event Manager","Developer","DevMod","*New Rank*")) //CHOMP Edit bandaid fix to assigning titles because we're having some funky database issues, I think. Other option is to manually edit database entry for someone's title.
var/rights = 0
if(D)
@@ -935,10 +938,12 @@
to_chat(M, "No ban appeals URL has been set.")
log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
message_admins("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")
- var/datum/admin_help/AH = M.client ? M.client.current_ticket : null
- if(AH)
- AH.Resolve()
+ // CHOMPedit Start - Tickets System
+ var/datum/ticket/T = M.client ? M.client.current_ticket : null
+ if(T)
+ T.Resolve()
qdel(M.client)
+ // CHOMPedit End
//qdel(M) // See no reason why to delete mob. Important stuff can be lost. And ban can be lifted before round ends.
if("No")
if(!check_rights(R_BAN)) return
@@ -963,9 +968,11 @@
message_admins("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.")
feedback_inc("ban_perma",1)
DB_ban_record(BANTYPE_PERMA, M, -1, reason)
- var/datum/admin_help/AH = M.client ? M.client.current_ticket : null
- if(AH)
- AH.Resolve()
+ // CHOMPedit Start - Tickets System
+ var/datum/ticket/T = M.client ? M.client.current_ticket : null
+ if(T)
+ T.Resolve()
+ // CHOMPedit End
qdel(M.client)
//qdel(M)
if("Cancel")
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index baba14563c..fe64b97346 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -445,7 +445,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null
ENABLE_BITFIELD(options, SDQL2_OPTION_DO_NOT_AUTOGC)
/datum/SDQL2_query/proc/ARun()
- INVOKE_ASYNC(src, .proc/Run)
+ INVOKE_ASYNC(src, PROC_REF(Run))
/datum/SDQL2_query/proc/Run()
if(SDQL2_IS_RUNNING)
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 7c8dd0bc6b..634d6d4a64 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -1,3 +1,10 @@
+/*
+
+CHOMPedit - This file has been excluded from the compilation.
+Reason: Replaced with "Tickets System". Main logic has been moved to: modular_chomp/modules/tickets/tickets.dm
+
+*/
+
/client/var/datum/admin_help/current_ticket //the current ticket the (usually) not-admin client is dealing with
//CHOMPEdit Begin
diff --git a/code/modules/admin/verbs/adminhelp_vr.dm b/code/modules/admin/verbs/adminhelp_vr.dm
index d6bdb37f21..5c55732d0e 100644
--- a/code/modules/admin/verbs/adminhelp_vr.dm
+++ b/code/modules/admin/verbs/adminhelp_vr.dm
@@ -1,3 +1,10 @@
+/*
+
+CHOMPedit - This file has been excluded from the compilation.
+Reason: Replaced with "Tickets System"
+
+*/
+
/datum/admin_help/proc/send2adminchat()
if(!config.chat_webhook_url)
return
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index f093baa1da..9283afbc7b 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -53,19 +53,19 @@
to_chat(src, "Error: Admin-PM: Client not found.")
return
- var/datum/admin_help/AH = C.current_ticket
+ var/datum/ticket/T = C.current_ticket // CHOMPedit - Ticket System
- if(AH)
+ if(T) // CHOMPedit - Ticket System
message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
var/msg = tgui_input_text(src,"Message:", "Private message to [key_name(C, 0, 0)]")
if (!msg)
message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
return
- cmd_admin_pm(whom, msg, AH)
+ cmd_admin_pm(whom, msg, T) // CHOMPedit - Ticket System
//takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM.
//Fetching a message if needed. src is the sender and C is the target client
-/client/proc/cmd_admin_pm(whom, msg, datum/admin_help/AH)
+/client/proc/cmd_admin_pm(whom, msg, datum/ticket/T) // CHOMPedit - Ticket System
if(prefs.muted & MUTE_ADMINHELP)
to_chat(src, "Error: Admin-PM: You are unable to use admin PM-s (muted).")
return
@@ -171,7 +171,7 @@
else
if(holder) //sender is an admin but recipient is not. Do BIG RED TEXT
if(!recipient.current_ticket)
- new /datum/admin_help(msg, recipient, TRUE)
+ new /datum/ticket(msg, recipient, TRUE, 0) // CHOMPedit - Ticket System
to_chat(recipient, "-- Administrator private message --")
to_chat(recipient, "Admin PM from-[key_name(src, recipient, 0)]: [msg]")
@@ -214,7 +214,7 @@
/proc/IrcPm(target,msg,sender)
var/client/C = GLOB.directory[target]
- var/datum/admin_help/ticket = C ? C.current_ticket : GLOB.ahelp_tickets.CKey2ActiveTicket(target)
+ var/datum/ticket/ticket = C ? C.current_ticket : GLOB.tickets.CKey2ActiveTicket(target) // CHOMPedit - Ticket System
var/compliant_msg = trim(lowertext(msg))
var/irc_tagged = "[sender](IRC)"
var/list/splits = splittext(compliant_msg, " ")
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 0a80c9bc77..4a06c79f26 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -158,14 +158,16 @@
Left Mouse Button on AI mob = Select/Deselect mob
\
Left Mouse Button + alt on AI mob = Toggle hostility on mob
\
Left Mouse Button + shift on AI mob = Toggle AI (also resets)
\
- Left Mouse Button + ctrl on AI mob = Copy mob faction
\
+ Left Mouse Button + ctrl on AI mob = Copy mob faction
\
+ Middle Mouse Button + shift on any = Set selected mob(s) to wander
\
+ Middle Mouse Button + shift on any = Set selected mob(s) to NOT wander
\
Right Mouse Button + ctrl on any mob = Paste mob faction copied with Left Mouse Button + shift
\
Right Mouse Button on enemy mob = Command selected mobs to attack mob
\
Right Mouse Button on allied mob = Command selected mobs to follow mob
\
Right Mouse Button + shift on any mob = Command selected mobs to follow mob regardless of faction
\
Note: The following also reset the mob's home position:
\
Right Mouse Button on tile = Command selected mobs to move to tile (will cancel if enemies are seen)
\
- Right Mouse Button + shift on tile = Command selected mobs to reposition to tile (will not be inturrupted by enemies)
\
+ Right Mouse Button + shift on tile = Command selected mobs to reposition to tile (will not be interrupted by enemies)
\
Right Mouse Button + alt on obj/turfs = Command selected mobs to attack obj/turf
\
***********************************************************")
return 1
@@ -546,6 +548,18 @@ CHOMP Remove end */
for(var/mob/living/unit in holder.selected_mobs)
holder.deselect_AI_mob(user.client, unit)
+ if(pa.Find("middle"))
+ if(pa.Find("shift"))
+ to_chat(user, SPAN_NOTICE("All selected mobs set to wander"))
+ for(var/mob/living/unit in holder.selected_mobs)
+ var/datum/ai_holder/AI = unit.ai_holder
+ AI.wander = TRUE
+ if(pa.Find("ctrl"))
+ to_chat(user, SPAN_NOTICE("Setting mobs set to NOT wander"))
+ for(var/mob/living/unit in holder.selected_mobs)
+ var/datum/ai_holder/AI = unit.ai_holder
+ AI.wander = FALSE
+
if(pa.Find("right"))
// Paste faction
diff --git a/code/modules/admin/verbs/entity_narrate.dm b/code/modules/admin/verbs/entity_narrate.dm
index 20926803f5..a33d14fbf7 100644
--- a/code/modules/admin/verbs/entity_narrate.dm
+++ b/code/modules/admin/verbs/entity_narrate.dm
@@ -7,6 +7,20 @@
var/list/entity_refs = list()
+ //TGUI Helper Vars
+ var/tgui_id = "EntityNarrate"
+ var/tgui_selection_mode = 0 //0 for single entity, 1 for multi entity
+ var/tgui_selected_name = "" //String for single selection in-game name
+ var/tgui_selected_type = "" //String for single selection type
+ var/tgui_selected_id = "" //String to retrieve ref from entity_refs
+ var/tgui_selected_refs //object references
+ var/list/tgui_selected_id_multi = list() //List of strings containing mob ids for multi selection
+ var/tgui_narrate_mode = 0 //0 for speak, 1 for emote
+ var/tgui_narrate_privacy = 0 //0 for loud, 1 for subtle
+ var/tgui_last_message = 0 // int to avoid spam
+
+
+
//Appears as a right click verb on any obj and mob within view range.
//when not right clicking we get a list to pick from in aforementioned view range.
@@ -32,11 +46,16 @@
if(istype(E, /mob/living))
var/mob/living/L = E
if(L.client)
- to_chat(usr, "You may not speak for players!")
- log_and_message_admins("attempted to speak for [L.ckey]'s mob", usr)
+ to_chat(usr, SPAN_NOTICE("[L.name] is a player. All attempts to speak through them \
+ gets logged in case of abuse."))
+ log_and_message_admins("has added [L.ckey]'s mob to their entity narrate list", usr)
return
var/unique_name = sanitize(tgui_input_text(usr, "Please give the entity a unique name to track internally. \
This doesn't override how it appears in game", "tracker", L.name))
+ if(unique_name in holder.entity_names)
+ to_chat(usr, SPAN_NOTICE("[unique_name] is not unique! Pick another!"))
+ add_mob_for_narration(L) //Recursively calling ourselves until cancelled or a unique name is given.
+ return
holder.entity_names += unique_name
holder.entity_refs[unique_name] = L
log_and_message_admins("added [L.name] for their personal list to narrate", usr) //Logging here to avoid spam, while still safeguarding abuse
@@ -46,6 +65,10 @@
var/atom/A = E
var/unique_name = sanitize(tgui_input_text(usr, "Please give the entity a unique name to track internally. \
This doesn't override how it appears in game", "tracker", A.name))
+ if(unique_name in holder.entity_names)
+ to_chat(usr, SPAN_NOTICE("[unique_name] is not unique! Pick another!"))
+ add_mob_for_narration(A)
+ return
holder.entity_names += unique_name
holder.entity_refs[unique_name] = A
log_and_message_admins("added [A.name] for their personal list to narrate", usr) //Logging here to avoid spam, while still safeguarding abuse
@@ -98,13 +121,18 @@
//Obtaining and sanitizing arguments for the actual proc
- var/which_entity = tgui_input_list(usr, "Choose which mob to narrate", "Narrate mob", holder.entity_names, null)
+ var/choices = holder.entity_names + "Open TGUI"
+ var/which_entity = tgui_input_list(usr, "Choose which mob to narrate", "Narrate mob", choices, null)
if(!which_entity) return
- var/mode = tgui_alert(usr, "Speak or emote?", "mode", list("Speak", "Emote", "Cancel"))
- if(mode == "Cancel") return
- var/message = sanitize(tgui_input_text(usr, "Input what you want [which_entity] to say or do", "narrate", null, multiline = TRUE, prevent_enter = TRUE))
- if(message)
- narrate_mob_args(which_entity, mode, message)
+ if(which_entity == "Open TGUI")
+ holder.tgui_interact(usr)
+ else
+ var/mode = tgui_alert(usr, "Speak or emote?", "mode", list("Speak", "Emote", "Cancel"))
+ if(mode == "Cancel") return
+ var/message = tgui_input_text(usr, "Input what you want [which_entity] to [mode]", "narrate",
+ null, multiline = TRUE, prevent_enter = TRUE)
+ if(message)
+ narrate_mob_args(which_entity, mode, message)
//The actual logic of the verb. Called by narrate_mob() when used.
/client/proc/narrate_mob_args(name as text, mode as text, message as text)
@@ -127,8 +155,6 @@
//Sanitizing args
name = sanitize(name)
mode = sanitize(mode)
- if(message)
- message = sanitize(message)
if(!(mode in list("Speak", "Emote")))
to_chat(usr, SPAN_NOTICE("Valid modes are 'Speak' and 'Emote'."))
@@ -141,11 +167,9 @@
if(istype(holder.entity_refs[name], /mob/living))
var/mob/living/our_entity = holder.entity_refs[name]
if(our_entity.client) //Making sure we can't speak for players
- to_chat(usr, SPAN_NOTICE("Cannot narrate mobs with active clients!"))
- log_and_message_admins("attempted to speak for [our_entity.ckey]'s mob", usr)
- return
+ log_and_message_admins("used entity-narrate to speak through [our_entity.ckey]'s mob", usr)
if(!message)
- message = sanitize(tgui_input_text(usr, "Input what you want [our_entity] to [mode]", "narrate", null))
+ message = tgui_input_text(usr, "Input what you want [our_entity] to [mode]", "narrate", null) //say/emote sanitize already
if(message && mode == "Speak")
our_entity.say(message)
else if(message && mode == "Emote")
@@ -158,10 +182,135 @@
else if(istype(holder.entity_refs[name], /atom))
var/atom/our_entity = holder.entity_refs[name]
if(!message)
- message = sanitize(tgui_input_text(usr, "Input what you want [our_entity] to [mode]", "narrate", null))
+ message = tgui_input_text(usr, "Input what you want [our_entity] to [mode]", "narrate", null)
+ message = sanitize(message)
if(message && mode == "Speak")
our_entity.audible_message("[our_entity.name] [message]")
else if(message && mode == "Emote")
our_entity.visible_message("[our_entity.name] [message]")
else
return
+
+
+/datum/entity_narrate/tgui_state(mob/user)
+ return GLOB.tgui_admin_state
+
+/datum/entity_narrate/tgui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, tgui_id, "Entity Narration")
+ ui.open()
+
+/datum/entity_narrate/tgui_data(mob/user)
+ var/list/data = list()
+ data["mode_select"] = tgui_narrate_mode
+ data["privacy_select"] = tgui_narrate_privacy
+ data["selected_id"] = tgui_selected_id
+ data["selected_name"] = tgui_selected_name
+ data["selected_type"] = tgui_selected_type
+ data["selection_mode"] = tgui_selection_mode
+ data["multi_id_selection"] = tgui_selected_id_multi
+ data["number_mob_selected"] = LAZYLEN(tgui_selected_id_multi)
+ data["entity_names"] = entity_names
+
+ return data
+
+/datum/entity_narrate/tgui_act(action, list/params)
+ . = ..()
+
+ if(.) return
+ if(!check_rights_for(usr.client, R_FUN)) return
+
+ switch(action)
+ if("change_mode_multi")
+ tgui_selection_mode = !tgui_selection_mode
+ //Clearing selections after switching mode
+ tgui_selected_id_multi = list()
+ tgui_selected_id = ""
+ tgui_selected_type = ""
+ tgui_selected_name = ""
+ tgui_selected_refs = null
+ if("change_mode_privacy")
+ tgui_narrate_privacy = !tgui_narrate_privacy
+ if("change_mode_narration")
+ tgui_narrate_mode = !tgui_narrate_mode
+ if("select_entity")
+ if(tgui_selection_mode)
+ if(params["id_selected"] in tgui_selected_id_multi)
+ tgui_selected_id_multi -= params["id_selected"]
+ else
+ tgui_selected_id_multi += params["id_selected"]
+ else
+ if(params["id_selected"] in tgui_selected_id_multi)
+ tgui_selected_id_multi -= params["id_selected"]
+ tgui_selected_id = ""
+ tgui_selected_type = ""
+ tgui_selected_name = ""
+ tgui_selected_refs = null
+ else
+ tgui_selected_id_multi = list() //Using the same var for ease of implementation. Thus, we must reset to empty each time.
+ tgui_selected_id_multi += params["id_selected"]
+ tgui_selected_id = params["id_selected"]
+ tgui_selected_refs = entity_refs[tgui_selected_id]
+ if(istype(tgui_selected_refs, /mob/living))
+ var/mob/living/L = tgui_selected_refs
+ if(L.client)
+ tgui_selected_type = "!!!!PLAYER!!!!"
+ tgui_selected_name = L.name
+ else
+ tgui_selected_type = L.type
+ tgui_selected_name = L.name
+ else if(istype(tgui_selected_refs, /atom))
+ var/atom/A = tgui_selected_refs
+ tgui_selected_type = A.type
+ tgui_selected_name = A.name
+ if("narrate")
+ if(world.time < (tgui_last_message + 0.5 SECONDS))
+ to_chat(usr, SPAN_NOTICE("You can't messages that quickly! Wait at least half a second"))
+ else
+ to_chat(usr, SPAN_NOTICE("Message successfully sent!"))
+ tgui_last_message = world.time
+ var/message = params["message"] //Sanitizing before speaking it
+ if(tgui_selection_mode)
+ for(var/entity in tgui_selected_id_multi)
+ var/ref = entity_refs[entity]
+ if(istype(ref, /mob/living))
+ var/mob/living/L = ref
+ if(L.client)
+ log_and_message_admins("used entity-narrate to speak through [L.ckey]'s mob", usr)
+ narrate_tgui_mob(L, message)
+ else if(istype(ref, /atom))
+ var/atom/A = ref
+ narrate_tgui_atom(A, message)
+ else
+ var/ref = entity_refs[tgui_selected_id]
+ if(istype(ref, /mob/living))
+ var/mob/living/L = ref
+ if(L.client)
+ log_and_message_admins("used entity-narrate to speak through [L.ckey]'s mob", usr)
+ narrate_tgui_mob(L, message)
+ else if(istype(ref, /atom))
+ var/atom/A = ref
+ narrate_tgui_atom(A, message)
+
+/datum/entity_narrate/proc/narrate_tgui_mob(mob/living/L, message as text)
+ //say and custom_emote sanitize it themselves, not sanitizing here to avoid double encoding.
+ if(tgui_narrate_mode && tgui_narrate_privacy)
+ L.custom_emote_vr(m_type = VISIBLE_MESSAGE, message = message)
+ else if(tgui_narrate_mode && !tgui_narrate_privacy)
+ L.custom_emote(VISIBLE_MESSAGE, message)
+ else if(!tgui_narrate_mode && tgui_narrate_privacy)
+ L.say(message, whispering = 1)
+ else if(!tgui_narrate_mode && !tgui_narrate_privacy)
+ L.say(message)
+
+/datum/entity_narrate/proc/narrate_tgui_atom(atom/A, message as text)
+ message = sanitize(message)
+ if(tgui_narrate_mode && tgui_narrate_privacy)
+ A.visible_message("[A.name] [message]", range = 1)
+ else if(tgui_narrate_mode && !tgui_narrate_privacy)
+ A.visible_message("[A.name] [message]",)
+ else if(!tgui_narrate_mode && tgui_narrate_privacy)
+ A.audible_message("[A.name] [message]", hearing_distance = 1)
+ else if(!tgui_narrate_mode && !tgui_narrate_privacy)
+ A.audible_message("[A.name] [message]")
diff --git a/code/modules/admin/verbs/get_player_status.dm b/code/modules/admin/verbs/get_player_status.dm
new file mode 100644
index 0000000000..c409deab65
--- /dev/null
+++ b/code/modules/admin/verbs/get_player_status.dm
@@ -0,0 +1,44 @@
+#define INACTIVITY_CAP 15 MINUTES //Creating a define for this for more straight forward finagling.
+
+
+//TGUI functionality planned for easier readability, so creating a new file for this
+//TGUI functionality will call a datum to handle things separately
+/client/proc/getPlayerStatus()
+ set name = "Report Player Status"
+ set desc = "Get information on all active players in-game."
+ set category = "EventKit"
+
+ if(!check_rights(R_FUN)) return
+
+ var/player_list_local = player_list //Copying player list so we don't touch a global var all the time
+ var/list/area_list = list() //An associative list, where key is area name, value is a list of mob references
+ var/inactives = 0
+ var/players = 0
+
+ //Initializing our working list
+ for(var/player in player_list_local)
+
+ if(!istype(player, /mob/living)) continue //We only care for living players
+ var/mob/living/L = player
+ players += 1
+ if(L.client.inactivity > INACTIVITY_CAP)
+ inactives += 1
+ continue //Anyone who hasn't done anything in 15 minutes is likely too busy
+ var/area_name = get_area_name(L)
+ if(area_name in area_list)
+ area_list[area_name] += L // area_name:list(A,B,C); we add L to (A,B,C)
+ else
+ area_list[area_name] = list(L)
+
+ var/message = "#### The Following Players Are Likely Available #### \n"
+ for(var/cur_area in area_list)
+ var/area_players = area_list[cur_area]
+ message += "**** There are currently [LAZYLEN(area_players)] in [cur_area] **** \n"
+
+
+ for(var/mob/living/L in area_players)
+ message += "[L.name] ([L.key]) at ([L.x];[L.y]) has been inactive for [round(L.client.inactivity / (60 SECONDS))] minutes. \n"
+
+
+ message += "#### Over all, there are [players] eligible players, of which [inactives] were hidden due to inactivity. ####"
+ to_chat(usr, SPAN_NOTICE(message))
diff --git a/code/modules/ai/ai_holder.dm b/code/modules/ai/ai_holder.dm
index 9668dde7f9..20cbf4ad6d 100644
--- a/code/modules/ai/ai_holder.dm
+++ b/code/modules/ai/ai_holder.dm
@@ -210,7 +210,7 @@
holder = new_holder
home_turf = get_turf(holder)
manage_processing(AI_PROCESSING)
- GLOB.stat_set_event.register(holder, src, .proc/holder_stat_change)
+ GLOB.stat_set_event.register(holder, src, PROC_REF(holder_stat_change))
..()
/datum/ai_holder/Destroy()
@@ -459,11 +459,11 @@
walk_to_target()
if(STANCE_MOVE)
if(hostile && find_target()) // This will switch its stance.
- ai_log("handle_stance_strategical() : STANCE_MOVE, found target and was inturrupted.", AI_LOG_TRACE)
+ ai_log("handle_stance_strategical() : STANCE_MOVE, found target and was interrupted.", AI_LOG_TRACE)
return
if(STANCE_FOLLOW)
if(hostile && find_target()) // This will switch its stance.
- ai_log("handle_stance_strategical() : STANCE_FOLLOW, found target and was inturrupted.", AI_LOG_TRACE)
+ ai_log("handle_stance_strategical() : STANCE_FOLLOW, found target and was interrupted.", AI_LOG_TRACE)
return
else if(leader)
ai_log("handle_stance_strategical() : STANCE_FOLLOW, going to calculate_path([leader]).", AI_LOG_TRACE)
@@ -505,4 +505,4 @@
#undef AI_NO_PROCESS
#undef AI_PROCESSING
-#undef AI_FASTPROCESSING
\ No newline at end of file
+#undef AI_FASTPROCESSING
diff --git a/code/modules/artifice/telecube.dm b/code/modules/artifice/telecube.dm
index 713903a10b..60366ab823 100644
--- a/code/modules/artifice/telecube.dm
+++ b/code/modules/artifice/telecube.dm
@@ -193,10 +193,10 @@
/obj/item/weapon/telecube/proc/cooldown(var/mate_too = FALSE)
if(!ready)
return
-
+
ready = FALSE
update_icon()
- addtimer(CALLBACK(src, .proc/ready), cooldown_time)
+ addtimer(CALLBACK(src, PROC_REF(ready)), cooldown_time)
if(mate_too && mate)
mate.cooldown(mate_too = FALSE) //No infinite recursion pls
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index 60eee03265..a7267ca342 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -50,7 +50,7 @@
switch(action)
if("signal")
- INVOKE_ASYNC(src, .proc/signal)
+ INVOKE_ASYNC(src, PROC_REF(signal))
. = TRUE
if("freq")
frequency = unformat_frequency(params["freq"])
diff --git a/code/modules/blob2/overmind/types/fabrication_swarm.dm b/code/modules/blob2/overmind/types/fabrication_swarm.dm
index 7e267558d9..10a69cb301 100644
--- a/code/modules/blob2/overmind/types/fabrication_swarm.dm
+++ b/code/modules/blob2/overmind/types/fabrication_swarm.dm
@@ -2,7 +2,7 @@
/datum/blob_type/fabrication_swarm
name = "iron tide"
desc = "A swarm of self replicating construction nanites. Incredibly illegal, but only mildly dangerous."
- effect_desc = "Slow-spreading, but incredibly resiliant. It has a chance to harden itself against attacks automatically for no resource cost, and uses cheaply-constructed hivebots as soldiers."
+ effect_desc = "Slow-spreading, but incredibly resilient. It has a chance to harden itself against attacks automatically for no resource cost, and uses cheaply-constructed hivebots as soldiers."
ai_desc = "defensive"
difficulty = BLOB_DIFFICULTY_MEDIUM // Emitters are okay, EMP is great.
color = "#666666"
@@ -41,4 +41,4 @@
if(L.stat != DEAD && L.isSynthetic())
L.adjustBruteLoss(-1)
L.adjustFireLoss(-1)
- return
\ No newline at end of file
+ return
diff --git a/code/modules/busy_space_vr/air_traffic.dm b/code/modules/busy_space_vr/air_traffic.dm
index d353522d96..a261b56d86 100644
--- a/code/modules/busy_space_vr/air_traffic.dm
+++ b/code/modules/busy_space_vr/air_traffic.dm
@@ -60,7 +60,7 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
/datum/lore/atc_controller/proc/shift_ending(var/evac = 0)
msg("[using_map.shuttle_name], this is [using_map.dock_name] Control, you are cleared to complete routine transfer from [using_map.station_name] to [using_map.dock_name].")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[using_map.shuttle_name] departing [using_map.dock_name] for [using_map.station_name] on routine transfer route. Estimated time to arrival: ten minutes.","[using_map.shuttle_name]")
/datum/lore/atc_controller/proc/random_convo()
@@ -110,14 +110,14 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/chatter_type = "normal"
if(force_chatter_type)
chatter_type = force_chatter_type
- else if((org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate" || org_type == "system defense") && org_type2 == "pirate") //this is ugly but when I tried to do it with !='s it fired for pirate-v-pirate, still not sure why. might as well stick it up here so it takes priority over other combos.
+ else if((org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate" || org_type == "system defense" || org_type == "spacer") && org_type2 == "pirate") //this is ugly but when I tried to do it with !='s it fired for pirate-v-pirate, still not sure why. might as well stick it up here so it takes priority over other combos.
chatter_type = "distress"
else if(org_type == "corporate") //corporate-specific subset for the slogan event. despite the relatively high weight it was still quite rare in tests.
- chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed",300;"slogan")
+ chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",180;"dockingrequestgeneric",30;"undockingrequest","normal",30;"undockingdenied",50;"slogan",25;"civvieleaks")
else if((org_type == "government" || org_type == "neutral" || org_type == "military"))
- chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdenied",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest","normal",30;"undockingdenied",30;"undockingdelayed")
+ chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",180;"dockingrequestgeneric",30;"undockingrequest","normal",30;"undockingdenied",25;"civvieleaks")
else if(org_type == "spacer")
- chatter_type = pick(5;"emerg",15;"policescan",15;"traveladvisory",5;"pathwarning",10;"dockingrequestgeneric",30;"dockingrequestdenied",10;"dockingrequestdelayed",30;"dockingrequestsupplly",10;"dockingrequestrepair",20;"dockingrequestmedical",20;"dockingrequestsecurity",30;"undockingrequest","normal",10;"undockingdenied",30;"undockingdelayed")
+ chatter_type = pick(5;"emerg",15;"policescan",15;"traveladvisory",5;"pathwarning",150;"dockingrequestgeneric",30;"undockingrequest","normal",10;"undockingdenied",25;"civvieleaks")
//the following filters *always* fire their 'unique' event when they're tripped, simply because the conditions behind them are quite rare to begin with
else if(org_type == "smuggler" && org_type2 != "system defense") //just straight up funnel smugglers into always being caught, otherwise we get them asking for traffic info and stuff
@@ -129,14 +129,14 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
else if((org_type == "smuggler" || org_type == "pirate") && org_type2 != "system defense") //but if we roll THIS combo, time to alert the SDF to get off their asses
chatter_type = "hostiledetected"
//SDF-specific events that need to filter based on the second party (basically just the following SDF-unique list with the soft-result ship scan thrown in)
- else if(org_type == "system defense" && (org_type == "government" || org_type == "neutral" || org_type == "military" || org_type == "corporate")) //let's see if we can narrow this down, I didn't see many ship-to-ship scans
- chatter_type = pick(75;"policeshipscan","sdfpatrolupdate",75;"sdfendingpatrol",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",75;"sdfbeginpatrol",50;"normal")
+ else if(org_type == "system defense" && (org_type2 == "government" || org_type2 == "neutral" || org_type2 == "military" || org_type2 == "corporate" || org_type2 == "spacer")) //let's see if we can narrow this down, I didn't see many ship-to-ship scans
+ chatter_type = pick(75;"policeshipscan","sdfpatrolupdate",75;"sdfendingpatrol",180;"dockingrequestgeneric",20;"undockingrequest",75;"sdfbeginpatrol",50;"normal",10;"civvieleaks")
//SDF-specific events that don't require the secondary at all, in the event that we manage to roll SDF + hostile/smuggler or something
else if(org_type == "system defense")
- chatter_type = pick("sdfpatrolupdate",60;"sdfendingpatrol",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",20;"undockingrequest",80;"sdfbeginpatrol","normal")
+ chatter_type = pick("sdfpatrolupdate",60;"sdfendingpatrol",120;"dockingrequestgeneric",20;"undockingrequest",80;"sdfbeginpatrol","normal","sdfchatter")
//if we somehow don't match any of the other existing filters once we've run through all of them
else
- chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",30;"dockingrequestgeneric",30;"dockingrequestdelayed",30;"dockingrequestdenied",30;"dockingrequestsupply",30;"dockingrequestrepair",30;"dockingrequestmedical",30;"dockingrequestsecurity",30;"undockingrequest",30;"undockingdenied",30;"undockingdelayed","normal")
+ chatter_type = pick(5;"emerg",25;"policescan",25;"traveladvisory",30;"pathwarning",90;"dockingrequestgeneric",30;"undockingrequest",30;"undockingdenied","normal",25;"civvieleaks")
//I probably should do some kind of pass here to work through all the possible combinations of major factors and see if the filtering list needs reordering or modifying, but I really can't be arsed
//DEBUG BLOCK
@@ -175,11 +175,11 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
switch(chatter_type)
//mayday call
if("emerg")
- var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have [pick("asteroids","space debris")] impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke in the cockpit","We have unidentified boarders","Our RCS are malfunctioning and we're losing stability","Our life support [pick("is failing","has failed")]")
+ var/problem = pick("We have hull breaches on multiple decks","We have unknown hostile life forms on board","Our primary drive is failing","We have [pick("asteroids","space debris")] impacting the hull","We're experiencing a total loss of engine power","We have hostile ships closing fast","There's smoke [pick("in the cockpit","on the bridge")]","We have unidentified boarders","Our RCS are malfunctioning and we're losing stability","Our life support [pick("is failing","has failed")]")
msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! [problem]!","[prefix] [shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[combined_first_name], this is [using_map.dock_name] Control, copy. Switch to emergency responder channel [ertchannel].")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("Understood [using_map.dock_name] Control, switching now.","[prefix] [shipname]")
//Control scan event: soft outcome
if("policescan")
@@ -187,21 +187,21 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?")
var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear, move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.")
msg("[combined_first_name], this is [using_map.dock_name] Control, your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[confirm] [using_map.dock_name] Control, holding position.","[prefix] [shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("Your compliance is appreciated, [combined_first_name]. Scan commencing.")
- sleep(10 SECONDS)
+ sleep(rand(3,6)*2 SECONDS)
msg(complain,"[prefix] [shipname]")
- sleep(15 SECONDS)
+ sleep(rand(3,6)*3 SECONDS)
msg("[combined_first_name], this is [using_map.dock_name] Control. Scan complete. [completed]")
//Control scan event: hard outcome
if("policeflee")
var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, Control.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!")
msg("Unknown [pick("ship","vessel","starship")], this is [using_map.dock_name] Control, identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[uhoh]","[shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("This is [using_map.starsys_name] Defense Control to all local assets: vector to interdict and detain [combined_first_name]. Control out.","[using_map.starsys_name] Defense Control")
//SDF scan event: soft outcome
if("policeshipscan")
@@ -209,160 +209,195 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/complain = pick("I hope this doesn't take too long.","Can we hurry this up?","Make it quick.","This better not take too long.","Is this really necessary?")
var/completed = pick("You're free to proceed.","Everything looks fine, carry on.","You're clear. Move along.","Apologies for the delay, you're clear.","Switch to channel [sdfchannel] and await further instruction.")
msg("[combined_second_name], this is [combined_first_name], your [pick("ship","vessel","starship")] has been flagged for routine inspection. Hold position and prepare to be scanned.","[prefix] [shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[confirm] [combined_first_name], holding position.","[secondprefix] [secondshipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("Your compliance is appreciated, [combined_second_name]. Scan commencing.","[prefix] [shipname]")
- sleep(10 SECONDS)
+ sleep(rand(3,6)*2 SECONDS)
msg(complain,"[secondprefix] [secondshipname]")
- sleep(15 SECONDS)
+ sleep(rand(3,6)*3 SECONDS)
msg("[combined_second_name], this is [combined_first_name]. Scan complete. [completed]","[prefix] [shipname]")
//SDF scan event: hard outcome
if("policeshipflee")
var/uhoh = pick("No can do chief, we got places to be.","Sorry but we've got places to be.","Not happening.","Ah fuck, who ratted us out this time?!","You'll never take me alive!","Hey, I have a cloaking device! You can't see me!","I'm going to need to ask for a refund on that stealth drive...","I'm afraid I can't do that, |[shipname]|.","Ah |hell|.","Fuck!","This isn't the ship you're looking for.","Well. This is awkward.","Uh oh.","I surrender!")
msg("Unknown [pick("ship","vessel","starship")], this is [combined_second_name], identify yourself and submit to a full inspection. Flying without an active transponder is a violation of interstellar shipping regulations.","[secondprefix] [secondshipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[uhoh]","[shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[using_map.starsys_name] Defense Control, this is [combined_second_name]. We have a situation here, please advise.","[secondprefix] [secondshipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("Defense Control copies, [combined_second_name], reinforcements are en route. Switch further communications to encrypted band [sdfchannel].","[using_map.starsys_name] Defense Control")
//SDF scan event: engage primary in combat! fairly rare since it needs a pirate/vox + SDF roll
if("policeshipcombat")
var/battlestatus = pick("requesting reinforcements.","we need backup! Now!","holding steady.","we're holding our own for now.","we have them on the run.","they're trying to make a run for it!","we have them right where we want them.","we're badly outgunned!","we have them outgunned.","we're outnumbered here!","we have them outnumbered.","this'll be a cakewalk.",10;"notify their next of kin.")
msg("[using_map.starsys_name] Defense Control, this is [combined_second_name], engaging [combined_first_name] [pick("near route","in sector")] [rand(1,100)], [battlestatus]","[secondprefix] [secondshipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[using_map.starsys_name] Defense Control copies, [combined_second_name]. Keep us updated.","[using_map.starsys_name] Defense Control")
//SDF event: patrol update
if("sdfpatrolupdate")
var/statusupdate = pick("nothing unusual so far","nothing of note","everything looks clear so far","ran off some [pick("pirates","marauders")] near route [pick(1,100)], [pick("no","minor")] damage sustained, continuing patrol","situation normal, no suspicious activity yet","minor incident on route [pick(1,100)]","Code 7-X [pick("on route","in sector")] [pick(1,100)], situation is under control","seeing a lot of traffic on route [pick(1,100)]","caught a couple of smugglers [pick("on route","in sector")] [pick(1,100)]","sustained some damage in a skirmish just now, we're heading back for repairs")
msg("[using_map.starsys_name] Defense Control, this is [combined_first_name] reporting in, [statusupdate], over.","[prefix] [shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[using_map.starsys_name] Defense Control copies, [combined_first_name]. Keep us updated, out.","[using_map.starsys_name] Defense Control")
//SDF event: end patrol
if("sdfendingpatrol")
var/appreciation = pick("Copy","Understood","Affirmative","10-4","Roger that")
var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.")
msg("[callname], this is [combined_first_name], returning from our system patrol route, requesting permission to [landing_short].","[prefix] [shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]")
+ //SDF event: general chatter
+ if("sdfchatter")
+ var/chain = pick("codecheck","commscheck")
+ switch(chain)
+ if("codecheck")
+ msg("Check. Check. |Check|. Uhhh... check? Wait. Wait! Hold on. Yeah, okay, I gotta call this one in.","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[using_map.dock_name] Control, confirm auth-code... [rand(1,9)][rand(1,9)][rand(1,9)]-[pick("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega")]?","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("One moment... yeah, that code checks out [combined_first_name].")
+ sleep(rand(3,6) SECONDS)
+ msg("|(sigh)| Copy that Control. You! Move along!","[prefix] [shipname]")
+ if("commscheck")
+ msg("Control this is [combined_first_name], we're getting some interference in our area. [pick("How's our line?","Do you read?","How copy, over?")]","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("Control reads you loud and clear [combined_first_name].","[using_map.starsys_name] Defense Control")
+ sleep(rand(3,6) SECONDS)
+ msg("[pick("Copy that","Thanks,","Roger that")] Control. [combined_first_name] out.","[prefix] [shipname]")
+ //Civil event: leaky chatter
+ if("civvieleaks")
+ var/commleak = pick("thatsmywife","missingkit","pipeleaks","weirdsmell","weirdsmell2")
+ switch(commleak)
+ if("thatsmywife")
+ msg("-so then I says to him, |that's no [pick("space carp","space shark","vox","garbage scow","freight liner","cargo hauler","superlifter")], that's my +wife!+| And he-","[prefix] [shipname]")
+ if("missingkit")
+ msg("-did you get the kit from down on deck [rand(1,4)]? I need th-","[prefix] [shipname]")
+ if("pipeleaks")
+ msg("I swear if these pipes keep leaking I'm going to-","[prefix] [shipname]")
+ if("weirdsmell")
+ msg("-and where the hell is that smell coming fr-","[prefix] [shipname]")
+ if("weirdsmell2")
+ msg("-hat in the [pick("three","five","seven","nine")] hells did you |eat| [pick("ensign","crewman")]? This compartment reeks of-","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[combined_first_name], your internal comms are leaking[pick("."," again.",", again.",". |Again|.")]")
+ sleep(rand(3,6) SECONDS)
+ msg("Sorry Control, won't happen again.","[prefix] [shipname]")
//DefCon event: hostile found
if("hostiledetected")
var/orders = pick("Engage on sight","Engage with caution","Engage with extreme prejudice","Engage at will","Search and destroy","Bring them in alive, if possible","Interdict and detain","Keep your eyes peeled","Bring them in, dead or alive","Stay alert")
msg("This is [using_map.starsys_name] Defense Control to all SDF assets. Priority update follows.","[using_map.starsys_name] Defense Control")
- sleep(5 SECONDS)
- msg("Be on the lookout for [combined_first_name], last sighted near route [rand(1,100)]. [orders]. DefCon, out.","[using_map.starsys_name] Defense Control")
+ sleep(rand(3,6) SECONDS)
+ msg("Be on the lookout for [combined_first_name], last sighted [pick("near route","in sector","near sector")] [rand(1,100)]. [orders]. DefCon, out.","[using_map.starsys_name] Defense Control")
//Ship event: distress call, under attack
if("distress")
- msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! We are under attack by [combined_second_name]! Requesting immediate assistance!","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("[combined_first_name], this is [using_map.starsys_name] Defense Control, copy. SDF is en route, contact on [sdfchannel].")
- sleep(5 SECONDS)
- msg("Understood [using_map.starsys_name] Defense Control, switching now.","[prefix] [shipname]")
+ var/state = pick(66;"calm",34;"panic")
+ switch(state)
+ if("calm")
+ msg("[using_map.starsys_name] Defense Control, this is [combined_first_name].","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("We read you. Go ahead, [combined_first_name].","[using_map.starsys_name] Defense Control")
+ sleep(rand(3,6) SECONDS)
+ msg("Another vessel in our area is moving [pick("aggressively","suspiciously","erratically","unpredictably","with clear hostile intent")], please advise? Forwarding sensor data now.","[prefix] [shipname]","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[combined_first_name], [using_map.starsys_name] Defense Control copies. Sensor data matches logged profile for [combined_second_name]. SDF units are en route to your location.","[using_map.starsys_name] Defense Control")
+ sleep(rand(3,6) SECONDS)
+ msg("[pick("Appreciated","Copy that","Understood")], Control. Switching to [sdfchannel] to coordinate.","[prefix] [shipname]")
+ if("panic")
+ msg("+Mayday, mayday, mayday!+ This is [combined_first_name] declaring an emergency! We are under attack by [combined_second_name]! Requesting immediate assistance!","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[combined_first_name], this is [using_map.starsys_name] Defense Control, copy. SDF is en route, contact on [sdfchannel].")
+ sleep(rand(3,6) SECONDS)
+ msg("[pick("Copy that","Understood")] [using_map.starsys_name] Defense Control, switching now!","[prefix] [shipname]")
//Control event: travel advisory
if("traveladvisory")
- var/flightwarning = pick("Solar flare activity is spiking and expected to cause issues along main flight lanes [rand(1,33)], [rand(34,67)], and [rand(68,100)]","Pirate activity is on the rise, stay close to System Defense vessels","We're seeing a rise in illegal salvage operations, please report any unusual activity to the nearest SDF vessel via channel [sdfchannel]","Vox Marauder activity is higher than usual, report any unusual activity to the nearest System Defense vessel","A quarantined [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","A prison [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","Traffic volume is higher than normal, expect processing delays","Anomalous bluespace activity detected along route [rand(1,100)], exercise caution","Smugglers have been particularly active lately, expect increased security scans","Depots are currently experiencing a fuel shortage, expect delays and higher rates","Asteroid mining has displaced debris dangerously close to main flight lanes on route [rand(1,100)], watch for potential impactors","[pick("Pirate","Vox Marauder")] and System Defense forces are currently engaged in skirmishes throughout the system, please steer clear of any active combat zones","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship")] has collided with a [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship")] near route [rand(1,100)], watch for debris and do not impede emergency service vessels","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship")] on route [rand(1,100)] has experienced total engine failure. Emergency response teams are en route, please observe minimum safe distances and do not impede emergency service vessels","Transit routes have been recalculated to adjust for planetary drift. Please synch your astronav computers as soon as possible to avoid delays and difficulties","[pick("Bounty hunters","System Defense officers","Mercenaries")] are currently searching for a wanted fugitive, report any sightings of suspicious activity to System Defense via channel [sdfchannel]","Mercenary contractors are currently conducting aggressive [pick("piracy","marauder")] suppression operations",10;"It's space carp breeding season. [pick("Stars","Gods","God","Goddess")] have mercy on you all, because the carp won't")
+ var/flightwarning = pick("Solar flare activity is spiking and expected to cause issues along main flight lanes [rand(1,33)], [rand(34,67)], and [rand(68,100)]","Pirate activity is on the rise, stay close to System Defense vessels","We're seeing a rise in illegal salvage operations, please report any unusual activity to the nearest SDF vessel via channel [sdfchannel]","Vox Marauder activity is higher than usual, report any unusual activity to the nearest System Defense vessel","A quarantined [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","A prison [pick("fleet","convoy")] is passing through the system along route [rand(1,100)], please observe minimum safe distance","Traffic volume is higher than normal, expect processing delays","Anomalous bluespace activity detected [pick("along route [rand(1,100)]","in sector [rand(1,100)]")], exercise caution","Smugglers have been particularly active lately, expect increased security scans","Depots are currently experiencing a fuel shortage, expect delays and higher rates","Asteroid mining has displaced debris dangerously close to main flight lanes on route [rand(1,100)], watch for potential impactors","[pick("Pirate","Vox Marauder")] and System Defense forces are currently engaged in skirmishes throughout the system, please steer clear of any active combat zones","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship","mining barge","salvage trawler")] has collided with a [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship","mining barge","salvage trawler")] near route [rand(1,100)], watch for debris and do not impede emergency service vessels","A [pick("fuel tanker","cargo liner","passenger liner","freighter","transport ship","mining barge","salvage trawler")] on route [rand(1,100)] has experienced total engine failure. Emergency response teams are en route, please observe minimum safe distances and do not impede emergency service vessels","Transit routes have been recalculated to adjust for planetary drift. Please synch your astronav computers as soon as possible to avoid delays and difficulties","[pick("Bounty hunters","System Defense officers","Mercenaries")] are currently searching for a wanted fugitive, report any sightings of suspicious activity to System Defense via channel [sdfchannel]","Mercenary contractors are currently conducting aggressive [pick("piracy","marauder")] suppression operations",10;"It's space [pick("carp","shark")] breeding season. [pick("Stars","Skies","Gods","God","Goddess","Fates")] have mercy on you all")
msg("This is [using_map.dock_name] Control to all vessels in the [using_map.starsys_name] system. Priority travel advisory follows.")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[flightwarning]. Control out.")
//Control event: warning to a specific vessel
if("pathwarning")
- var/navhazard = pick("a pocket of intense radiation","a pocket of unstable gas","a debris field","a secure installation","an active combat zone","a quarantined ship","a quarantined installation","a quarantined sector","a live-fire SDF training exercise","an ongoing Search & Rescue operation")
+ var/navhazard = pick("a pocket of intense radiation","a pocket of unstable gas","a debris field","a secure installation","an active combat zone","a quarantined ship","a quarantined installation","a quarantined sector","a live-fire SDF training exercise","an ongoing Search & Rescue operation","a hazardous derelict","an intense electrical storm","an intense ion storm","a shoal of space carp","a pack of space sharks","an asteroid infested with gnat hives","a protected space ray habitat","a region with anomalous bluespace activity","a rogue comet")
var/confirm = pick("Understood","Roger that","Affirmative","Our bad","Thanks for the heads up")
var/safetravels = pick("Fly safe out there","Good luck","Safe travels","Godspeed","Stars guide you","Don't let it happen again")
msg("[combined_first_name], this is [using_map.dock_name] Control, your [pick("ship","vessel","starship")] is approaching [navhazard], observe minimum safe distance and adjust your heading appropriately.")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[confirm] [using_map.dock_name] Control, adjusting course.","[prefix] [shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("Your compliance is appreciated, [combined_first_name]. [safetravels].")
//Ship event: docking request (generic)
if("dockingrequestgeneric")
- var/appreciation = pick("Much appreciated","Many thanks","Understood","Cheers")
- var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.")
- msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.")
- sleep(5 SECONDS)
- msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]")
- //Ship event: docking request (denied)
- if("dockingrequestdenied")
- var/reason = pick("we don't have any landing pads large enough for your vessel","we don't have the necessary facilities for your vessel type or class")
- var/disappointed = pick("That's unfortunate. [combined_first_name], out.","Damn shame. We'll just have to keep moving. [combined_first_name], out.","[combined_first_name], out.")
- msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("[combined_first_name], this is [using_map.dock_name] Control. Request denied, [reason].")
- sleep(5 SECONDS)
- msg("Understood, [using_map.dock_name] Control. [disappointed]","[prefix] [shipname]")
- //Ship event: docking request (delayed)
- if("dockingrequestdelayed")
- var/reason = pick("we don't have any free landing pads right now, please hold for three minutes","you're too far away, please close to ten thousand meters","we're seeing heavy traffic around the landing pads right now, please hold for three minutes","we're currently cleaning up a fuel spill on one of our free pads, please hold for three minutes","there are loose containers on our free pads, stand by for a couple of minutes whilst we secure them","another vessel has aerospace priority right now, please hold for three minutes")
+ var/request_type = pick(100;"generic",40;"delayed",40;"supply",20;"repair",20;"medical",20;"security")
var/appreciation = pick("Much appreciated","Many thanks","Understood","Perfect, thank you","Excellent, thanks","Great","Copy that")
var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.")
- msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("[combined_first_name], this is [using_map.dock_name] Control. Request denied, [reason] and resubmit your request.")
- sleep(5 SECONDS)
- msg("Understood, [using_map.dock_name] Control.","[prefix] [shipname]")
- sleep(180 SECONDS)
- msg("[callname], this is [combined_first_name], resubmitting [landing_move].","[prefix] [shipname]")
- sleep (5 SECONDS)
- msg("[combined_first_name], this is [using_map.dock_name] Control. Everything appears to be in order now, permission granted, proceed to [landing_zone]. Follow the green lights on your way in.")
- sleep(5 SECONDS)
- msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]")
- //Ship event: docking request (resupply)
- if("dockingrequestsupply")
- var/preintensifier = pick(75;"getting ",75;"running ","") //whitespace hack, sometimes they'll add a preintensifier, but not always
- var/intensifier = pick("very","pretty","critically","extremely","dangerously","desperately","kinda","a little","a bit","rather","sorta")
- var/low_thing = pick("ammunition","munitions","clean water","food","spare parts","medical supplies","reaction mass","gas","hydrogen fuel","phoron fuel","fuel",10;"tea",10;"coffee",10;"soda",10;"pizza",10;"beer",10;"booze",10;"vodka",10;"snacks") //low chance of a less serious shortage
- var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you")
- var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.")
- msg("[callname], this is [combined_first_name]. We're [preintensifier][intensifier] low on [low_thing]. Requesting permission to [landing_short] for resupply.","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.")
- sleep(5 SECONDS)
- msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]")
- //Ship event: docking request (repair/maint)
- if("dockingrequestrepair")
- var/damagestate = pick("We've experienced some hull damage","We're suffering minor system malfunctions","We're having some technical issues","We're overdue maintenance","We have several minor space debris impacts","We've got some battle damage here","Our reactor output is fluctuating","We're hearing some weird noises from the [pick("engines","pipes","ducting","HVAC")]","Our artificial gravity generator has failed","Our life support is failing","Our environmental controls are busted","Our water recycling system has shorted out","Our navcomp is freaking out","Our systems are glitching out","We just got caught in a solar flare","We had a close call with an asteroid","We have a minor [pick("fuel","water","oxygen","gas")] leak","We have depressurized compartments","We have a hull breach","Our shield generator is on the fritz","Our RCS is acting up","One of our [pick("hydraulic","pneumatic")] systems has depressurized","Our repair bots are malfunctioning")
- var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you")
- var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.")
- msg("[callname], this is [combined_first_name]. [damagestate]. Requesting permission to [landing_short] for repairs and maintenance.","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Repair crews are standing by, contact them on channel [engchannel].")
- sleep(5 SECONDS)
- msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]")
- //Ship event: docking request (medical)
- if("dockingrequestmedical")
- var/medicalstate = pick("multiple casualties","several cases of radiation sickness","an unknown virus","an unknown infection","a critically injured VIP","sick refugees","multiple cases of food poisoning","injured passengers","sick passengers","injured engineers","wounded marines","a delicate situation","a pregnant passenger","injured castaways","recovered escape pods","unknown escape pods")
- var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you")
- var/dockingplan = pick("Starting final approach now.","Commencing landing procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.")
- msg("[callname], this is [combined_first_name]. We have [medicalstate] on board. Requesting permission to [landing_short] for medical assistance.","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Medtechs are standing by, contact them on channel [medchannel].")
- sleep(5 SECONDS)
- msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]")
- //Ship event: docking request (security)
- if("dockingrequestsecurity")
- var/species = pick("human","unathi","lizard","tajaran","feline","skrell","akula","promethean","sergal","synthetic","robotic","teshari","avian","vulpkanin","canine","vox","zorren","hybrid","mixed-species","vox","grey","alien")
- var/securitystate = pick("several [species] convicts","a captured pirate","a wanted criminal","[species] stowaways","incompetent [species] shipjackers","a delicate situation","a disorderly passenger","disorderly [species] passengers","ex-mutineers","a captured vox marauder","captured vox marauders","stolen goods","a container full of confiscated contraband","containers full of confiscated contraband",5;"a very lost shadekin",5;"a raging case of [pick("spiders","crabs")]") //gotta have a little something to lighten the mood now and then
- var/appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","Perfect, thank you")
- var/dockingplan = pick("Starting final approach now.","Commencing docking procedures.","Autopilot engaged.","Approach vector locked in.","In the pipe, five by five.")
- msg("[callname], this is [combined_first_name]. We have [securitystate] on board and require security assistance. Requesting permission to [landing_short].","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Security teams are standing by, contact them on channel [secchannel].")
- sleep(5 SECONDS)
+ switch(request_type)
+ if("generic")
+ msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.")
+ if("delayed")
+ var/reason = pick("we don't have any free landing pads right now, please hold for a few minutes","you're too far away, please close to ten thousand meters","we're seeing heavy traffic around the landing pads right now, please hold for a few minutes","we're currently cleaning up a fuel spill on one of our free pads, please hold for a few minutes","there are loose containers on our free pads, stand by for a couple of minutes whilst we secure them","another vessel has aerospace priority right now, please hold for a few minutes")
+ msg("[callname], this is [combined_first_name], [pick("stopping by","passing through")] on our way to [destname], requesting permission to [landing_short].","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[combined_first_name], this is [using_map.dock_name] Control. Request denied, [reason] and resubmit your request.")
+ sleep(rand(3,6) SECONDS)
+ msg("Understood, [using_map.dock_name] Control.","[prefix] [shipname]")
+ sleep(rand(3,6)*60 SECONDS)
+ msg("[callname], this is [combined_first_name], resubmitting [landing_move].","[prefix] [shipname]")
+ sleep (5 SECONDS)
+ msg("[combined_first_name], this is [using_map.dock_name] Control. Everything appears to be in order now, permission granted, proceed to [landing_zone]. Follow the green lights on your way in.")
+ if("supply")
+ var/preintensifier = pick(75;"getting ",75;"running ","",15;"like, ") //whitespace hack, sometimes they'll add a preintensifier, but not always
+ var/intensifier = pick("very","pretty","critically","extremely","dangerously","desperately","kinda","a little","a bit","rather","sorta")
+ var/low_thing = pick("ammunition","munitions","clean water","food","spare parts","medical supplies","reaction mass","gas","hydrogen fuel","phoron fuel","fuel",10;"tea",10;"coffee",10;"soda",10;"pizza",10;"beer",10;"booze",10;"vodka",10;"snacks") //low chance of a less serious shortage
+ appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you")
+ msg("[callname], this is [combined_first_name]. We're [preintensifier][intensifier] low on [low_thing]. Requesting permission to [landing_short] for resupply.","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in.")
+ if("repair")
+ var/damagestate = pick("We've experienced some hull damage","We're suffering minor system malfunctions","We're having some [pick("weird","strange","odd","unusual")] technical issues","We're overdue maintenance","We have several minor space debris impacts","We've got some battle damage here","Our reactor output is fluctuating","We're hearing some weird noises from the [pick("engines","pipes","ducting","HVAC")]","We just got caught in a solar flare","We had a close call with an asteroid","We have a minor [pick("fuel","water","oxygen","gas")] leak","We have depressurized compartments","We have a hull breach","One of our [pick("hydraulic","pneumatic")] systems has depressurized","Our [pick("life support","water recycling system","navcomp","shield generator","RCS","auto-repair system","artificial gravity generator","environmental control system")] is [pick("failing","acting up","on the fritz","shorting out","glitching out","freaking out","malfunctioning")]")
+ appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you")
+ msg("[callname], this is [combined_first_name]. [damagestate]. Requesting permission to [landing_short] for repairs and maintenance.","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Repair crews are standing by, contact them on channel [engchannel].")
+ if("medical")
+ var/species = pick("human","humanoid","unathi","lizard","tajaran","feline","skrell","akula","promethean","sergal","synthetic","robotic","teshari","avian","vulpkanin","canine","vox","zorren","hybrid","mixed-species","vox","grey","alien",5;"catslug")
+ var/medicalstate = pick("multiple casualties","several cases of radiation sickness","an unknown virus","an unknown infection","a critically injured VIP","sick refugees","multiple cases of food poisoning","injured [pick("","[species] ")]passengers","sick [pick("","[species] ")]passengers","injured engineers","wounded marines","a delicate situation","a pregnant passenger","injured [pick("","[species] ")]castaways","recovered escape pods","unknown escape pods")
+ appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","We owe you one","I owe you one","Perfect, thank you")
+ msg("[callname], this is [combined_first_name]. We have [medicalstate] on board. Requesting permission to [landing_short] for medical assistance.","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Medtechs are standing by, contact them on channel [medchannel].")
+ if("security")
+ var/species = pick("human","humanoid","unathi","lizard","tajaran","feline","skrell","akula","promethean","sergal","synthetic","robotic","teshari","avian","vulpkanin","canine","vox","zorren","hybrid","mixed-species","vox","grey","alien",5;"catslug")
+ var/securitystate = pick("several [species] convicts","a captured pirate","a wanted criminal","[species] stowaways","incompetent [species] shipjackers","a delicate situation","a disorderly passenger","disorderly [species] passengers","ex-mutineers","a captured vox marauder","captured vox marauders","stolen goods","[pick("a container","containers")] full of [pick("confiscated contraband","stolen goods")]",5;"a very lost shadekin",15;"a buncha lost-looking uh... cat... slug... |things?|",10;"a raging case of [pick("spiders","crabs","geese","gnats","sharks","carp")]") //gotta have a little something to lighten the mood now and then
+ appreciation = pick("Much appreciated","Many thanks","Understood","You're a lifesaver","Perfect, thank you")
+ msg("[callname], this is [combined_first_name]. We have [securitystate] on board and require security assistance. Requesting permission to [landing_short].","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted, proceed to [landing_zone]. Follow the green lights on your way in. Security teams are standing by, contact them on channel [secchannel].")
+ sleep(rand(3,6) SECONDS)
msg("[appreciation], [using_map.dock_name] Control. [dockingplan]","[prefix] [shipname]")
//Ship event: undocking request
if("undockingrequest")
+ var/request_type = pick(150;"generic",50;"delayed")
+ var/takeoff = pick("depart","launch")
var/safetravels = pick("Fly safe out there","Good luck","Safe travels","See you next week","Godspeed","Stars guide you")
var/thanks = pick("Appreciated","Thanks","Don't worry about us","We'll be fine","You too","So long")
- var/takeoff = pick("depart","launch")
msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted. Docking clamps released. [safetravels].")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
+ switch(request_type)
+ if("generic")
+ msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted. Docking clamps released. [safetravels].")
+ sleep(rand(3,6) SECONDS)
+ msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]")
+ if("delayed")
+ var/denialreason = pick("Docking clamp malfunction, please hold","Fuel lines have not been secured","Ground crew are still on the pad","Loose containers are on the pad","Exhaust deflectors are not yet in position, please hold","There's heavy traffic right now, it's not safe for your vessel to launch","Another vessel has aerospace priority at this moment","Port officials are still aboard")
+ msg("Negative [combined_first_name], request denied. [denialreason]. Try again in a few minutes.")
+ sleep(rand(3,6)*60 SECONDS)
+ msg("[callname], this is [combined_first_name], re-requesting permission to depart from [landing_zone].","[prefix] [shipname]")
+ sleep(rand(3,6) SECONDS)
+ msg("[combined_first_name], this is [using_map.dock_name] Control. Everything appears to be in order now, permission granted. Docking clamps released. [safetravels].")
+ sleep(rand(3,6) SECONDS)
msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]")
//SDF event: starting patrol
if("sdfbeginpatrol")
@@ -370,51 +405,36 @@ var/datum/lore/atc_controller/atc = new/datum/lore/atc_controller
var/thanks = pick("Appreciated","Thanks","Don't worry about us","We'll be fine","You too")
var/takeoff = pick("depart","launch","take off","dust off")
msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone] to begin system patrol.","[prefix] [shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[combined_first_name], this is [using_map.dock_name] Control. Permission granted. Docking clamps released. [safetravels].")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] beginning system patrol, out.","[prefix] [shipname]")
//Ship event: undocking request (denied)
if("undockingdenied")
var/takeoff = pick("depart","launch")
var/denialreason = pick("Security is requesting a full cargo inspection","Your ship has been impounded for multiple [pick("security","safety")] violations","Your ship is currently under quarantine lockdown","We have reason to believe there's an issue with your papers","Security personnel are currently searching for a fugitive and have ordered all outbound ships remain grounded until further notice")
msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[prefix] [shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("Negative [combined_first_name], request denied. [denialreason].")
- //Ship event: undocking request (delayed)
- if("undockingdelayed")
- var/denialreason = pick("Docking clamp malfunction, please hold","Fuel lines have not been secured","Ground crew are still on the pad","Loose containers are on the pad","Exhaust deflectors are not yet in position, please hold","There's heavy traffic right now, it's not safe for your vessel to launch","Another vessel has aerospace priority at this moment","Port officials are still aboard")
- var/takeoff = pick("depart","launch")
- var/safetravels = pick("Fly safe out there","Good luck","Safe travels","See you next week","Godspeed","Stars guide you")
- var/thanks = pick("Appreciated","Thanks","Don't worry about us","We'll be fine","You too","So long")
- msg("[callname], this is [combined_first_name], requesting permission to [takeoff] from [landing_zone].","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("Negative [combined_first_name], request denied. [denialreason]. Try again in three minutes.")
- sleep(180 SECONDS) //yes, three minutes
- msg("[callname], this is [combined_first_name], re-requesting permission to depart from [landing_zone].","[prefix] [shipname]")
- sleep(5 SECONDS)
- msg("[combined_first_name], this is [using_map.dock_name] Control. Everything appears to be in order now, permission granted. Docking clamps released. [safetravels].")
- sleep(5 SECONDS)
- msg("[thanks], [using_map.dock_name] Control. This is [combined_first_name] setting course for [destname], out.","[prefix] [shipname]")
if("slogan")
msg("The following is a sponsored message from [name].","Facility PA")
- sleep (5 SECONDS)
+ sleep(5 SECONDS)
msg("[slogan]","Facility PA")
else //time for generic message
msg("[callname], this is [combined_first_name] on [mission] [pick(mission_noun)] to [destname], requesting [request].","[prefix] [shipname]")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[combined_first_name], this is [using_map.dock_name] Control, [response].")
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
msg("[using_map.dock_name] Control, [yes ? "thank you" : "understood"], out.","[prefix] [shipname]")
return //oops, forgot to restore this
/* //OLD BLOCK, for reference
//Ship sends request to ATC
msg(full_request,"[prefix] [shipname]"
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
//ATC sends response to ship
msg(full_response)
- sleep(5 SECONDS)
+ sleep(rand(3,6) SECONDS)
//Ship sends response to ATC
msg(full_closure,"[prefix] [shipname]")
return
diff --git a/code/modules/busy_space_vr/organizations.dm b/code/modules/busy_space_vr/organizations.dm
index 71768e301d..0008df7c63 100644
--- a/code/modules/busy_space_vr/organizations.dm
+++ b/code/modules/busy_space_vr/organizations.dm
@@ -11,12 +11,12 @@
var/list/ship_prefixes = list() //Some might have more than one! Like NanoTrasen. Value is the mission they perform, e.g. ("ABC" = "mission desc")
var/complex_tasks = FALSE //enables complex task generation
-
+
//how does it work? simple: if you have complex tasks enabled, it goes; PREFIX + TASK_TYPE + FLIGHT_TYPE
//e.g. NDV = Asset Protection + Patrol + Flight
//this overrides the standard PREFIX = TASK logic and allows you to use the ship prefix for subfactions (warbands, religions, whatever) within a faction, and define task_types at the faction level
//task_types are picked from completely at random in air_traffic.dm, much like flight_types, so be careful not to potentially create combos that make no sense!
-
+
var/list/task_types = list(
"logistics",
"patrol",
@@ -183,7 +183,8 @@
"Cwn Annwn",
"Morning Swan",
"Black Cat",
- "Challenger"
+ "Challenger",
+ "Savage Chicken"
)
var/list/destination_names = list() //Names of static holdings that the organization's ships visit regularly.
@@ -192,7 +193,7 @@
var/org_type = "neutral" //Valid options are "neutral", "corporate", "government", "system defense", "military, "smuggler", & "pirate"
var/sysdef = FALSE //Are we the space cops?
var/autogenerate_destination_names = TRUE //Pad the destination lists with some extra random ones? see the proc below for info on that
-
+
var/slogans = list("This is a placeholder slogan, ding dong!") //Advertising slogans. Who doesn't want more obnoxiousness on the radio? Picked at random each time the slogan event fires. This has a placeholder so it doesn't runtime on trying to draw from a 0-length list in the event that new corps are added without full support.
/datum/lore/organization/New()
@@ -218,7 +219,7 @@
"Finlay","Onasilos","Makropolus","Surt","Boinayel",
"Eyeke","Cayahuanca","Hamarik","Abol","Hiisi",
"Belisama","Mintome","Neri","Toge","Iolaus",
- "Koyopa","Independance","Ixbalanque","Magor","Fold",
+ "Koyopa","Independence","Ixbalanque","Magor","Fold",
"Santamasa","Noifasui","Kavian","Babylonia","Bran",
"Alef","Lete","Chura","Wadirum","Buru",
"Umbaasaa","Vytis","Peitruss","Trimobe","Baiduri",
@@ -309,8 +310,8 @@
them being the foremost experts on the substance and its uses. In the modern day, NanoTrasen prides \
itself on being an early adopter to as many new technologies as possible, often offering the newest \
products to their employees. In an effort to combat complaints about being 'guinea pigs', Nanotrasen \
- also offers one of the most comprehensive medical plans in Commonwealth space, up to and including cloning \
- and therapy.\
+ also offers one of the most comprehensive medical plans in Commonwealth space, up to and including cloning, \
+ resleeving, and therapy.\
\
NT's most well known products are its phoron based creations, especially those used in Cryotherapy. \
It also boasts a prosthetic line, which is provided to its employees as needed, and is used as an incentive \
@@ -403,9 +404,9 @@
org_type = "corporate"
slogans = list(
- "Hephaestus Arms - When it comes to personal protection, nobody does it better.",
- "Hephaestus Arms - Peace through Superior Firepower.",
- "Hephaestus Arms - Don't be caught firing blanks."
+ "+Hephaestus Arms!+ - When it comes to +personal protection+, +nobody+ does it +better+.",
+ "+Hephaestus Arms!+ - Peace through +Superior Firepower+.",
+ "+Hephaestus Arms!+ - Don't be caught +firing blanks+."
)
ship_prefixes = list("HCV" = "a general operations", "HTV" = "a freight", "HLV" = "a munitions resupply", "HDV" = "an asset protection", "HDV" = "a preemptive deployment")
//War God Theme, updated
@@ -503,7 +504,7 @@
and everything in between. Their equipment tends to be top-of-the-line, most obviously shown by their incredibly \
human-like FBP designs. Vey's rise to stardom came from their introduction of resurrective cloning, although in \
recent years they've been forced to diversify as their patents expired and NanoTrasen-made medications became \
- essential to modern cloning. \
+ essential to modern cloning and resleeving procedures. \
\
For reasons known only to the board, Vey-Med's ship names seem to follow the same naming pattern as the Dionae use."
history = ""
@@ -719,7 +720,8 @@
slogans = list(
"Bishop Cybernetics - only the best in personal augmentation.",
"Bishop Cybernetics - why settle for flesh when you can have metal?",
- "Bishop Cybernetics - make a statement."
+ "Bishop Cybernetics - make a statement.",
+ "Bishop Cybernetics - embrace the purity of the machine."
)
ship_prefixes = list("BCV" = "a general operations", "BCTV" = "a transportation", "BCSV" = "a research exchange")
//famous mechanical engineers
@@ -957,6 +959,7 @@
slogans = list(
"The FTU. We look out for the little guy.",
"There's no Trade like Free Trade.",
+ "There's no Union like the Free Trade Union.",
"Join the Free Trade Union. Because anything worth doing, is worth doing for money." //rule of acquisition #13
)
ship_prefixes = list("FTV" = "a general operations", "FTRP" = "a trade protection", "FTRR" = "a piracy suppression", "FTLV" = "a logistical support", "FTTV" = "a mercantile", "FTDV" = "a market establishment")
@@ -1333,6 +1336,7 @@
slogans = list(
"Oculum - All News, All The Time.",
"Oculum - We Keep An Eye Out.",
+ "Oculum - Nothing But The Truth.",
"Oculum - Your Eye On The Galaxy."
)
ship_prefixes = list("OBV" = "an investigation", "OBV" = "a distribution", "OBV" = "a journalism", "OBV" = "a general operations")
@@ -1354,7 +1358,9 @@
slogans = list(
"Centauri Provisions Bread Tubes - They're Not Just Edible, They're |Breadible!|",
"Centauri Provisions SkrellSnax - Not |Just| For Skrell!",
- "Centauri Provisions Space Mountain Wind - It'll Take Your |Breath| Away!"
+ "Centauri Provisions Space Mountain Wind - It'll Take Your |Breath| Away!",
+ "Centauri Provisions Syndi-Cakes - A Taste So Good You'll Swear It's |Illegal|!",
+ "Centauri Provisions Tuna Snax - There's Nothing |Fishy| Going On Here!"
)
ship_prefixes = list("CPTV" = "a transport", "CPCV" = "a catering", "CPRV" = "a resupply", "CPV" = "a general operations")
destination_names = list(
@@ -1620,7 +1626,7 @@
"Vampir",
"Wendigo",
"Werewolf",
- "Wraith"
+ "Wraith"
)
destination_names = list (
"Chimera HQ, Titan",
@@ -2186,23 +2192,40 @@
org_type = "pirate"
ship_prefixes = list("Ue-Katish pirate" = "a raiding", "Ue-Katish bandit" = "a raiding", "Ue-Katish raider" = "a raiding", "Ue-Katish enforcer" = "an enforcement")
- ship_names = list(
- "Keqxuer'xeu's Prize",
- "Xaeker'qux' Bounty",
- "Teq'ker'qerr's Mercy",
- "Ke'teq's Thunder",
- "Xumxerr's Compass",
- "Xue'qux' Greed",
- "Xaexuer's Slave",
- "Xue'taq's Dagger",
- "Teqxae's Madness",
- "Taeqtaq'kea's Pride",
- "Keqxae'xeu's Saber",
- "Xueaeq's Disgrace",
- "Xum'taq'qux' Star",
- "Ke'xae'xe's Scream",
- "Keq'keax' Blade"
+ ship_names = list()
+
+/datum/lore/organization/other/uekatish/New()
+ ..()
+ var/i = 20 //give us twenty random names
+ var/list/first_names = file2list('config/names/first_name_skrell.txt')
+ var/list/words = list(
+ "Prize",
+ "Bounty",
+ "Treasure",
+ "Pearl",
+ "Star",
+ "Mercy",
+ "Compass",
+ "Greed",
+ "Slave",
+ "Madness",
+ "Pride",
+ "Disgrace",
+ "Judgement",
+ "Wrath",
+ "Hatred",
+ "Vengeance",
+ "Fury",
+ "Thunder",
+ "Scream",
+ "Dagger",
+ "Saber",
+ "Lance",
+ "Blade"
)
+ while(i)
+ ship_names.Add("[pick(first_names)] [pick(words)]")
+ i--
/datum/lore/organization/other/marauders
name = "Vox Marauders"
@@ -2222,12 +2245,7 @@
org_type = "pirate"
ship_prefixes = list("vox marauder" = "a marauding", "vox raider" = "a raiding", "vox ravager" = "a raiding", "vox corsair" = "a raiding") //as assigned by control, second part shouldn't even come up
//blank out our shipnames for redesignation
- ship_names = list(
- )
- /*
- destination_names = list(
- )
- */
+ ship_names = list()
/datum/lore/organization/other/marauders/New()
..()
@@ -2635,26 +2653,7 @@
//the tesh expeditionary fleet's closest analogue in modern terms would be the US Army Corps of Engineers, just with added combat personnel as well
ship_prefixes = list("TEF" = "a diplomatic", "TEF" = "a peacekeeping", "TEF" = "an escort", "TEF" = "an exploration", "TEF" = "a survey", "TEF" = "an expeditionary", "TEF" = "a pioneering")
//TODO: better ship names? I just took a bunch of random teshnames from the Random Name button and added a word.
- ship_names = list(
- "Leniri's Hope",
- "Tatani's Venture",
- "Ninai's Voyage",
- "Miiescha's Claw",
- "Ishena's Talons",
- "Lili's Fang",
- "Taalische's Wing",
- "Cami's Pride",
- "Schemisa's Glory",
- "Shilirashi's Wit",
- "Sanene's Insight",
- "Aeimi's Wisdom",
- "Ischica's Mind",
- "Recite's Cry",
- "Leseca's Howl",
- "Iisi's Fury",
- "Simascha's Revenge",
- "Lisascheca's Vengeance"
- )
+ ship_names = list()
destination_names = list(
"an Expeditionary Fleet RV point",
"an Expeditionary Fleet Resupply Ship",
@@ -2665,14 +2664,59 @@
"Expeditionary Fleet HQ"
)
+/datum/lore/organization/gov/teshari/New()
+ ..()
+ var/i = 20 //give us twenty random names
+ var/list/first_names = list(
+ "Leniri's",
+ "Tatani's",
+ "Ninai's",
+ "Miiescha's",
+ "Ishena's",
+ "Taalische's",
+ "Cami's",
+ "Schemisa's",
+ "Shilirashi's",
+ "Sanene's",
+ "Aeimi's",
+ "Ischica's",
+ "Shasche's",
+ "Leseca's",
+ "Iisi's",
+ "Simascha's",
+ "Lisascheca's"
+ )
+ var/list/words = list(
+ "Hope",
+ "Venture",
+ "Voyage",
+ "Talons",
+ "Fang",
+ "Wing",
+ "Pride",
+ "Glory",
+ "Wit",
+ "Insight",
+ "Wisdom",
+ "Mind",
+ "Cry",
+ "Howl",
+ "Fury",
+ "Revenge",
+ "Vengeance"
+ )
+ while(i)
+ ship_names.Add("[pick(first_names)] [pick(words)]")
+ i--
+
/datum/lore/organization/gov/altevian_hegemony
- name = "The Altevian Hegemony"
+ name = "The Altevian Hegemony"
short_name = "Altevian Hegemony "
acronym = "AH"
desc = "The Altevians are a space-faring race of rodents that resemble Earth-like rats. \
They do not have a place they call home in terms of a planet, and instead have massive multiple-kilometer-long colony-ships \
- that are constantly on the move and typically keep operations outside of known populated systems to not eat the resources from others. \
- Their primary focus is trade and slavage operations and can be expected to be seen around both densely populated and empty systems for their work."
+ that are constantly on the move and typically keep operations outside of known populated systems to minimize potential conflicts over resources. \
+ Their primary focus is trade and salvage operations, and their ships can be expected to be seen around both densely populated and empty systems for their work."
history = ""
work = "salvage and trade operators"
headquarters = "AH-CV Migrant"
diff --git a/code/modules/casino/boxes_casino.dm b/code/modules/casino/boxes_casino.dm
index 3b4c548056..136ff9ba03 100644
--- a/code/modules/casino/boxes_casino.dm
+++ b/code/modules/casino/boxes_casino.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/storage/box/casino
name = "prize box"
- desc = "It's a lovely golden tinted cardboard box, maybe theres something valuable inside?"
+ desc = "It's a lovely golden tinted cardboard box, maybe there's something valuable inside?"
icon = 'icons/obj/casino.dmi'
icon_state = "casino_box"
@@ -91,4 +91,4 @@
/obj/item/roulette_ball/cheat/black,
/obj/item/roulette_ball/cheat/zeros,
/obj/item/roulette_ball/cheat/odd,
- /obj/item/roulette_ball/cheat/even)
\ No newline at end of file
+ /obj/item/roulette_ball/cheat/even)
diff --git a/code/modules/casino/casino_book.dm b/code/modules/casino/casino_book.dm
index f02a53abd0..84cd8197ee 100644
--- a/code/modules/casino/casino_book.dm
+++ b/code/modules/casino/casino_book.dm
@@ -45,7 +45,7 @@
The values of cards are as follow:
- Ace - 1 or 11, can be freely decided at any moment
- - 2 - 10 - value coresponding to their number
+ - 2 - 10 - value corresponding to their number
- All face cards excluding joker - Value of 10
A game of blackjack begins with the dealer giving the gambler two cards, in normal blackjack all cards dealt to gambler and dealer are always shown. The two cards dealt have their values put together, the gambler has three choices, stand, hit, or double down.
@@ -60,17 +60,17 @@
Hard 17 - They dealer must stop if they get a value of 17.
The casino who supplies this version of the manual follows the rule of hard 17.
- The game ends when the dealer busts, reaches the threshold of what they are allowed to draw, or if they get a higher value than the gambler. Again, the one who has the highest value that isnt higher than 21 wins, but if both has the same value no one wins and the bet goes back to the gambler.
- And thats it! Now go out there and gamble your savings away! This casino allows bets between 5 and 50 with double down ignoring that limit!
+ The game ends when the dealer busts, reaches the threshold of what they are allowed to draw, or if they get a higher value than the gambler. Again, the one who has the highest value that isn't higher than 21 wins, but if both has the same value no one wins and the bet goes back to the gambler.
+ And that's it! Now go out there and gamble your savings away! This casino allows bets between 5 and 50 with double down ignoring that limit!
- But wait! Theres more! Theres also group blackjack! This game is a little different, the dealer can be part of it or simple deal for players, this game works differently with everyone keeping their hands hidden, everyone makes initial bets, gets two facedown cards, then its a matter of trying to get as good a hand as possible, but if you go bust, its over. But dont tell or show until everyone reveals! If youre going down, its best if youre opponents dont know they simply can play safe and win, if youre lucky everyone else gets themselves busted and you dont lose your beloved chips!
- Its kinda like texas hold em in a way, everyone draws, folks can raise bets or fold, then draw more. Rinse and repeat until no one wants to raise any more nor draw cards, if everyone except one person has folded, they win by default even if they have busted, cause they dont need to reveal their hand that game, so you can choose to either sit and wait and fold if someone raise the bets, or you can gamble and make it look like you have an amazing hand and win by default since everyone else folds and no one is wise that you had a bust! This game has turned from simple probability and chance against the dealer to a game of risk and deception, fun fun fun!
+ But wait! There's more! There's also group blackjack! This game is a little different, the dealer can be part of it or simple deal for players, this game works differently with everyone keeping their hands hidden, everyone makes initial bets, gets two facedown cards, then its a matter of trying to get as good a hand as possible, but if you go bust, its over. But don't tell or show until everyone reveals! If your going down, its best if your opponents don't know they simply can play safe and win, if you're lucky everyone else gets themselves busted and you don't lose your beloved chips!
+ Its kinda like Texas hold em in a way, everyone draws, folks can raise bets or fold, then draw more. Rinse and repeat until no one wants to raise any more nor draw cards, if everyone except one person has folded, they win by default even if they have busted, cause they don't need to reveal their hand that game, so you can choose to either sit and wait and fold if someone raise the bets, or you can gamble and make it look like you have an amazing hand and win by default since everyone else folds and no one is wise that you had a bust! This game has turned from simple probability and chance against the dealer to a game of risk and deception, fun fun fun!
So this game of roulette is all about chance! what happens is that people bet on different odds and hope for the best as the dealer rolls the ball and makes that roulette thingy make than fun addicting spin! Once it lands on a number between 0 and 36 its either bust or payout! Pretty simple, right?
Everyone starts by putting their bets down, people can bet more than once before the ball goes rolling, the odds and their payoffs are these:
- - Single number - 35/1 payoff - The most unlikely one to get, but if the ball lands on your number, then youre loaded!
+ - Single number - 35/1 payoff - The most unlikely one to get, but if the ball lands on your number, then you're loaded!
- Split Number - 17/1 - Choose an interval of 2, not very likely and therefore big reward!
- Row - 11/1 - Choose an interval of 3, more likely so not the biggest outcome!
- Split - 8/1 - Choose an interval of 4, not gonna win big time.
@@ -78,19 +78,19 @@
- Column - 2/1 - Choose an interval of 12, boring, but likely.
- Red/Black or even/odd numbers - 1/1 - Odd or even numbers explains themselves. Red numbers are from 0 to 11 and 18 to 29 while the rest is black. These are the safest bets there are!
- Theres not much more to it! Bets made, ball rolls, number announced, people win, people lose! Bets allowed here are from 1 to 25 per bet. Oh, im also being told this casino has the fancy rule that if ball lands on 0, one wins at least one bet no matter what it is! So lets hope you got that big bet on a single number!
+ There's not much more to it! Bets made, ball rolls, number announced, people win, people lose! Bets allowed here are from 1 to 25 per bet. Oh, I'm also being told this casino has the fancy rule that if ball lands on 0, one wins at least one bet no matter what it is! So lets hope you got that big bet on a single number!
- Aaah yes, good old poker. This casino runs by the rules of texas hold em, though the might be a little modified to be simpler for the average joe. In a game of poker it can be a single gambler and a dealer against each other, but most often its the dealer making the game proceed while several gamblers fights tooth and nail to steal each others chips, but the dealer can still join in on the free for all if they so wish!
+ Aaah yes, good old poker. This casino runs by the rules of Texas hold em, though the might be a little modified to be simpler for the average joe. In a game of poker it can be a single gambler and a dealer against each other, but most often its the dealer making the game proceed while several gamblers fights tooth and nail to steal each others chips, but the dealer can still join in on the free for all if they so wish!
To simply explain the game, people gamble with each other, a game of trying to get the best hand and raise bets or back out depending on what the outcome may be. The game starts with everyone betting a certain amount, it can be 5 or 10 chips depending on dealer, but if one wants to join, there needs to be chips on that table! Once everyone has made their initial bet, everyone gets two cards face down, these are kept hidden, no one not even dealer gets to see players cards until the end, not even folded cards are to be shown unless wanted to, sometimes its better making people unsure if you dropped out with bad cards or if you have other motives, deception is a large part of this game!
- With everyone having cards dealt, its time for the dealer to lay three on the table face up, these cards are 3 of 5 cards in the community pool, everyone can use these cards to make sets like pairs and such, this doesnt mean they are taken, multiple people can use the same community card for their own sets!
- With the community having three we enter the second betting stage, here people have two options, standing or raising. Standing means you dont want to raise, raising explains itself, though if someone bets, people have three options, commit putting the chips in to risk as much as the raised bet, but if one doesnt have enough, then they can still go all in with their remaining chips, one can also drop out if its too risky, the chips bet will remain on the table, but at least you wont lose more eh? Final one is to raise further, sometimes people can dare each other to raise more, but its not allowed for someone to raise, then raise further if no one else raises after them!
+ With everyone having cards dealt, its time for the dealer to lay three on the table face up, these cards are 3 of 5 cards in the community pool, everyone can use these cards to make sets like pairs and such, this doesn't mean they are taken, multiple people can use the same community card for their own sets!
+ With the community having three we enter the second betting stage, here people have two options, standing or raising. Standing means you don't want to raise, raising explains itself, though if someone bets, people have three options, commit putting the chips in to risk as much as the raised bet, but if one doesn't have enough, then they can still go all in with their remaining chips, one can also drop out if its too risky, the chips bet will remain on the table, but at least you wont lose more eh? Final one is to raise further, sometimes people can dare each other to raise more, but its not allowed for someone to raise, then raise further if no one else raises after them!
As said earlier, we got like a community pool of 5 cards total, this time another card is revealed and we enter a new betting phase, then the final fifth card is revealed and final bets are made, and then the cards are revealed so it can be determined who has the best hand! If two or more have equally good sets, then the chips are split evenly between them.
- But notice, if someone is left because everyone else didnt dare to raise with their bet, they can decide to not reveal their hand, they might have had a winning hand, or maybe its terrible and they just bluffed their way to victory, only they know and can decide if they want to expose their cards to gloat or confuse their opponents. So in summary, the game can be simple, but hard to master!
+ But notice, if someone is left because everyone else didn't dare to raise with their bet, they can decide to not reveal their hand, they might have had a winning hand, or maybe its terrible and they just bluffed their way to victory, only they know and can decide if they want to expose their cards to gloat or confuse their opponents. So in summary, the game can be simple, but hard to master!
And here is the order of winning hands folks!
- Royal flush - The big and best one, this is a set of a 10, Ace, Knave/Jack, Queen and King of the same suit.
- - Straight flush - This one is also definently a winner, though can be easier to get as it just needs to be five cards making a sraight of the same suit, an example being black 3 to 7.
+ - Straight flush - This one is also definitely a winner, though can be easier to get as it just needs to be five cards making a straight of the same suit, an example being black 3 to 7.
- Four of a kind - Nice one, if you get this then you got a good chance to win. The value of the cards determine who wins, so ace is the best followed by king, queen and jack, then the peasant number cards!
- Full House - This one is good, but it requires you have three of a kind and a two of a kind, obviously value is part of the house, so the best roof is made of Ace with king making a strong foundation!
- Flush - This one requires the gambler to have 5 cards of a suit, not in any order, but the highest value card determines worth, so hope you got an Ace in your combo!
@@ -98,22 +98,22 @@
- Three of a kind - Explains itself well enough, get three together and you got something going, lets hope you can build a house!
- Two pairs - You almost got yourself a house! But at least at this point its something!
- A pair - The worst set you can get, but you might be extremely lucky and have this while others have an inferior pair or the worst possible hand ever which is...
- - High card - The absolute worst, if you cant get any of those sets, then you got this sad case, if a game mananages to end with no one getting a set, then the one with the highest value cards wins!
+ - High card - The absolute worst, if you cant get any of those sets, then you got this sad case, if a game manages to end with no one getting a set, then the one with the highest value cards wins!
- Wew, what a long lesson, but thats how one does the Texas hold em here at this casino, hope you guys have fun winning and losing your hard earned cash with this one!
+ Wew, what a long lesson, but that's how one does the Texas hold em here at this casino, hope you guys have fun winning and losing your hard earned cash with this one!
So hear this, NT is now sponsoring team building at the casino, so folks who wants to just relax with friends, play some games, earn chips with no risk, even the ones broke can join in on a fun game of Cards against the galaxy and have fun!
The idea is that once a round has concluded and a casino member is present to see the game being actually played, everyone gets 10 chips while the one who won the round gets 25 instead! Interested? Good! Its easy and simple to play and very fun and vulgar!
- The game is best played with at least 4 players and starts with everyone drawing 7 white cards, the person who most recently pooped starts as the 'card czar', but folks can agree on another criteria for the czar or simply pick one. Each round the current card czar draws a black card that has text written on it and blank lines, everyone aside from the czar takes a white card from their hand for every blank line which they find funny in that sentence and puts on the table face down with the others. The card czar cant know who has which white card and simply reads the black card with the white ones, the most funniest combination is choosen by the czar and the one who made that combination is the current rounds winner and the next rounds czar. At the end of each round everyone makes sure to draw enough white card to have 7 on hand and if theres a casino staff member playing or watching, they note down or hand out chips for everyone, and if they are playing, they get to add chips to their own personal stockpile too!
- Thats it for cards against the galaxy! Simple, fun and vulgar, whats there not to love?
+ The game is best played with at least 4 players and starts with everyone drawing 7 white cards, the person who most recently pooped starts as the 'card czar', but folks can agree on another criteria for the czar or simply pick one. Each round the current card czar draws a black card that has text written on it and blank lines, everyone aside from the czar takes a white card from their hand for every blank line which they find funny in that sentence and puts on the table face down with the others. The card czar cant know who has which white card and simply reads the black card with the white ones, the most funniest combination is chosen by the czar and the one who made that combination is the current rounds winner and the next rounds czar. At the end of each round everyone makes sure to draw enough white card to have 7 on hand and if there's a casino staff member playing or watching, they note down or hand out chips for everyone, and if they are playing, they get to add chips to their own personal stockpile too!
+ That's it for cards against the galaxy! Simple, fun and vulgar, what's there not to love?
- Hey folks, welcome to the prize section! This part is definently important for you folks operating the prize booth! First off I wanna tell you some great news! Nanotransen has gone along with a nice deal that allows crew to occasionally keep their hard earned rewards on station for a limited time, now you can enjoy your new fancy toolbelt or bluespace beaker for more than just the shift where the casino comes around!
+ Hey folks, welcome to the prize section! This part is definitely important for you folks operating the prize booth! First off I wanna tell you some great news! Nanotransen has gone along with a nice deal that allows crew to occasionally keep their hard earned rewards on station for a limited time, now you can enjoy your new fancy toolbelt or bluespace beaker for more than just the shift where the casino comes around!
((Be aware, there can be limitations on how many rewards you get to keep after the shift, it might be unfair if some shows up and wins one thing, while they watch as command staff crew with high background income as well as hyperactive miners walks home with 20 prizes they get to enjoy while having almost done no gambling at all.))
Lets get to the prizes and exchange rate before we get started on the stuff specifically for the booth operators, so heres the current prizes one can win and their costs! Be aware there might be new prizes or absent ones from time to time!
@@ -127,9 +127,9 @@
This section was outdated, someone better write it.
- Thats it for prizes!
+ That's it for prizes!
- Now comes the part for the both operators, you got a very important job, it has a lot of responsibility, so it means that you gotta put that first before your own fun, cause unless you do it, a lot of folks are gonna be left sad and dissappointed they cant get any goodies! But the process is simple and can be quick, someone comes to you, they want some chips, or thalers back or a prize, you simply check this nice guide above to determine cost and ask for the amount of thalers or chips needed, if its a prize, then you follow this procedure:
+ Now comes the part for the both operators, you got a very important job, it has a lot of responsibility, so it means that you gotta put that first before your own fun, cause unless you do it, a lot of folks are gonna be left sad and disappointed they cant get any goodies! But the process is simple and can be quick, someone comes to you, they want some chips, or thalers back or a prize, you simply check this nice guide above to determine cost and ask for the amount of thalers or chips needed, if its a prize, then you follow this procedure:
- First get the thalers or chips for payment.
- Before giving the prize you take out your prize winner folder and a piece of paper, this paper will be named after the one getting the reward and will have further prizes noted down into it, so make sure its safe in that folder!
@@ -137,18 +137,18 @@
- Once written down, you just put the paper back in the folder and hand over the prize!
((When shift is nearing its end you pray to staff or DM the one responsible for the event, they will get the folder and copy paste all the reward info before shift is over and ensure people get their rewards. This is a very important job and we understand it might not be so fun being restricted during an event, but just like the rest of volunteer staff, you get rewarded with guaranteed prizes to enjoy after the shift for being a big help!))
- ((This gets to the sour part, cheating and giving others and yourself free prizes and/or chips is absolutely forbidden, this has OOC consequences and will likely blacklist you from being important roles in future events. Though dont fear getting punished even if you havent done anything wrong, we will rather let cheaters slip than let honest players get wrongfully punished!))
+ ((This gets to the sour part, cheating and giving others and yourself free prizes and/or chips is absolutely forbidden, this has OOC consequences and will likely blacklist you from being important roles in future events. Though don't fear getting punished even if you haven't done anything wrong, we will rather let cheaters slip than let honest players get wrongfully punished!))
Goodness me this is quite the casino huh? Who would have thought one could win other people as a prize? Well you can do just about anything you want with them! Be it just company, some less children friendly company, heck you can even eat them or make them eat you! The options and possibilities are quite frankly limitless!
Now you might ask, how does one get these fancy prizes? Well they can be obtained by checking in at the exchange both and see the list of prizes, there might be none, there might be many, it depends on volunteers and losers! This brings us first to volunteers and then to losers!
Volunteering is simple! Anyone can walk up to the booth and ask to be a sentient prize, what this means is that you get a nice sum of 150 chips for you to do whatever you want, but someone might come at any point and claim you!
- Losers are obtained differently, if youre completly busted and have nothing left, you become a prize that the one you lost to can do whatever they want with, this means both gamblers and dealers can end up as a prize, though if for whatever reason you dont become their prize, you get added to the list for someone else to enjoy. Becoming a prize means you also get 100 chips in compensation!
+ Losers are obtained differently, if you're completely busted and have nothing left, you become a prize that the one you lost to can do whatever they want with, this means both gamblers and dealers can end up as a prize, though if for whatever reason you don't become their prize, you get added to the list for someone else to enjoy. Becoming a prize means you also get 100 chips in compensation!
- Now hear this! The casino has decided that to spice things up, folks can bet themselves at any time and arent already a prize on the list! Doesnt matter if youre rich or broke, playing blackjack or roulette, you can bet yourself in any game and youre worth 250 chips! But be careful, cause if you lose, youre the winners prize! They can keep you, give you to someone else. or to the prize booth and get the chips you would have gotten as volunteer! But if given to the booth, the winner cant buy their prize back for the lower cost!
+ Now hear this! The casino has decided that to spice things up, folks can bet themselves at any time and aren't already a prize on the list! Doesn't matter if you're rich or broke, playing blackjack or roulette, you can bet yourself in any game and you're worth 250 chips! But be careful, cause if you lose, you're the winners prize! They can keep you, give you to someone else. or to the prize booth and get the chips you would have gotten as volunteer! But if given to the booth, the winner cant buy their prize back for the lower cost!
- ((Sour part again, but very important. These sentient prizes can be fun, but one thing always dictates how these things goes down, preferences and ooc wants. If preferences dont line up and people dont agree to do winner/loser scene it becomes sentient prize on list. And someone cant win a prize if the prize ooc doesnt want to do what the winner wants to do. We still wish people to try and reach out and try things with new people and/or new things they are comfortable doing, but never shall anyone be forced into a situation they dont want!))
+ ((Sour part again, but very important. These sentient prizes can be fun, but one thing always dictates how these things goes down, preferences and ooc wants. If preferences don't line up and people don't agree to do winner/loser scene it becomes sentient prize on list. And someone cant win a prize if the prize ooc doesn't want to do what the winner wants to do. We still wish people to try and reach out and try things with new people and/or new things they are comfortable doing, but never shall anyone be forced into a situation they don't want!))