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/__outdated_compatibility.dm b/code/__defines/__outdated_compatibility.dm deleted file mode 100644 index 764fde7887..0000000000 --- a/code/__defines/__outdated_compatibility.dm +++ /dev/null @@ -1,8 +0,0 @@ -//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 \ No newline at end of file diff --git a/code/__defines/is_helpers.dm b/code/__defines/is_helpers.dm index 0fbcd3c719..dfb8b9246a 100644 --- a/code/__defines/is_helpers.dm +++ b/code/__defines/is_helpers.dm @@ -1,6 +1,6 @@ #define isdatum(D) istype(D, /datum) -#define isweakref(A) istype(A, /weakref) +#define isweakref(A) istype(A, /datum/weakref) //#define islist(D) istype(D, /list) //Built in diff --git a/code/__defines/math.dm b/code/__defines/math.dm index 2053b762d2..7b5fcd8c7a 100644 --- a/code/__defines/math.dm +++ b/code/__defines/math.dm @@ -16,6 +16,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/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/__defines/vv.dm b/code/__defines/vv.dm index 70ae1ff035..977a282d60 100644 --- a/code/__defines/vv.dm +++ b/code/__defines/vv.dm @@ -55,3 +55,5 @@ // /atom #define VV_HK_ATOM_EXPLODE "turf_explode" #define VV_HK_ATOM_EMP "turf_emp" + +#define VV_HK_WEAKREF_RESOLVE "weakref_resolve" diff --git a/code/_global_vars/lists/misc.dm b/code/_global_vars/lists/misc.dm index 97cc3753a1..5fb7fadce2 100644 --- a/code/_global_vars/lists/misc.dm +++ b/code/_global_vars/lists/misc.dm @@ -9,5 +9,5 @@ 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")) GLOBAL_LIST_EMPTY(crafting_recipes) //list of all table craft recipes 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 96d64aa387..29e091ab26 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -541,7 +541,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 ec831d8c5f..31970b792f 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,15 +384,15 @@ GLOBAL_LIST_EMPTY(icon_state_lists) 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 + 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/weakref/WR = weakref(A) + var/datum/weakref/WR = WEAKREF(A) return GLOB.cached_examine_icons[WR] -/proc/uncache_examine_icon(var/weakref/WR) +/proc/uncache_examine_icon(var/datum/weakref/WR) GLOB.cached_examine_icons -= WR /proc/adjust_brightness(var/color, var/value) diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index 71ef606a85..b8071268b6 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -1,193 +1,169 @@ -#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() - var/global/time_offset = 0 - var/global/last_time = 0 - var/global/last_usage = 0 - - var/wtime = world.time - var/wusage = TICK_USAGE * 0.01 - - if(last_time < wtime && last_usage > 1) - time_offset += last_usage - 1 - - last_time = wtime - last_usage = wusage - - return wtime + (time_offset + wusage) * world.tick_lag - -GLOBAL_VAR_INIT(roundstart_hour, pick(2,7,12,17)) -var/station_date = "" -var/next_station_date_change = 1 DAY - -#define duration2stationtime(time) time2text(station_time_in_ds + time, "hh:mm") -#define roundstart_delay_time (world.time - round_duration_in_ds) -#define world_time_in_ds(time) (GLOB.roundstart_hour HOURS + time - roundstart_delay_time) -#define round_duration_in_ds (GLOB.round_start_time ? REALTIMEOFDAY - GLOB.round_start_time : 0) -#define station_time_in_ds (GLOB.roundstart_hour HOURS + round_duration_in_ds) - -/proc/stationtime2text() - return time2text(station_time_in_ds + GLOB.timezoneOffset, "hh:mm") - -/proc/worldtime2stationtime(time) - return time2text(world_time_in_ds(time) + GLOB.timezoneOffset, "hh:mm") - -/proc/stationdate2text() - var/update_time = FALSE - if(station_time_in_ds > next_station_date_change) - next_station_date_change += 1 DAY - update_time = TRUE - if(!station_date || update_time) - station_date = num2text((text2num(time2text(REALTIMEOFDAY, "YYYY"))+544)) + "-" + time2text(REALTIMEOFDAY, "MM-DD") //YW EDIT - return station_date - -//ISO 8601 -/proc/time_stamp() - var/date_portion = time2text(world.timeofday, "YYYY-MM-DD") - var/time_portion = time2text(world.timeofday, "hh:mm:ss") - return "[date_portion]T[time_portion]" - -/proc/get_timezone_offset() - var/midnight_gmt_here = text2num(time2text(0,"hh")) * 36000 - if(midnight_gmt_here > 12 HOURS) - return 24 HOURS - midnight_gmt_here - else - return midnight_gmt_here - -/proc/gameTimestamp(format = "hh:mm:ss", wtime=null) - if(!wtime) - wtime = world.time - return time2text(wtime - GLOB.timezoneOffset, format) - -/* Returns 1 if it is the selected month and day */ -/proc/isDay(var/month, var/day) - if(isnum(month) && isnum(day)) - var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month - var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day - if(month == MM && day == DD) - return 1 - - // Uncomment this out when debugging! - //else - //return 1 - -var/next_duration_update = 0 -var/last_round_duration = 0 -GLOBAL_VAR_INIT(round_start_time, 0) - -/hook/roundstart/proc/start_timer() - GLOB.round_start_time = REALTIMEOFDAY - return 1 - -/proc/roundduration2text() - if(!GLOB.round_start_time) - return "00:00" - if(last_round_duration && world.time < next_duration_update) - return last_round_duration - - var/mills = round_duration_in_ds // 1/10 of a second, not real milliseconds but whatever - //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something - var/mins = round((mills % 36000) / 600) - var/hours = round(mills / 36000) - - mins = mins < 10 ? add_zero(mins, 1) : mins - hours = hours < 10 ? add_zero(hours, 1) : hours - - last_round_duration = "[hours]:[mins]" - next_duration_update = world.time + 1 MINUTES - return last_round_duration - -/var/midnight_rollovers = 0 -/var/rollovercheck_last_timeofday = 0 -/var/rollover_safety_date = 0 // set in world/New to the server startup day-of-month -/proc/update_midnight_rollover() - // Day has wrapped (world.timeofday drops to 0 at the start of each real day) - if (world.timeofday < rollovercheck_last_timeofday) - // If the day started/last wrap was < 12 hours ago, this is spurious - if(rollover_safety_date < world.realtime - (12 HOURS)) - midnight_rollovers++ - rollover_safety_date = world.realtime - else - warning("Time rollover error: world.timeofday decreased from previous check, but the day or last rollover is less than 12 hours old. System clock?") - rollovercheck_last_timeofday = world.timeofday - return midnight_rollovers - -//Increases delay as the server gets more overloaded, -//as sleeps aren't cheap and sleeping only to wake up and sleep again is wasteful -#define DELTA_CALC max(((max(TICK_USAGE, world.cpu) / 100) * max(Master.sleep_delta-1,1)), 1) - -//returns the number of ticks slept -/proc/stoplag(initial_delay) - if (!Master || !(Master.current_runlevel & RUNLEVELS_DEFAULT)) - sleep(world.tick_lag) - return 1 - if (!initial_delay) - initial_delay = world.tick_lag - . = 0 - var/i = DS2TICKS(initial_delay) - do - . += CEILING(i*DELTA_CALC, 1) - sleep(i*world.tick_lag*DELTA_CALC) - i *= 2 - while (TICK_USAGE > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) - -#undef DELTA_CALC - - -//Takes a value of time in deciseconds. -//Returns a text value of that number in hours, minutes, or seconds. -/proc/DisplayTimeText(time_value, round_seconds_to = 0.1) - var/second = round(time_value * 0.1, round_seconds_to) - if(!second) - return "right now" - if(second < 60) - return "[second] second[(second != 1)? "s":""]" - var/minute = FLOOR(second / 60, 1) - second = MODULUS(second, 60) - var/secondT - if(second) - secondT = " and [second] second[(second != 1)? "s":""]" - if(minute < 60) - return "[minute] minute[(minute != 1)? "s":""][secondT]" - var/hour = FLOOR(minute / 60, 1) - minute = MODULUS(minute, 60) - var/minuteT - if(minute) - minuteT = " and [minute] minute[(minute != 1)? "s":""]" - if(hour < 24) - return "[hour] hour[(hour != 1)? "s":""][minuteT][secondT]" - var/day = FLOOR(hour / 24, 1) - hour = MODULUS(hour, 24) - var/hourT - if(hour) - hourT = " and [hour] hour[(hour != 1)? "s":""]" - return "[day] day[(day != 1)? "s":""][hourT][minuteT][secondT]" +#define TimeOfGame (get_game_time()) +#define TimeOfTick (TICK_USAGE*0.01*world.tick_lag) + +#define DS2NEARESTTICK(DS) TICKS2DS(-round(-(DS2TICKS(DS)))) + +var/world_startup_time + +/proc/get_game_time() + var/global/time_offset = 0 + var/global/last_time = 0 + var/global/last_usage = 0 + + var/wtime = world.time + var/wusage = TICK_USAGE * 0.01 + + if(last_time < wtime && last_usage > 1) + time_offset += last_usage - 1 + + last_time = wtime + last_usage = wusage + + return wtime + (time_offset + wusage) * world.tick_lag + +GLOBAL_VAR_INIT(roundstart_hour, pick(2,7,12,17)) +var/station_date = "" +var/next_station_date_change = 1 DAY + +#define duration2stationtime(time) time2text(station_time_in_ds + time, "hh:mm") +#define roundstart_delay_time (world.time - round_duration_in_ds) +#define world_time_in_ds(time) (GLOB.roundstart_hour HOURS + time - roundstart_delay_time) +#define round_duration_in_ds (GLOB.round_start_time ? REALTIMEOFDAY - GLOB.round_start_time : 0) +#define station_time_in_ds (GLOB.roundstart_hour HOURS + round_duration_in_ds) + +/proc/stationtime2text() + return time2text(station_time_in_ds + GLOB.timezoneOffset, "hh:mm") + +/proc/worldtime2stationtime(time) + return time2text(world_time_in_ds(time) + GLOB.timezoneOffset, "hh:mm") + +/proc/stationdate2text() + var/update_time = FALSE + if(station_time_in_ds > next_station_date_change) + next_station_date_change += 1 DAY + update_time = TRUE + if(!station_date || update_time) + station_date = num2text((text2num(time2text(REALTIMEOFDAY, "YYYY"))+544)) + "-" + time2text(REALTIMEOFDAY, "MM-DD") //YW EDIT + return station_date + +//ISO 8601 +/proc/time_stamp() + var/date_portion = time2text(world.timeofday, "YYYY-MM-DD") + var/time_portion = time2text(world.timeofday, "hh:mm:ss") + return "[date_portion]T[time_portion]" + +/proc/get_timezone_offset() + var/midnight_gmt_here = text2num(time2text(0,"hh")) * 36000 + if(midnight_gmt_here > 12 HOURS) + return 24 HOURS - midnight_gmt_here + else + return midnight_gmt_here + +/proc/gameTimestamp(format = "hh:mm:ss", wtime=null) + if(!wtime) + wtime = world.time + return time2text(wtime - GLOB.timezoneOffset, format) + +/* Returns 1 if it is the selected month and day */ +/proc/isDay(var/month, var/day) + if(isnum(month) && isnum(day)) + var/MM = text2num(time2text(world.timeofday, "MM")) // get the current month + var/DD = text2num(time2text(world.timeofday, "DD")) // get the current day + if(month == MM && day == DD) + return 1 + + // Uncomment this out when debugging! + //else + //return 1 + +var/next_duration_update = 0 +var/last_round_duration = 0 +GLOBAL_VAR_INIT(round_start_time, 0) + +/hook/roundstart/proc/start_timer() + GLOB.round_start_time = REALTIMEOFDAY + return 1 + +/proc/roundduration2text() + if(!GLOB.round_start_time) + return "00:00" + if(last_round_duration && world.time < next_duration_update) + return last_round_duration + + var/mills = round_duration_in_ds // 1/10 of a second, not real milliseconds but whatever + //var/secs = ((mills % 36000) % 600) / 10 //Not really needed, but I'll leave it here for refrence.. or something + var/mins = round((mills % 36000) / 600) + var/hours = round(mills / 36000) + + mins = mins < 10 ? add_zero(mins, 1) : mins + hours = hours < 10 ? add_zero(hours, 1) : hours + + last_round_duration = "[hours]:[mins]" + next_duration_update = world.time + 1 MINUTES + return last_round_duration + +/var/midnight_rollovers = 0 +/var/rollovercheck_last_timeofday = 0 +/var/rollover_safety_date = 0 // set in world/New to the server startup day-of-month +/proc/update_midnight_rollover() + // Day has wrapped (world.timeofday drops to 0 at the start of each real day) + if (world.timeofday < rollovercheck_last_timeofday) + // If the day started/last wrap was < 12 hours ago, this is spurious + if(rollover_safety_date < world.realtime - (12 HOURS)) + midnight_rollovers++ + rollover_safety_date = world.realtime + else + warning("Time rollover error: world.timeofday decreased from previous check, but the day or last rollover is less than 12 hours old. System clock?") + rollovercheck_last_timeofday = world.timeofday + return midnight_rollovers + +//Increases delay as the server gets more overloaded, +//as sleeps aren't cheap and sleeping only to wake up and sleep again is wasteful +#define DELTA_CALC max(((max(TICK_USAGE, world.cpu) / 100) * max(Master.sleep_delta-1,1)), 1) + +//returns the number of ticks slept +/proc/stoplag(initial_delay) + if (!Master || !(Master.current_runlevel & RUNLEVELS_DEFAULT)) + sleep(world.tick_lag) + return 1 + if (!initial_delay) + initial_delay = world.tick_lag + . = 0 + var/i = DS2TICKS(initial_delay) + do + . += CEILING(i*DELTA_CALC, 1) + sleep(i*world.tick_lag*DELTA_CALC) + i *= 2 + while (TICK_USAGE > min(TICK_LIMIT_TO_RUN, Master.current_ticklimit)) + +#undef DELTA_CALC + + +//Takes a value of time in deciseconds. +//Returns a text value of that number in hours, minutes, or seconds. +/proc/DisplayTimeText(time_value, round_seconds_to = 0.1) + var/second = round(time_value * 0.1, round_seconds_to) + if(!second) + return "right now" + if(second < 60) + return "[second] second[(second != 1)? "s":""]" + var/minute = FLOOR(second / 60, 1) + second = MODULUS(second, 60) + var/secondT + if(second) + secondT = " and [second] second[(second != 1)? "s":""]" + if(minute < 60) + return "[minute] minute[(minute != 1)? "s":""][secondT]" + var/hour = FLOOR(minute / 60, 1) + minute = MODULUS(minute, 60) + var/minuteT + if(minute) + minuteT = " and [minute] minute[(minute != 1)? "s":""]" + if(hour < 24) + return "[hour] hour[(hour != 1)? "s":""][minuteT][secondT]" + var/day = FLOOR(hour / 24, 1) + hour = MODULUS(hour, 24) + var/hourT + if(hour) + hourT = " and [hour] hour[(hour != 1)? "s":""]" + return "[day] day[(day != 1)? "s":""][hourT][minuteT][secondT]" diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index cb19ec6c51..a8dce670f5 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -626,7 +626,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. @@ -1350,9 +1350,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/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/lighting.dm b/code/controllers/subsystems/lighting.dm index f851e3edf2..522bab602b 100644 --- a/code/controllers/subsystems/lighting.dm +++ b/code/controllers/subsystems/lighting.dm @@ -30,60 +30,86 @@ SUBSYSTEM_DEF(lighting) MC_SPLIT_TICK_INIT(3) if(!init_tick_checks) MC_SPLIT_TICK + var/list/queue = sources_queue var/i = 0 - for (i in 1 to length(queue)) - var/datum/light_source/L = queue[i] + // UPDATE SOURCE QUEUE + queue = sources_queue + while(i < length(queue)) //we don't use for loop here because i cannot be changed during an iteration + i += 1 + + var/datum/light_source/L = queue[i] L.update_corners() - L.needs_update = LIGHTING_NO_UPDATE + if(!QDELETED(L)) + L.needs_update = LIGHTING_NO_UPDATE + else + i -= 1 // update_corners() has removed L from the list, move back so we don't overflow or skip the next element + // We unroll TICK_CHECK here so we can clear out the queue to ensure any removals/additions when sleeping don't fuck us if(init_tick_checks) - CHECK_TICK + if(!TICK_CHECK) + continue + queue.Cut(1, i + 1) + i = 0 + stoplag() else if (MC_TICK_CHECK) break if (i) - queue.Cut(1, i+1) + queue.Cut(1, i + 1) i = 0 if(!init_tick_checks) MC_SPLIT_TICK + // UPDATE CORNERS QUEUE queue = corners_queue - for (i in 1 to length(queue)) - var/datum/lighting_corner/C = queue[i] + while(i < length(queue)) //we don't use for loop here because i cannot be changed during an iteration + i += 1 + var/datum/lighting_corner/C = queue[i] C.needs_update = FALSE //update_objects() can call qdel if the corner is storing no data C.update_objects() - + + // We unroll TICK_CHECK here so we can clear out the queue to ensure any removals/additions when sleeping don't fuck us if(init_tick_checks) - CHECK_TICK + if(!TICK_CHECK) + continue + queue.Cut(1, i + 1) + i = 0 + stoplag() else if (MC_TICK_CHECK) break if (i) - queue.Cut(1, i+1) + queue.Cut(1, i + 1) i = 0 - if(!init_tick_checks) MC_SPLIT_TICK + // UPDATE OBJECTS QUEUE queue = objects_queue - for (i in 1 to length(queue)) - var/datum/lighting_object/O = queue[i] + while(i < length(queue)) //we don't use for loop here because i cannot be changed during an iteration + i += 1 + var/datum/lighting_object/O = queue[i] if (QDELETED(O)) continue - O.update() O.needs_update = FALSE + + // We unroll TICK_CHECK here so we can clear out the queue to ensure any removals/additions when sleeping don't fuck us if(init_tick_checks) - CHECK_TICK + if(!TICK_CHECK) + continue + queue.Cut(1, i + 1) + i = 0 + stoplag() else if (MC_TICK_CHECK) break if (i) - queue.Cut(1, i+1) + queue.Cut(1, i + 1) /datum/controller/subsystem/lighting/Recover() diff --git a/code/controllers/subsystems/media_tracks.dm b/code/controllers/subsystems/media_tracks.dm index 58fd0ec858..addff1541f 100644 --- a/code/controllers/subsystems/media_tracks.dm +++ b/code/controllers/subsystems/media_tracks.dm @@ -2,7 +2,7 @@ SUBSYSTEM_DEF(media_tracks) name = "Media Tracks" flags = SS_NO_FIRE init_order = INIT_ORDER_MEDIA_TRACKS - + /// Every track, including secret var/list/all_tracks = list() /// Non-secret jukebox tracks @@ -18,19 +18,19 @@ SUBSYSTEM_DEF(media_tracks) /datum/controller/subsystem/media_tracks/proc/load_tracks() for(var/filename in config.jukebox_track_files) report_progress("Loading jukebox track: [filename]") - + if(!fexists(filename)) error("File not found: [filename]") continue - + var/list/jsonData = json_decode(file2text(filename)) - + if(!istype(jsonData)) error("Failed to read tracks from [filename], json_decode failed.") continue - + for(var/entry in jsonData) - + // Critical problems that will prevent the track from working if(!istext(entry["url"])) error("Jukebox entry in [filename]: bad or missing 'url'. Tracks must have a URL.") @@ -47,21 +47,21 @@ SUBSYSTEM_DEF(media_tracks) warning("Jukebox entry in [filename], [entry["title"]]: bad or missing 'artist'. Please consider crediting the artist.") if(!istext(entry["genre"])) warning("Jukebox entry in [filename], [entry["title"]]: bad or missing 'genre'. Please consider adding a genre.") - + var/datum/track/T = new(entry["url"], entry["title"], entry["duration"], entry["artist"], entry["genre"]) - + T.secret = entry["secret"] ? 1 : 0 T.lobby = entry["lobby"] ? 1 : 0 - + all_tracks += T /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() - + for(var/datum/track/T in all_tracks) if(!T.secret) jukebox_tracks += T @@ -72,7 +72,7 @@ SUBSYSTEM_DEF(media_tracks) var/client/C = usr.client if(!check_rights(R_DEBUG|R_FUN)) return - + // Required var/url = tgui_input_text(C, "REQUIRED: Provide URL for track, or paste JSON if you know what you're doing. See code comments.", "Track URL", multiline = TRUE) if(!url) @@ -95,7 +95,7 @@ SUBSYSTEM_DEF(media_tracks) * "secret": only on hacked jukeboxes (true/false) * "lobby": plays in the lobby (true/false) */ - + if(islist(json)) for(var/song in json) if(!islist(song)) @@ -104,18 +104,18 @@ SUBSYSTEM_DEF(media_tracks) var/list/songdata = song if(!songdata["url"] || !songdata["title"] || !songdata["duration"]) to_chat(C, "URL, Title, or Duration was missing from a song. Skipping.") - continue + continue var/datum/track/T = new(songdata["url"], songdata["title"], songdata["duration"], songdata["artist"], songdata["genre"], songdata["secret"], songdata["lobby"]) 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 @@ -124,11 +124,11 @@ 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 - + var/secret = tgui_alert(C, "Optional: Mark track as secret?", "Track Secret", list("Yes", "Cancel", "No")) if(secret == "Cancel") return @@ -136,7 +136,7 @@ SUBSYSTEM_DEF(media_tracks) secret = TRUE else secret = FALSE - + var/lobby = tgui_alert(C, "Optional: Mark track as lobby music?", "Track Lobby", list("Yes", "Cancel", "No")) if(lobby == "Cancel") return @@ -146,12 +146,12 @@ SUBSYSTEM_DEF(media_tracks) secret = FALSE var/datum/track/T = new(url, title, duration, artist, genre) - + T.secret = secret T.lobby = lobby - + all_tracks += T - + report_progress("New media track added by [C]: [title]") sort_tracks() @@ -163,7 +163,7 @@ SUBSYSTEM_DEF(media_tracks) var/track = tgui_input_text(C, "Input track title or URL to remove (must be exact)", "Remove Track") if(!track) return - + for(var/datum/track/T in all_tracks) if(T.title == track || T.url == track) all_tracks -= T @@ -171,7 +171,7 @@ SUBSYSTEM_DEF(media_tracks) report_progress("Media track removed by [C]: [track]") sort_tracks() return - + to_chat(C, "") /datum/controller/subsystem/media_tracks/vv_get_dropdown() 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 b0cdc5db2c..68006b9181 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -227,7 +227,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/callback.dm b/code/datums/callback.dm index 74d5719ce2..8a904b8b44 100644 --- a/code/datums/callback.dm +++ b/code/datums/callback.dm @@ -44,7 +44,7 @@ var/datum/object = GLOBAL_PROC var/delegate var/list/arguments - var/weakref/user + var/datum/weakref/user /datum/callback/New(thingtocall, proctocall, ...) if (thingtocall) @@ -53,7 +53,7 @@ if (length(args) > 2) arguments = args.Copy(3) if(usr) - user = weakref(usr) + user = WEAKREF(usr) /world/proc/ImmediateInvokeAsync(thingtocall, proctocall, ...) set waitfor = FALSE @@ -70,7 +70,7 @@ /datum/callback/proc/Invoke(...) if(!usr) - var/weakref/W = user + var/datum/weakref/W = user if(W) var/mob/M = W.resolve() if(M) @@ -94,7 +94,7 @@ set waitfor = FALSE if(!usr) - var/weakref/W = user + var/datum/weakref/W = user if(W) var/mob/M = W.resolve() if(M) 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/datum.dm b/code/datums/datum.dm index ba8ace312d..d374fbf92f 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -1,18 +1,46 @@ -// -// datum defines! -// Note: Adding vars to /datum adds a var to EVERYTHING! Don't go overboard. -// - +/** + * The absolute base class for everything + * + * A datum instantiated has no physical world prescence, use an atom if you want something + * that actually lives in the world + * + * Be very mindful about adding variables to this class, they are inherited by every single + * thing in the entire game, and so you can easily cause memory usage to rise a lot with careless + * use of variables at this level + */ /datum - var/gc_destroyed //Time when this object was destroyed. - var/list/active_timers //for SStimer - var/list/datum_components //for /datum/components + /** + * Tick count time when this object was destroyed. + * + * If this is non zero then the object has been garbage collected and is awaiting either + * a hard del by the GC subsystme, or to be autocollected (if it has no references) + */ + var/gc_destroyed + + /// Active timers with this datum as the target + var/list/active_timers + + /** + * Components attached to this datum + * + * Lazy associated list in the structure of `type:component/list of components` + */ + var/list/datum_components + /** + * Any datum registered to receive signals from this datum is in this list + * + * Lazy associated list in the structure of `signal:registree/list of registrees` + */ var/list/comp_lookup var/list/list/signal_procs // List of lists var/signal_enabled = FALSE - var/weakref/weakref // Holder of weakref instance pointing to this datum + + /// Datum level flags var/datum_flags = NONE + /// A weak reference to another datum + var/datum/weakref/weak_reference + #ifdef REFERENCE_TRACKING var/tmp/running_find_references var/tmp/last_find_references = 0 @@ -35,7 +63,7 @@ continue qdel(timer) - weakref = null // Clear this reference to ensure it's kept for as brief duration as possible. + weak_reference = null // Clear this reference to ensure it's kept for as brief duration as possible. //BEGIN: ECS SHIT signal_enabled = FALSE 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 073f076659..8b2ac8f918 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,12 +75,12 @@ 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 - - return TRUE \ No newline at end of file + + return TRUE 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/looping_sounds/_looping_sound.dm b/code/datums/looping_sounds/_looping_sound.dm index e60fa3ad19..e939782529 100644 --- a/code/datums/looping_sounds/_looping_sound.dm +++ b/code/datums/looping_sounds/_looping_sound.dm @@ -87,7 +87,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 @@ -119,7 +119,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/sequence.dm b/code/datums/looping_sounds/sequence.dm index 650b3c8d5a..b43229812e 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 "-" @@ -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/datums/weakref.dm b/code/datums/weakref.dm deleted file mode 100644 index 6c17c18bca..0000000000 --- a/code/datums/weakref.dm +++ /dev/null @@ -1,26 +0,0 @@ -//obtain a weak reference to a datum -/proc/weakref(datum/D) - if(!istype(D)) - return - if(QDELETED(D)) - return - if(!D.weakref) - D.weakref = new/weakref(D) - return D.weakref - -/weakref - var/ref - -/weakref/New(datum/D) - ref = "\ref[D]" - -/weakref/Destroy() - // A weakref datum should not be manually destroyed as it is a shared resource, - // rather it should be automatically collected by the BYOND GC when all references are gone. - return QDEL_HINT_LETMELIVE - -/weakref/proc/resolve() - var/datum/D = locate(ref) - if(D && D.weakref == src) - return D - return null \ No newline at end of file diff --git a/code/datums/weakrefs.dm b/code/datums/weakrefs.dm new file mode 100644 index 0000000000..27bd5d9433 --- /dev/null +++ b/code/datums/weakrefs.dm @@ -0,0 +1,108 @@ +/// Creates a weakref to the given input. +/// See /datum/weakref's documentation for more information. +/proc/WEAKREF(datum/input) + if(istype(input) && !QDELETED(input)) + if(isweakref(input)) + return input + + if(!input.weak_reference) + input.weak_reference = new /datum/weakref(input) + return input.weak_reference + +/datum/proc/create_weakref() //Forced creation for admin proccalls + return WEAKREF(src) + +/** + * A weakref holds a non-owning reference to a datum. + * The datum can be referenced again using `resolve()`. + * + * To figure out why this is important, you must understand how deletion in + * BYOND works. + * + * Imagine a datum as a TV in a living room. When one person enters to watch + * TV, they turn it on. Others can come into the room and watch the TV. + * When the last person leaves the room, they turn off the TV because it's + * no longer being used. + * + * A datum being deleted tells everyone who's watching the TV to stop. + * If everyone leaves properly (AKA cleaning up their references), then the + * last person will turn off the TV, and everything is well. + * However, if someone is resistant (holds a hard reference after deletion), + * then someone has to walk in, drag them away, and turn off the TV forecefully. + * This process is very slow, and it's known as hard deletion. + * + * This is where weak references come in. Weak references don't count as someone + * watching the TV. Thus, when what it's referencing is destroyed, it will + * hopefully clean up properly, and limit hard deletions. + * + * A common use case for weak references is holding onto what created itself. + * For example, if a machine wanted to know what its last user was, it might + * create a `var/mob/living/last_user`. However, this is a strong reference to + * the mob, and thus will force a hard deletion when that mob is deleted. + * It is often better in this case to instead create a weakref to the user, + * meaning this type definition becomes `var/datum/weakref/last_user`. + * + * A good rule of thumb is that you should hold strong references to things + * that you *own*. For example, a dog holding a chew toy would be the owner + * of that chew toy, and thus a `var/obj/item/chew_toy` reference is fine + * (as long as it is cleaned up properly). + * However, a chew toy does not own its dog, so a `var/mob/living/dog/owner` + * might be inferior to a weakref. + * This is also a good rule of thumb to avoid circular references, such as the + * chew toy example. A circular reference that doesn't clean itself up properly + * will always hard delete. + */ +/datum/weakref + var/reference + +/datum/weakref/New(datum/thing) + reference = REF(thing) + +/datum/weakref/Destroy(force) + var/datum/target = resolve() + qdel(target) + + if(!force) + return QDEL_HINT_LETMELIVE //Let BYOND autoGC thiswhen nothing is using it anymore. + target?.weak_reference = null + return ..() + +/** + * Retrieves the datum that this weakref is referencing. + * + * This will return `null` if the datum was deleted. This MUST be respected. + */ +/datum/weakref/proc/resolve() + var/datum/D = locate(reference) + return (!QDELETED(D) && D.weak_reference == src) ? D : null + +/** + * SERIOUSLY READ THE AUTODOC COMMENT FOR THIS PROC BEFORE EVEN THINKING ABOUT USING IT + * + * Like resolve, but doesn't care if the datum is being qdeleted but hasn't been deleted yet. + * + * The return value of this proc leaves hanging references if the datum is being qdeleted but hasn't been deleted yet. + * + * Do not do anything that would create a lasting reference to the return value, such as giving it a tag, putting it on the map, + * adding it to an atom's contents or vis_contents, giving it a key (if it's a mob), attaching it to an atom (if it's an image), + * or assigning it to a datum or list referenced somewhere other than a temporary value. + * + * Unless you're resolving a weakref to a datum in a COMSIG_PARENT_QDELETING signal handler registered on that very same datum, + * just use resolve instead. + */ +/datum/weakref/proc/hard_resolve() + var/datum/D = locate(reference) + return (D?.weak_reference == src) ? D : null + +/datum/weakref/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION(VV_HK_WEAKREF_RESOLVE, "Go to reference") + +/datum/weakref/vv_do_topic(list/href_list) + . = ..() + if(href_list[VV_HK_WEAKREF_RESOLVE]) + if(!check_rights(NONE)) + return + var/datum/R = resolve() + if(R) + usr.client.debug_variables(R) 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/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/technomancer/spells/mark_recall.dm b/code/game/gamemodes/technomancer/spells/mark_recall.dm index 1d7088af4a..ad7eabf8d0 100644 --- a/code/game/gamemodes/technomancer/spells/mark_recall.dm +++ b/code/game/gamemodes/technomancer/spells/mark_recall.dm @@ -9,12 +9,12 @@ category = UTILITY_SPELLS //VOREStation Add - Multiple technomancer support /datum/technomancer_marker - var/weakref/U + var/datum/weakref/U var/image/I var/turf/T /datum/technomancer_marker/New(var/mob/user) - U = weakref(user) + U = WEAKREF(user) T = get_turf(user) I = image('icons/goonstation/featherzone.dmi', T, "spawn-wall") I.plane = TURF_PLANE @@ -46,7 +46,7 @@ GLOBAL_LIST_INIT(mark_spells, list()) return 0 if(pay_energy(1000)) //VOREStation Add - Multiple technomancer support - var/datum/technomancer_marker/marker = GLOB.mark_spells[weakref(user)] + var/datum/technomancer_marker/marker = GLOB.mark_spells[WEAKREF(user)] //They have one in the list if(istype(marker)) qdel(marker) @@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(mark_spells, list()) //They don't have one yet else to_chat(user, "You mark \the [get_turf(user)] under you.") - GLOB.mark_spells[weakref(user)] = new /datum/technomancer_marker(user) + GLOB.mark_spells[WEAKREF(user)] = new /datum/technomancer_marker(user) //VOREStation Add End adjust_instability(5) return 1 @@ -83,7 +83,7 @@ GLOBAL_LIST_INIT(mark_spells, list()) /obj/item/weapon/spell/recall/on_use_cast(var/mob/living/user) if(pay_energy(3000)) - var/datum/technomancer_marker/marker = GLOB.mark_spells[weakref(user)] //VOREStation Add - Multiple technomancer support + var/datum/technomancer_marker/marker = GLOB.mark_spells[WEAKREF(user)] //VOREStation Add - Multiple technomancer support if(!istype(marker)) to_chat(user, "There's no Mark!") return 0 @@ -128,4 +128,3 @@ GLOBAL_LIST_INIT(mark_spells, list()) else to_chat(user, "You can't afford the energy cost!") return 0 - diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm index f811abf957..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" @@ -121,4 +121,4 @@ bible_name = bn bible_icon_state = bis bible_item_state = bits - title = t \ No newline at end of file + title = t diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 2cea520fd2..785a60a93c 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 82d6fa0f6f..550e570d05 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 @@ -108,7 +109,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 */ @@ -146,7 +147,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 */ @@ -273,7 +274,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 @@ -620,9 +621,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 @@ -641,7 +642,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] @@ -844,4 +845,4 @@ // VOREStation Edit End #undef LOAD_TLV_VALUES #undef TEST_TLV_VALUES -#undef DECLARE_TLV_VALUES \ No newline at end of file +#undef DECLARE_TLV_VALUES 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 ec488ca585..b00966cb92 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -33,7 +33,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/cell_charger.dm b/code/game/machinery/cell_charger.dm index d36a9be13d..8439c9ff15 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -16,15 +16,14 @@ /obj/machinery/cell_charger/Initialize() . = ..() default_apply_parts() + add_overlay("ccharger1") /obj/machinery/cell_charger/update_icon() - icon_state = "ccharger[charging ? 1 : 0]" - if(!anchored) + cut_overlays() icon_state = "ccharger2" if(charging && !(stat & (BROKEN|NOPOWER))) - var/newlevel = round(charging.percent() * 4.0 / 99) //to_world("nl: [newlevel]") @@ -34,8 +33,14 @@ add_overlay("ccharger-o[newlevel]") chargelevel = newlevel - else + + add_overlay(image(charging.icon, charging.icon_state)) + add_overlay("ccharger-[charging.connector_type]-on") + + else if(anchored) cut_overlays() + icon_state = "ccharger0" + add_overlay("ccharger1") /obj/machinery/cell_charger/examine(mob/user) . = ..() @@ -77,6 +82,7 @@ anchored = !anchored to_chat(user, "You [anchored ? "attach" : "detach"] [src] [anchored ? "to" : "from"] the ground") playsound(src, W.usesound, 75, 1) + update_icon() else if(default_deconstruction_screwdriver(user, W)) return else if(default_deconstruction_crowbar(user, W)) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 765f6de69b..3af4562f09 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -80,10 +80,10 @@ GLOBAL_LIST_EMPTY(entertainment_screens) network = list(NETWORK_THUNDER) circuit = /obj/item/weapon/circuitboard/security/telescreen/entertainment camera_datum_type = /datum/tgui_module/camera/bigscreen - + var/obj/item/device/radio/radio = null var/obj/effect/overlay/vis/pinboard - var/weakref/showing + var/datum/weakref/showing var/enabled = TRUE // on or off @@ -93,7 +93,7 @@ GLOBAL_LIST_EMPTY(entertainment_screens) var/static/icon/mask = icon('icons/obj/entertainment_monitor.dmi', "mask") add_overlay("glass") - + pinboard = new() pinboard.icon = icon pinboard.icon_state = "pinboard" @@ -147,7 +147,7 @@ GLOBAL_LIST_EMPTY(entertainment_screens) stop_showing() if(stat & NOPOWER) return - showing = weakref(thing) + showing = WEAKREF(thing) pinboard.vis_contents = list(thing) /obj/machinery/computer/security/telescreen/entertainment/proc/stop_showing() @@ -155,7 +155,7 @@ GLOBAL_LIST_EMPTY(entertainment_screens) pinboard.vis_contents = null showing = null -/obj/machinery/computer/security/telescreen/entertainment/proc/maybe_stop_showing(weakref/thingref) +/obj/machinery/computer/security/telescreen/entertainment/proc/maybe_stop_showing(datum/weakref/thingref) if(showing == thingref) stop_showing() 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/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/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 75ef8e3763..e09f5b0436 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() @@ -473,4 +473,4 @@ #undef BLAST_DOOR_CRUSH_DAMAGE -#undef SHUTTER_CRUSH_DAMAGE \ No newline at end of file +#undef SHUTTER_CRUSH_DAMAGE diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm index c62c7ea94d..f1aa9051cc 100644 --- a/code/game/machinery/doors/brigdoors.dm +++ b/code/game/machinery/doors/brigdoors.dm @@ -1,294 +1,294 @@ -#define CHARS_PER_LINE 5 -#define FONT_SIZE "5pt" -#define FONT_COLOR "#09f" -#define FONT_STYLE "Small Fonts" -#define MAX_TIMER 36000 - -#define PRESET_SHORT 1 MINUTES -#define PRESET_MEDIUM 5 MINUTES -#define PRESET_LONG 10 MINUTES - -/////////////////////////////////////////////////////////////////////////////////////////////// -// Brig Door control displays. -// Description: This is a controls the timer for the brig doors, displays the timer on itself and -// has a popup window when used, allowing to set the timer. -// Code Notes: Combination of old brigdoor.dm code from rev4407 and the status_display.dm code -// Date: 01/September/2010 -// Programmer: Veryinky -///////////////////////////////////////////////////////////////////////////////////////////////// -/obj/machinery/door_timer - name = "Door Timer" - icon = 'icons/obj/status_display.dmi' - icon_state = "frame" - layer = ABOVE_WINDOW_LAYER - desc = "A remote control for a door." - req_access = list(access_brig) - anchored = TRUE // can't pick it up - density = FALSE // can walk through it. - var/id = null // id of door it controls. - var/activation_time = 0 - var/timer_duration = 0 - - var/timing = FALSE // boolean, true/1 timer is on, false/0 means it's not timing - var/list/obj/machinery/targets = list() - - - maptext_height = 26 - maptext_width = 32 - -/obj/machinery/door_timer/Initialize() - ..() - return INITIALIZE_HINT_LATELOAD - -/obj/machinery/door_timer/LateInitialize() - . = ..() - - for(var/obj/machinery/door/window/brigdoor/M in machines) - if(M.id == id) - LAZYADD(targets,M) - - for(var/obj/machinery/flasher/F in machines) - if(F.id == id) - LAZYADD(targets,F) - - for(var/obj/structure/closet/secure_closet/brig/C in GLOB.all_brig_closets) - if(C.id == id) - LAZYADD(targets,C) - - if(!LAZYLEN(targets)) - stat |= BROKEN - update_icon() - -/obj/machinery/door_timer/Destroy() - LAZYCLEARLIST(targets) - return ..() - -//Main door timer loop, if it's timing and time is >0 reduce time by 1. -// if it's less than 0, open door, reset timer -// update the door_timer window and the icon -/obj/machinery/door_timer/process() - if(stat & (NOPOWER|BROKEN)) - return - if(timing) - if(world.time - activation_time >= timer_duration) - timer_end() // open doors, reset timer, clear status screen - update_icon() - - -// has the door power situation changed, if so update icon. -/obj/machinery/door_timer/power_change() - ..() - update_icon() - -// open/closedoor checks if door_timer has power, if so it checks if the -// linked door is open/closed (by density) then opens it/closes it. - -// Closes and locks doors, power check -/obj/machinery/door_timer/proc/timer_start() - if(stat & (NOPOWER|BROKEN)) - return 0 - - activation_time = world.time - timing = TRUE - - for(var/obj/machinery/door/window/brigdoor/door in targets) - if(door.density) - continue - INVOKE_ASYNC(door, /obj/machinery/door/window/brigdoor.proc/close) - - for(var/obj/structure/closet/secure_closet/brig/C in targets) - if(C.broken) - continue - if(C.opened && !C.close()) - continue - C.locked = TRUE - C.icon_state = "closed_locked" - return 1 - -/// Opens and unlocks doors, power check -/obj/machinery/door_timer/proc/timer_end(forced = FALSE) - if(stat & (NOPOWER|BROKEN)) - return 0 - - timing = FALSE - activation_time = null - set_timer(0) - update_icon() - - for(var/obj/machinery/door/window/brigdoor/door in targets) - if(!door.density) - continue - INVOKE_ASYNC(door, /obj/machinery/door/window/brigdoor.proc/open) - - for(var/obj/structure/closet/secure_closet/brig/C in targets) - if(C.broken) - continue - if(C.opened) - continue - C.locked = FALSE - C.icon_state = "closed_unlocked" - - return 1 - -/obj/machinery/door_timer/proc/time_left(seconds = FALSE) - . = max(0, timer_duration - (activation_time ? (world.time - activation_time) : 0)) - if(seconds) - . /= 10 - -/obj/machinery/door_timer/proc/set_timer(value) - var/new_time = clamp(value, 0, MAX_TIMER) - . = new_time == timer_duration //return 1 on no change - timer_duration = new_time - if(timer_duration && activation_time && timing) // Setting it while active will reset the activation time - activation_time = world.time - -/obj/machinery/door_timer/attack_ai(mob/user) - return src.attack_hand(user) - -/obj/machinery/door_timer/attack_hand(mob/user) - if(..()) - return TRUE - tgui_interact(user) - -/obj/machinery/door_timer/tgui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "BrigTimer", name) - ui.open() - -/obj/machinery/door_timer/tgui_data() - var/list/data = list() - data["time_left"] = time_left() - data["max_time_left"] = MAX_TIMER - data["timing"] = timing - data["flash_found"] = FALSE - data["flash_charging"] = FALSE - data["preset_short"] = PRESET_SHORT - data["preset_medium"] = PRESET_MEDIUM - data["preset_long"] = PRESET_LONG - for(var/obj/machinery/flasher/F in targets) - data["flash_found"] = TRUE - if(F.last_flash && (F.last_flash + 150) > world.time) - data["flash_charging"] = TRUE - break - return data - -/obj/machinery/door_timer/tgui_act(action, params) - if(..()) - return - . = TRUE - - if(!allowed(usr)) - to_chat(usr, "Access denied.") - return FALSE - - switch(action) - if("time") - var/real_new_time = 0 - var/new_time = params["time"] - var/list/L = splittext(new_time, ":") - if(LAZYLEN(L)) - for(var/i in 1 to LAZYLEN(L)) - real_new_time += text2num(L[i]) * (60 ** (LAZYLEN(L) - i)) - else - real_new_time = text2num(new_time) - if(real_new_time) - set_timer(real_new_time * 10) - if("start") - timer_start() - if("stop") - timer_end(forced = TRUE) - if("flash") - for(var/obj/machinery/flasher/F in targets) - F.flash() - if("preset") - var/preset = params["preset"] - var/preset_time = time_left() - switch(preset) - if("short") - preset_time = PRESET_SHORT - if("medium") - preset_time = PRESET_MEDIUM - if("long") - preset_time = PRESET_LONG - set_timer(timer_duration + preset_time) - if(timing) - activation_time = world.time - else - . = FALSE - - -//icon update function -// if NOPOWER, display blank -// if BROKEN, display blue screen of death icon AI uses -// if timing=true, run update display function -/obj/machinery/door_timer/update_icon() - if(stat & (NOPOWER)) - icon_state = "frame" - return - - if(stat & (BROKEN)) - set_picture("ai_bsod") - return - - if(timing) - var/disp1 = id - var/timeleft = time_left(seconds = TRUE) - var/disp2 = "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, "0")]" - if(length(disp2) > CHARS_PER_LINE) - disp2 = "Error" - update_display(disp1, disp2) - else - if(maptext) - maptext = "" - return - -// Adds an icon in case the screen is broken/off, stolen from status_display.dm -/obj/machinery/door_timer/proc/set_picture(state) - if(maptext) - maptext = "" - cut_overlays() - add_overlay(mutable_appearance('icons/obj/status_display.dmi', state)) - -//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display -// Stolen from status_display -/obj/machinery/door_timer/proc/update_display(line1, line2) - line1 = uppertext(line1) - line2 = uppertext(line2) - var/new_text = {"
[line1]
[line2]
"} - if(maptext != new_text) - maptext = new_text - -/obj/machinery/door_timer/cell_1 - name = "Cell 1" - id = "Cell 1" - -/obj/machinery/door_timer/cell_2 - name = "Cell 2" - id = "Cell 2" - -/obj/machinery/door_timer/cell_3 - name = "Cell 3" - id = "Cell 3" - -/obj/machinery/door_timer/cell_4 - name = "Cell 4" - id = "Cell 4" - -/obj/machinery/door_timer/cell_5 - name = "Cell 5" - id = "Cell 5" - -/obj/machinery/door_timer/cell_6 - name = "Cell 6" - id = "Cell 6" - -/obj/machinery/door_timer/tactical_pet_storage //Vorestation Addition - name = "Tactical Pet Storage" - id = "tactical_pet_storage" - desc = "Opens and Closes on a timer. This one seals away a tactical boost in morale." - -#undef FONT_SIZE -#undef FONT_COLOR -#undef FONT_STYLE -#undef CHARS_PER_LINE +#define CHARS_PER_LINE 5 +#define FONT_SIZE "5pt" +#define FONT_COLOR "#09f" +#define FONT_STYLE "Small Fonts" +#define MAX_TIMER 36000 + +#define PRESET_SHORT 1 MINUTES +#define PRESET_MEDIUM 5 MINUTES +#define PRESET_LONG 10 MINUTES + +/////////////////////////////////////////////////////////////////////////////////////////////// +// Brig Door control displays. +// Description: This is a controls the timer for the brig doors, displays the timer on itself and +// has a popup window when used, allowing to set the timer. +// Code Notes: Combination of old brigdoor.dm code from rev4407 and the status_display.dm code +// Date: 01/September/2010 +// Programmer: Veryinky +///////////////////////////////////////////////////////////////////////////////////////////////// +/obj/machinery/door_timer + name = "Door Timer" + icon = 'icons/obj/status_display.dmi' + icon_state = "frame" + layer = ABOVE_WINDOW_LAYER + desc = "A remote control for a door." + req_access = list(access_brig) + anchored = TRUE // can't pick it up + density = FALSE // can walk through it. + var/id = null // id of door it controls. + var/activation_time = 0 + var/timer_duration = 0 + + var/timing = FALSE // boolean, true/1 timer is on, false/0 means it's not timing + var/list/obj/machinery/targets = list() + + + maptext_height = 26 + maptext_width = 32 + +/obj/machinery/door_timer/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/door_timer/LateInitialize() + . = ..() + + for(var/obj/machinery/door/window/brigdoor/M in machines) + if(M.id == id) + LAZYADD(targets,M) + + for(var/obj/machinery/flasher/F in machines) + if(F.id == id) + LAZYADD(targets,F) + + for(var/obj/structure/closet/secure_closet/brig/C in GLOB.all_brig_closets) + if(C.id == id) + LAZYADD(targets,C) + + if(!LAZYLEN(targets)) + stat |= BROKEN + update_icon() + +/obj/machinery/door_timer/Destroy() + LAZYCLEARLIST(targets) + return ..() + +//Main door timer loop, if it's timing and time is >0 reduce time by 1. +// if it's less than 0, open door, reset timer +// update the door_timer window and the icon +/obj/machinery/door_timer/process() + if(stat & (NOPOWER|BROKEN)) + return + if(timing) + if(world.time - activation_time >= timer_duration) + timer_end() // open doors, reset timer, clear status screen + update_icon() + + +// has the door power situation changed, if so update icon. +/obj/machinery/door_timer/power_change() + ..() + update_icon() + +// open/closedoor checks if door_timer has power, if so it checks if the +// linked door is open/closed (by density) then opens it/closes it. + +// Closes and locks doors, power check +/obj/machinery/door_timer/proc/timer_start() + if(stat & (NOPOWER|BROKEN)) + return 0 + + activation_time = world.time + timing = TRUE + + for(var/obj/machinery/door/window/brigdoor/door in targets) + if(door.density) + continue + 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) + continue + if(C.opened && !C.close()) + continue + C.locked = TRUE + C.icon_state = "closed_locked" + return 1 + +/// Opens and unlocks doors, power check +/obj/machinery/door_timer/proc/timer_end(forced = FALSE) + if(stat & (NOPOWER|BROKEN)) + return 0 + + timing = FALSE + activation_time = null + set_timer(0) + update_icon() + + for(var/obj/machinery/door/window/brigdoor/door in targets) + if(!door.density) + continue + 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) + continue + if(C.opened) + continue + C.locked = FALSE + C.icon_state = "closed_unlocked" + + return 1 + +/obj/machinery/door_timer/proc/time_left(seconds = FALSE) + . = max(0, timer_duration - (activation_time ? (world.time - activation_time) : 0)) + if(seconds) + . /= 10 + +/obj/machinery/door_timer/proc/set_timer(value) + var/new_time = clamp(value, 0, MAX_TIMER) + . = new_time == timer_duration //return 1 on no change + timer_duration = new_time + if(timer_duration && activation_time && timing) // Setting it while active will reset the activation time + activation_time = world.time + +/obj/machinery/door_timer/attack_ai(mob/user) + return src.attack_hand(user) + +/obj/machinery/door_timer/attack_hand(mob/user) + if(..()) + return TRUE + tgui_interact(user) + +/obj/machinery/door_timer/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "BrigTimer", name) + ui.open() + +/obj/machinery/door_timer/tgui_data() + var/list/data = list() + data["time_left"] = time_left() + data["max_time_left"] = MAX_TIMER + data["timing"] = timing + data["flash_found"] = FALSE + data["flash_charging"] = FALSE + data["preset_short"] = PRESET_SHORT + data["preset_medium"] = PRESET_MEDIUM + data["preset_long"] = PRESET_LONG + for(var/obj/machinery/flasher/F in targets) + data["flash_found"] = TRUE + if(F.last_flash && (F.last_flash + 150) > world.time) + data["flash_charging"] = TRUE + break + return data + +/obj/machinery/door_timer/tgui_act(action, params) + if(..()) + return + . = TRUE + + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return FALSE + + switch(action) + if("time") + var/real_new_time = 0 + var/new_time = params["time"] + var/list/L = splittext(new_time, ":") + if(LAZYLEN(L)) + for(var/i in 1 to LAZYLEN(L)) + real_new_time += text2num(L[i]) * (60 ** (LAZYLEN(L) - i)) + else + real_new_time = text2num(new_time) + if(real_new_time) + set_timer(real_new_time * 10) + if("start") + timer_start() + if("stop") + timer_end(forced = TRUE) + if("flash") + for(var/obj/machinery/flasher/F in targets) + F.flash() + if("preset") + var/preset = params["preset"] + var/preset_time = time_left() + switch(preset) + if("short") + preset_time = PRESET_SHORT + if("medium") + preset_time = PRESET_MEDIUM + if("long") + preset_time = PRESET_LONG + set_timer(timer_duration + preset_time) + if(timing) + activation_time = world.time + else + . = FALSE + + +//icon update function +// if NOPOWER, display blank +// if BROKEN, display blue screen of death icon AI uses +// if timing=true, run update display function +/obj/machinery/door_timer/update_icon() + if(stat & (NOPOWER)) + icon_state = "frame" + return + + if(stat & (BROKEN)) + set_picture("ai_bsod") + return + + if(timing) + var/disp1 = id + var/timeleft = time_left(seconds = TRUE) + var/disp2 = "[add_leading(num2text((timeleft / 60) % 60), 2, "0")]:[add_leading(num2text(timeleft % 60), 2, "0")]" + if(length(disp2) > CHARS_PER_LINE) + disp2 = "Error" + update_display(disp1, disp2) + else + if(maptext) + maptext = "" + return + +// Adds an icon in case the screen is broken/off, stolen from status_display.dm +/obj/machinery/door_timer/proc/set_picture(state) + if(maptext) + maptext = "" + cut_overlays() + add_overlay(mutable_appearance('icons/obj/status_display.dmi', state)) + +//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display +// Stolen from status_display +/obj/machinery/door_timer/proc/update_display(line1, line2) + line1 = uppertext(line1) + line2 = uppertext(line2) + var/new_text = {"
[line1]
[line2]
"} + if(maptext != new_text) + maptext = new_text + +/obj/machinery/door_timer/cell_1 + name = "Cell 1" + id = "Cell 1" + +/obj/machinery/door_timer/cell_2 + name = "Cell 2" + id = "Cell 2" + +/obj/machinery/door_timer/cell_3 + name = "Cell 3" + id = "Cell 3" + +/obj/machinery/door_timer/cell_4 + name = "Cell 4" + id = "Cell 4" + +/obj/machinery/door_timer/cell_5 + name = "Cell 5" + id = "Cell 5" + +/obj/machinery/door_timer/cell_6 + name = "Cell 6" + id = "Cell 6" + +/obj/machinery/door_timer/tactical_pet_storage //Vorestation Addition + name = "Tactical Pet Storage" + id = "tactical_pet_storage" + desc = "Opens and Closes on a timer. This one seals away a tactical boost in morale." + +#undef FONT_SIZE +#undef FONT_COLOR +#undef FONT_STYLE +#undef CHARS_PER_LINE 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/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/pointdefense.dm b/code/game/machinery/pointdefense.dm index fd21a86c6f..32883740b2 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -134,7 +134,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) var/last_shot = 0 var/kill_range = 18 var/rotation_speed = 0.25 SECONDS //How quickly we turn to face threats - var/weakref/engaging = null // The meteor we're shooting at + var/datum/weakref/engaging = null // The meteor we're shooting at var/id_tag = null /obj/machinery/power/pointdefense/Initialize() @@ -235,7 +235,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) return FALSE return TRUE -/obj/machinery/power/pointdefense/proc/Shoot(var/weakref/target) +/obj/machinery/power/pointdefense/proc/Shoot(var/datum/weakref/target) var/obj/effect/meteor/M = target.resolve() if(!istype(M)) engaging = null @@ -244,12 +244,12 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/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) -/obj/machinery/power/pointdefense/proc/finish_shot(var/weakref/target) +/obj/machinery/power/pointdefense/proc/finish_shot(var/datum/weakref/target) var/obj/machinery/pointdefense_control/PC = get_controller() engaging = null @@ -300,7 +300,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) // Compile list of known targets var/list/existing_targets = list() - for(var/weakref/WR in PC.targets) + for(var/datum/weakref/WR in PC.targets) var/obj/effect/meteor/M = WR.resolve() existing_targets += M @@ -308,7 +308,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) var/list/potential_targets = GLOB.meteor_list.Copy() - existing_targets for(var/obj/effect/meteor/M in potential_targets) if(targeting_check(M)) - var/weakref/target = weakref(M) + var/datum/weakref/target = WEAKREF(M) PC.targets += target engaging = target Shoot(target) @@ -317,7 +317,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) // Then, focus fire on existing targets for(var/obj/effect/meteor/M in existing_targets) if(targeting_check(M)) - var/weakref/target = weakref(M) + var/datum/weakref/target = WEAKREF(M) engaging = target Shoot(target) return 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 a0cbaa25f2..a18e4df73b 100644 --- a/code/game/machinery/suit_storage_unit_vr.dm +++ b/code/game/machinery/suit_storage/suit_cycler_units_vr.dm @@ -10,53 +10,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/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index c07722523c..36ffd8f8bc 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -37,7 +37,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /obj/machinery/telecomms/broadcaster/proc/link_radio(var/obj/item/device/radio/R) if(!istype(R)) return - linked_radios_weakrefs |= weakref(R) + linked_radios_weakrefs |= WEAKREF(R) /obj/machinery/telecomms/broadcaster/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) // Don't broadcast rejected signals @@ -66,7 +66,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept signal.data["level"] |= using_map.get_map_levels(listening_level, TRUE, overmap_range) var/list/forced_radios - for(var/weakref/wr in linked_radios_weakrefs) + for(var/datum/weakref/wr in linked_radios_weakrefs) var/obj/item/device/radio/R = wr.resolve() if(istype(R)) LAZYDISTINCTADD(forced_radios, R) @@ -149,7 +149,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /obj/machinery/telecomms/allinone/proc/link_radio(var/obj/item/device/radio/R) if(!istype(R)) return - linked_radios_weakrefs |= weakref(R) + linked_radios_weakrefs |= WEAKREF(R) /obj/machinery/telecomms/allinone/receive_signal(datum/signal/signal) @@ -197,7 +197,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/datum/radio_frequency/connection = signal.data["connection"] var/list/forced_radios - for(var/weakref/wr in linked_radios_weakrefs) + for(var/datum/weakref/wr in linked_radios_weakrefs) var/obj/item/device/radio/R = wr.resolve() if(istype(R)) LAZYDISTINCTADD(forced_radios, R) @@ -255,7 +255,7 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept var/datum/radio_frequency/connection = signal.data["connection"] var/list/forced_radios - for(var/weakref/wr in linked_radios_weakrefs) + for(var/datum/weakref/wr in linked_radios_weakrefs) var/obj/item/device/radio/R = wr.resolve() if(istype(R)) LAZYDISTINCTADD(forced_radios, R) @@ -761,4 +761,3 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept //to_world_log("Level: [signal.data["level"]] - Done: [signal.data["done"]]") return signal - diff --git a/code/game/machinery/telecomms/broadcaster_vr.dm b/code/game/machinery/telecomms/broadcaster_vr.dm index 4bdccfbc80..3751ffacdf 100644 --- a/code/game/machinery/telecomms/broadcaster_vr.dm +++ b/code/game/machinery/telecomms/broadcaster_vr.dm @@ -31,7 +31,7 @@ var/datum/radio_frequency/connection = signal.data["connection"] var/list/forced_radios - for(var/weakref/wr in linked_radios_weakrefs) + for(var/datum/weakref/wr in linked_radios_weakrefs) var/obj/item/device/radio/R = wr.resolve() if(istype(R)) LAZYDISTINCTADD(forced_radios, R) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 784a752bda..e23f7dd8b2 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -272,7 +272,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() /obj/machinery/telecomms/receiver/proc/link_radio(var/obj/item/device/radio/R) if(!istype(R)) return - linked_radios_weakrefs |= weakref(R) + linked_radios_weakrefs |= WEAKREF(R) /obj/machinery/telecomms/receiver/receive_signal(datum/signal/signal) if(!on) // has to be on to receive messages @@ -299,7 +299,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() var/obj/item/device/radio/R = signal.data["radio"] //Who're you? - if(!(weakref(R) in linked_radios_weakrefs)) + if(!(WEAKREF(R) in linked_radios_weakrefs)) signal.data["reject"] = 1 return 0 diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index ff6fe6e8a4..e7585d4ec2 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -1,8 +1,8 @@ /obj/machinery/mecha_part_fabricator icon = 'icons/obj/robotics_vr.dmi' //VOREStation Edit - New icon - icon_state = "mechfab-idle" + icon_state = "mechfab" name = "Exosuit Fabricator" - desc = "A machine used for construction of mechas." + desc = "A machine used for the construction of mechas." density = TRUE anchored = TRUE use_power = USE_POWER_IDLE @@ -213,7 +213,7 @@ * Adds the overlay to show the fab working and sets active power usage settings. */ /obj/machinery/mecha_part_fabricator/proc/on_start_printing() - add_overlay("fab-active") + add_overlay("[icon_state]-active") use_power = USE_POWER_ACTIVE /** @@ -222,7 +222,7 @@ * Removes the overlay to show the fab working and sets idle power usage settings. Additionally resets the description and turns off queue processing. */ /obj/machinery/mecha_part_fabricator/proc/on_finish_printing() - cut_overlay("fab-active") + cut_overlay("[icon_state]-active") use_power = USE_POWER_IDLE desc = initial(desc) process_queue = FALSE @@ -632,11 +632,9 @@ if(S && S.get_amount() >= 1) var/count = 0 flick("[loading_icon_state]", src) - // yess hacky but whatever + // yess hacky but whatever //even more hacky now, but at least it works if(loading_icon_state == "mechfab-idle") - add_overlay("mechfab-load-metal") - spawn(10) - cut_overlays("mechfab-load-metal") + flick("mechfab-load-metal", src) while(materials[S.material.name] + amnt <= res_max_amount && S.get_amount() >= 1) materials[S.material.name] += amnt S.use(1) diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index 2c58350cf9..e4344eef51 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -1,8 +1,8 @@ /obj/machinery/mecha_part_fabricator/pros - icon = 'icons/obj/robotics.dmi' + icon = 'icons/obj/robotics_vr.dmi' //VOREStation Edit - New icon icon_state = "prosfab" name = "Prosthetics Fabricator" - desc = "A machine used for construction of prosthetics." + desc = "A machine used for the construction of prosthetics." density = TRUE anchored = TRUE unacidable = TRUE @@ -17,7 +17,7 @@ var/species_types = list("Human") var/species = "Human" - loading_icon_state = "prosfab_loading" + loading_icon_state = null materials = list( MAT_STEEL = 0, diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 1dd50dc0bf..595e44a2cd 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/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 4353520880..93a2ec408c 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/items.dm b/code/game/objects/items.dm index 573e498aa4..8c0309563a 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -728,7 +728,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 @@ -757,7 +757,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 @@ -938,7 +938,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 a92c2725c0..7eafc0fe05 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -106,7 +106,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) // Proc: register_to_holder() // Parameters: None @@ -376,4 +376,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 4a6160b242..613818440f 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 @@ -197,7 +197,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)) @@ -235,9 +235,9 @@ I.invisibility = INVISIBILITY_OBSERVER I.plane = PLANE_GHOSTS I.appearance_flags = KEEP_APART|RESET_TRANSFORM - + cut_overlay(I) - + if(ghostjoin) add_overlay(I) @@ -247,4 +247,4 @@ icon_state = "m-denecrotizer" advanced = 0 //This one isn't as fancy cooldown = 5 MINUTES //not as long - charges = 20 //in case spiders merc Ian \ No newline at end of file + charges = 20 //in case spiders merc Ian diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 980685f124..1861694fae 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/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 7694bb4458..12b684cb21 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -56,7 +56,7 @@ var/global/list/default_medbay_channels = list( // Bluespace radios talk directly to telecomms equipment var/bluespace_radio = FALSE - var/weakref/bs_tx_weakref //Maybe misleading, this is the device to TRANSMIT TO + var/datum/weakref/bs_tx_weakref //Maybe misleading, this is the device to TRANSMIT TO // For mappers or subtypes, to start them prelinked to these devices var/bs_tx_preload_id var/bs_rx_preload_id @@ -104,14 +104,14 @@ var/global/list/default_medbay_channels = list( //Try to find a receiver for(var/obj/machinery/telecomms/receiver/RX in telecomms_list) if(RX.id == bs_tx_preload_id) //Again, bs_tx is the thing to TRANSMIT TO, so a receiver. - bs_tx_weakref = weakref(RX) + bs_tx_weakref = WEAKREF(RX) RX.link_radio(src) break //Hmm, howabout an AIO machine if(!bs_tx_weakref) for(var/obj/machinery/telecomms/allinone/AIO in telecomms_list) if(AIO.id == bs_tx_preload_id) - bs_tx_weakref = weakref(AIO) + bs_tx_weakref = WEAKREF(AIO) AIO.link_radio(src) break if(!bs_tx_weakref) 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 88701319cd..0ae3fd17b9 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -88,8 +88,9 @@ /obj/item/device/taperecorder/hear_talk(mob/M, list/message_pieces, verb) var/msg = multilingual_to_message(message_pieces, requires_machine_understands = TRUE, with_capitalization = TRUE) + var/voice = M.GetVoice() //Defined on living, returns name for normal mobs/ if(mytape && recording) - mytape.record_speech("[M.name] [verb], \"[msg]\"") + mytape.record_speech("[voice] [verb], \"[msg]\"") /obj/item/device/taperecorder/see_emote(mob/M as mob, text, var/emote_type) @@ -432,4 +433,4 @@ //Random colour tapes /obj/item/device/tape/random/New() - icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]" \ No newline at end of file + icon_state = "tape_[pick("white", "blue", "red", "yellow", "purple")]" diff --git a/code/game/objects/items/devices/translocator_vr.dm b/code/game/objects/items/devices/translocator_vr.dm index 12ece32895..19cf4c2e84 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/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index a9e5613a92..bacf8a6b83 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -8,7 +8,7 @@ var/channel = "NCS Northern Star News Feed" var/obj/machinery/camera/network/thunder/camera var/obj/item/device/radio/radio - var/weakref/showing + var/datum/weakref/showing var/showing_name /obj/item/device/tvcamera/New() @@ -95,7 +95,7 @@ if(showing) hide_tvs(showing) - showing = weakref(thing) + showing = WEAKREF(thing) showing_name = "[thing]" for(var/obj/machinery/computer/security/telescreen/entertainment/ES as anything in GLOB.entertainment_screens) ES.show_thing(thing) @@ -221,4 +221,3 @@ 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/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm index 3fdb9c6659..d2d88f4a79 100644 --- a/code/game/objects/items/toys/mech_toys.dm +++ b/code/game/objects/items/toys/mech_toys.dm @@ -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 cb879b7139..f999c70145 100644 --- a/code/game/objects/items/toys/toys_vr.dm +++ b/code/game/objects/items/toys/toys_vr.dm @@ -174,7 +174,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() @@ -224,7 +224,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() @@ -241,7 +241,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 @@ -274,14 +274,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() @@ -299,7 +299,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() @@ -344,7 +344,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 @@ -470,7 +470,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() @@ -539,7 +539,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() @@ -819,7 +819,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/uav.dm b/code/game/objects/items/uav.dm index f534ff9a42..2dc4cad3ee 100644 --- a/code/game/objects/items/uav.dm +++ b/code/game/objects/items/uav.dm @@ -48,10 +48,10 @@ /obj/item/device/uav/Initialize() . = ..() - + if(!cell && cell_type) cell = new cell_type - + ion_trail = new /datum/effect/effect/system/ion_trail_follow() ion_trail.set_up(src) ion_trail.stop() @@ -69,7 +69,7 @@ . += "It has '[nickname]' scribbled on the side." if(!cell) . += "It appears to be missing a power cell." - + if(health <= (initial(health)/4)) . += "It looks like it might break at any second!" else if(health <= (initial(health)/2)) @@ -86,7 +86,7 @@ "Toggle Power" = radial_power, "Pairing Mode" = radial_pair) var/choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) - + switch(choice) // Can pick up when off or packed if("Pick Up") @@ -113,11 +113,11 @@ /obj/item/device/uav/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/modular_computer) && state == UAV_PAIRING) var/obj/item/modular_computer/MC = I - LAZYDISTINCTADD(MC.paired_uavs, weakref(src)) + LAZYDISTINCTADD(MC.paired_uavs, WEAKREF(src)) playsound(src, 'sound/machines/buttonbeep.ogg', 50, 1) visible_message("[user] pairs [I] to [nickname]") toggle_pairing() - + else if(I.is_screwdriver() && cell) if(do_after(user, 3 SECONDS, src)) to_chat(user, "You remove [cell] into [nickname].") @@ -125,7 +125,7 @@ power_down() cell.forceMove(get_turf(src)) cell = null - + else if(istype(I, /obj/item/weapon/cell) && !cell) if(do_after(user, 3 SECONDS, src)) to_chat(user, "You insert [I] into [nickname].") @@ -185,7 +185,7 @@ playsound(src, 'sound/items/drop/metalboots.ogg', 75, 1) power_down() health -= initial(health)*0.25 //Lose 25% of your original health - + if(LAZYLEN(masters)) no_masters_time = 0 else if(no_masters_time++ > 50) @@ -251,7 +251,7 @@ /obj/item/device/uav/proc/power_down() if(state != UAV_ON) return - + state = UAV_OFF update_icon() stop_hover() @@ -265,7 +265,7 @@ return cell /obj/item/device/uav/relaymove(var/mob/user, direction, signal = 1) - if(signal && state == UAV_ON && (weakref(user) in masters)) + if(signal && state == UAV_ON && (WEAKREF(user) in masters)) if(next_move <= world.time) next_move = world.time + (1 SECOND/signal) step(src, direction) @@ -276,10 +276,10 @@ return "[nickname] - [get_x(src)],[get_y(src)],[get_z(src)] - I:[health]/[initial(health)] - C:[cell ? "[cell.charge]/[cell.maxcharge]" : "Not Installed"]" /obj/item/device/uav/proc/add_master(var/mob/living/M) - LAZYDISTINCTADD(masters, weakref(M)) + LAZYDISTINCTADD(masters, WEAKREF(M)) /obj/item/device/uav/proc/remove_master(var/mob/living/M) - LAZYREMOVE(masters, weakref(M)) + LAZYREMOVE(masters, WEAKREF(M)) /obj/item/device/uav/check_eye() if(state == UAV_ON) @@ -310,7 +310,7 @@ /obj/item/device/uav/hear_talk(var/mob/M, list/message_pieces, verb) var/name_used = M.GetVoice() for(var/wr_master in masters) - var/weakref/wr = wr_master + var/datum/weakref/wr = wr_master var/mob/master = wr.resolve() var/list/combined = master.combine_message(message_pieces, verb, M) var/message = combined["formatted"] @@ -319,14 +319,14 @@ /obj/item/device/uav/see_emote(var/mob/living/M, text) for(var/wr_master in masters) - var/weakref/wr = wr_master + var/datum/weakref/wr = wr_master var/mob/master = wr.resolve() var/rendered = "UAV received, [text]" master.show_message(rendered, 2) /obj/item/device/uav/show_message(msg, type, alt, alt_type) for(var/wr_master in masters) - var/weakref/wr = wr_master + var/datum/weakref/wr = wr_master var/mob/master = wr.resolve() var/rendered = "UAV received, [msg]" master.show_message(rendered, type) @@ -365,4 +365,4 @@ #undef UAV_OFF #undef UAV_ON -#undef UAV_PACKED \ No newline at end of file +#undef UAV_PACKED 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 634e3602da..92b8b8a20f 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 36447ce9cc..da3e367345 100644 --- a/code/game/objects/items/weapons/capture_crystal.dm +++ b/code/game/objects/items/weapons/capture_crystal.dm @@ -249,8 +249,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) @@ -856,4 +856,4 @@ /mob/living var/capture_crystal = TRUE //If TRUE, the mob is capturable. Otherwise it isn't. - var/capture_caught = FALSE //If TRUE, the mob has already been caught, and so cannot be caught again. \ No newline at end of file + var/capture_caught = FALSE //If TRUE, the mob has already been caught, and so cannot be caught again. 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/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 77da648c64..8321cfcbbb 100644 --- a/code/game/objects/items/weapons/storage/belt_vr.dm +++ b/code/game/objects/items/weapons/storage/belt_vr.dm @@ -58,7 +58,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 @@ -157,6 +157,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/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 9b50ff112c..d8cc1a78d0 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -850,12 +850,12 @@ plane = PLANE_PLAYER_HUD_ITEMS layer = 0.1 alpha = 200 - var/weakref/held_item + var/datum/weakref/held_item /atom/movable/storage_slot/New(newloc, obj/item/held_item) ASSERT(held_item) name += held_item.name - src.held_item = weakref(held_item) + src.held_item = WEAKREF(held_item) /atom/movable/storage_slot/Destroy() held_item = null diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 2e4b1ef269..36a050bb56 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -78,6 +78,15 @@ prob(9);/obj/item/weapon/cell/super, prob(1);/obj/item/weapon/cell/hyper) +/obj/random/powercell/device + name = "random device powercell" + desc = "This is a random device powercell." + icon_state = "random_device" + +/obj/random/powercell/device/item_to_spawn() + return pick(prob(80);/obj/item/weapon/cell/device, + prob(10);/obj/item/weapon/cell/device/hyper, + prob(10);/obj/item/weapon/cell/device/empproof) /obj/random/bomb_supply name = "bomb supply" 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/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/stumble_into_vr.dm b/code/game/objects/stumble_into_vr.dm index 610afea550..2079ab5a42 100644 --- a/code/game/objects/stumble_into_vr.dm +++ b/code/game/objects/stumble_into_vr.dm @@ -23,6 +23,7 @@ /obj/machinery/disposal/stumble_into(mob/living/M) playsound(src, 'sound/effects/clang.ogg', 25, 1, -1) visible_message("[M] [pick("tripped", "stumbled")] into \the [src]!") + log_and_message_admins("stumbled into \the [src]", M) if(M.client) M.client.perspective = EYE_PERSPECTIVE M.client.eye = src @@ -141,4 +142,4 @@ /obj/machinery/vending/stumble_into(mob/living/M) ..() if(prob(2)) - throw_item() \ No newline at end of file + throw_item() 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/hub.dm b/code/hub.dm deleted file mode 100644 index d3e49cecb4..0000000000 --- a/code/hub.dm +++ /dev/null @@ -1,17 +0,0 @@ -/world - - hub = "Exadv1.spacestation13" - hub_password = "kMZy3U5jJHSiBQjr" - 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" -*/ \ No newline at end of file diff --git a/code/modules/admin/admin_verb_lists_vr.dm b/code/modules/admin/admin_verb_lists_vr.dm index 13977ba41f..dc856026bd 100644 --- a/code/modules/admin/admin_verb_lists_vr.dm +++ b/code/modules/admin/admin_verb_lists_vr.dm @@ -168,7 +168,13 @@ var/list/admin_verbs_fun = list( /client/proc/admin_lightning_strike, /client/proc/resize, //VOREStation Add, /client/proc/cmd_admin_droppod_deploy, - /client/proc/adminorbit //VOREStation Add, + /client/proc/adminorbit, //VOREStation Add + /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/getPlayerStatus //VORESTation Add + ) var/list/admin_verbs_spawn = list( @@ -184,7 +190,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/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/buildmode.dm b/code/modules/admin/verbs/buildmode.dm index 962888dc94..013001d158 100644 --- a/code/modules/admin/verbs/buildmode.dm +++ b/code/modules/admin/verbs/buildmode.dm @@ -158,7 +158,9 @@ 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
\ @@ -545,6 +547,18 @@ 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 new file mode 100644 index 0000000000..a33d14fbf7 --- /dev/null +++ b/code/modules/admin/verbs/entity_narrate.dm @@ -0,0 +1,316 @@ +//Datum that's initialized on first calling the client procs. It's stored in /client +//We keep a distinct names/refs list in an effort to make things speedy, and for easy checking if something is on our list. +//We manually add to list element with procs to avoid dealing with clunky global lists that might not be relevant +//and for ability to narrate from long range. +/datum/entity_narrate + var/list/entity_names = list() + 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. +/client/proc/add_mob_for_narration(E as obj|mob|turf in orange(world.view)) + set name = "Narrate Entity (Add ref)" + set desc = "Saves a reference of target mob to be called when narrating." + set category = "Fun" + + if(!check_rights(R_FUN)) return + + //Making sure we got the list datum on our client. + if(!entity_narrate_holder) + entity_narrate_holder = new /datum/entity_narrate() + if(!istype(entity_narrate_holder, /datum/entity_narrate)) + return + var/datum/entity_narrate/holder = entity_narrate_holder + + //Since we extended to include all atoms, we're shutting things down with a guard clause for ghosts + if(istype(E, /mob/observer)) + to_chat(usr, SPAN_NOTICE("Ghosts shouldn't be narrated! If you want a ghost, make it a subtype of mob/living!")) + return + //We require a static mob/living type to check for .client and also later on, to use the unique .say mechanics for stuttering and language + if(istype(E, /mob/living)) + var/mob/living/L = E + if(L.client) + 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 + + //Covering functionality for turfs and objs. We need static type to access the name var + else if(istype(E, /atom)) + 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 + +//Proc for keeping our ref list relevant, deleting mobs that are no longer relevant for our event +/client/proc/remove_mob_for_narration() + set name = "Narrate Entity (Remove ref)" + set desc = "Remove mobs you're no longer narrating from your list for easier work." + set category = "Fun" + + if(!check_rights(R_FUN)) return + + if(!entity_narrate_holder) + entity_narrate_holder = new /datum/entity_narrate() + to_chat(usr, "No references were added yet! First add references!") + return + if(!istype(entity_narrate_holder, /datum/entity_narrate)) + return + var/datum/entity_narrate/holder = entity_narrate_holder + + var/options = holder.entity_names + "Clear All" + var/removekey = tgui_input_list(usr, "Choose which entity to remove", "remove reference", options, null) + if(removekey == "Clear All") + var/confirm = tgui_alert(usr, "Do you really want to clear your entity list?", "confirm", list("Yes", "No"), "No") + if(confirm == "Yes") + holder.entity_names = list() + holder.entity_refs = list() + else if(removekey) + holder.entity_refs -= removekey + holder.entity_names -= removekey + +//Planned to have TGUI functionality +//For now brings up a list of all entities on our reference list and gives us the option to choose what we wanna do +//using TGUI/Byond list/alert inputs +//Does not actually interact with the game world, it passes user input to narrate_mob_args(name, mode, message) after sanitizing +/client/proc/narrate_mob() + set name = "Narrate Entity (Interface)" + set desc = "Send either a visible or audiable message through your chosen entities using an interface" + set category = "Fun" + + if(!check_rights(R_FUN)) return + + if(!entity_narrate_holder) + entity_narrate_holder = new /datum/entity_narrate() + to_chat(usr, "No references were added yet! First add references!") + return + if(!istype(entity_narrate_holder, /datum/entity_narrate)) + return + var/datum/entity_narrate/holder = entity_narrate_holder + + + //Obtaining and sanitizing arguments for the actual proc + 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 + 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) + set name = "Narrate Entity" + set desc = "Narrate entities using positional arguments. Name should be as saved in ref list, mode should be Speak or Emote, follow with message" + set category = "Fun" + + + + if(!check_rights(R_FUN)) return + + if(!entity_narrate_holder) + entity_narrate_holder = new /datum/entity_narrate() + to_chat(usr, "No references were added yet! First add references!") + return + if(!istype(entity_narrate_holder, /datum/entity_narrate)) + return + var/datum/entity_narrate/holder = entity_narrate_holder + + //Sanitizing args + name = sanitize(name) + mode = sanitize(mode) + + if(!(mode in list("Speak", "Emote"))) + to_chat(usr, SPAN_NOTICE("Valid modes are 'Speak' and 'Emote'.")) + return + if(!holder.entity_refs[name]) + to_chat(usr, SPAN_NOTICE("[name] not in saved references!")) + + //Separate definition for mob/living and /obj due to .say() code allowing us to engage with languages, stuttering etc + //We also need this so we can check for .client + 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 + log_and_message_admins("used entity-narrate to speak through [our_entity.ckey]'s mob", usr) + if(!message) + 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") + our_entity.custom_emote(VISIBLE_MESSAGE, message) + else + return + + //This does cost us some code duplication, but I think it's worth it. + //furthermore, objs/turfs require the usr to specify the verb when speaking, otherwise it looks like an emote. + else if(istype(holder.entity_refs[name], /atom)) + var/atom/our_entity = holder.entity_refs[name] + if(!message) + 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 8a101decd7..f12a337a10 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() @@ -516,4 +516,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 2b30456094..bca000870f 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/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 a4b1bc8816..c625a2d34c 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() @@ -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/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm index 358df4c455..31bd557e1e 100644 --- a/code/modules/catalogue/cataloguer.dm +++ b/code/modules/catalogue/cataloguer.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers) var/datum/category_item/catalogue/displayed_data = null // Used for viewing a piece of data in the UI. var/busy = FALSE // Set to true when scanning, to stop multiple scans. var/debug = FALSE // If true, can view all catalogue data defined, regardless of unlock status. - var/weakref/partial_scanned = null // Weakref of the thing that was last scanned if inturrupted. Used to allow for partial scans to be resumed. + var/datum/weakref/partial_scanned = null // Weakref of the thing that was last scanned if inturrupted. Used to allow for partial scans to be resumed. var/partial_scan_time = 0 // How much to make the next scan shorter. /obj/item/device/cataloguer/advanced @@ -130,7 +130,7 @@ GLOBAL_LIST_EMPTY(all_cataloguers) to_chat(user, span("warning", "You failed to finish scanning \the [target] with \the [src].")) playsound(src, 'sound/machines/buzz-two.ogg', 50) color_box(box_segments, "#FF0000", 3) - partial_scanned = weakref(target) + partial_scanned = WEAKREF(target) partial_scan_time += world.time - scan_start_time // This is added to the existing value so two partial scans will add up correctly. sleep(3) busy = FALSE diff --git a/code/modules/client/client defines.dm b/code/modules/client/client defines.dm index b088ccec95..292655377f 100644 --- a/code/modules/client/client defines.dm +++ b/code/modules/client/client defines.dm @@ -13,6 +13,7 @@ var/last_message = "" //Contains the last message sent by this client - used to protect against copy-paste spamming. var/last_message_count = 0 //contins a number of how many times a message identical to last_message was sent. var/ircreplyamount = 0 + var/entity_narrate_holder //Holds /datum/entity_narrate when using the relevant admin verbs. ///////// //OTHER// diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 56450c68b9..30b1fcdc20 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -449,7 +449,7 @@ src << browse('code/modules/asset_cache/validate_assets.html', "window=asset_cache_browser") //Precache the client with all other assets slowly, so as to not block other browse() calls - addtimer(CALLBACK(GLOBAL_PROC, /proc/getFilesSlow, src, SSassets.preload, FALSE), 5 SECONDS) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(getFilesSlow), src, SSassets.preload, FALSE), 5 SECONDS) /mob/proc/MayRespawn() return 0 diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index 4479f4fd2c..4bf03d0267 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -472,6 +472,20 @@ ckeywhitelist = list("fuackwit422") character_name = list("Zera Livanne") +/datum/gear/fluff/zera_cloak + path = /obj/item/clothing/head/fluff/zerahat + display_name = "Grand Purple Hat" + slot = slot_head + ckeywhitelist = list("fuackwit422") + character_name = list("Zera Livanne") + +/datum/gear/fluff/zera_hat + path = /obj/item/clothing/suit/storage/toggle/labcoat/fluff/zeracloak + display_name = "Grand Purple Cloak" + slot = slot_wear_suit + ckeywhitelist = list("fuackwit422") + character_name = list("Zera Livanne") + // G CKEYS diff --git a/code/modules/client/preference_setup/loadout/loadout_gloves.dm b/code/modules/client/preference_setup/loadout/loadout_gloves.dm index fe56eea868..b3ea8d1b69 100644 --- a/code/modules/client/preference_setup/loadout/loadout_gloves.dm +++ b/code/modules/client/preference_setup/loadout/loadout_gloves.dm @@ -6,25 +6,27 @@ slot = slot_gloves sort_category = "Gloves and Handwear" -/datum/gear/gloves/blue - display_name = "gloves, blue" - path = /obj/item/clothing/gloves/blue +/datum/gear/gloves/selector + display_name = "coloured gloves selector" + description = "Pick from a range of plain coloured gloves." + path = /obj/item/clothing/gloves/black -/datum/gear/gloves/brown - display_name = "gloves, brown" - path = /obj/item/clothing/gloves/brown - -/datum/gear/gloves/light_brown - display_name = "gloves, light-brown" - path = /obj/item/clothing/gloves/light_brown - -/datum/gear/gloves/green - display_name = "gloves, green" - path = /obj/item/clothing/gloves/green - -/datum/gear/gloves/grey - display_name = "gloves, grey" - path = /obj/item/clothing/gloves/grey +/datum/gear/gloves/selector/New() + ..() + var/list/selector_uniforms = list( + "black"=/obj/item/clothing/gloves/black, + "blue"=/obj/item/clothing/gloves/blue, + "brown"=/obj/item/clothing/gloves/brown, + "light brown"=/obj/item/clothing/gloves/light_brown, + "green"=/obj/item/clothing/gloves/green, + "grey"=/obj/item/clothing/gloves/grey, + "orange"=/obj/item/clothing/gloves/orange, + "purple"=/obj/item/clothing/gloves/purple, + "rainbow"=/obj/item/clothing/gloves/rainbow, + "red"=/obj/item/clothing/gloves/red, + "white"=/obj/item/clothing/gloves/white + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) /datum/gear/gloves/latex display_name = "gloves, latex" @@ -36,26 +38,6 @@ path = /obj/item/clothing/gloves/sterile/nitrile cost = 2 -/datum/gear/gloves/orange - display_name = "gloves, orange" - path = /obj/item/clothing/gloves/orange - -/datum/gear/gloves/purple - display_name = "gloves, purple" - path = /obj/item/clothing/gloves/purple - -/datum/gear/gloves/rainbow - display_name = "gloves, rainbow" - path = /obj/item/clothing/gloves/rainbow - -/datum/gear/gloves/red - display_name = "gloves, red" - path = /obj/item/clothing/gloves/red - -/datum/gear/gloves/white - display_name = "gloves, white" - path = /obj/item/clothing/gloves/white - /datum/gear/gloves/evening display_name = "evening gloves" path = /obj/item/clothing/gloves/evening diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index 443df7908d..c718850f54 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -16,11 +16,6 @@ display_name = "beret, red" path = /obj/item/clothing/head/beret -/datum/gear/head/beret/bsec - display_name = "beret, navy (officer)" - path = /obj/item/clothing/head/beret/sec/navy/officer - allowed_roles = list("Security Officer","Head of Security","Warden","Blueshield Guard","Security Pilot") //YW ADDITIONS - /datum/gear/head/beret/bsec_warden display_name = "beret, navy (warden)" path = /obj/item/clothing/head/beret/sec/navy/warden @@ -31,11 +26,6 @@ path = /obj/item/clothing/head/beret/sec/navy/hos allowed_roles = list("Head of Security") -/datum/gear/head/beret/csec - display_name = "beret, corporate (officer)" - path = /obj/item/clothing/head/beret/sec/corporate/officer - allowed_roles = list("Security Officer","Head of Security","Warden", "Detective","Blueshield Guard","Security Pilot") //YW ADDITIONS - /datum/gear/head/beret/csec_warden display_name = "beret, corporate (warden)" path = /obj/item/clothing/head/beret/sec/corporate/warden @@ -54,70 +44,34 @@ display_name = "beret, purple" path = /obj/item/clothing/head/beret/purple -/datum/gear/head/beret/sec - display_name = "beret, red (security)" - path = /obj/item/clothing/head/beret/sec - allowed_roles = list("Security Officer","Head of Security","Warden", "Detective","Blueshield Guard","Security Pilot") //YW ADDITIONS - /datum/gear/head/cap - display_name = "cap, black" + display_name = "cap, brown-flat" + path = /obj/item/clothing/head/flatcap + +/datum/gear/head/cap/selector + display_name = "cap selector (plain)" + description = "Pick from a range of plain, coloured softcaps. Includes black, blue, green, and more!" path = /obj/item/clothing/head/soft/black -/datum/gear/head/cap/blue - display_name = "cap, blue" - path = /obj/item/clothing/head/soft/blue +/datum/gear/head/cap/selector/New() + ..() + var/list/selector_uniforms = list( + "black"=/obj/item/clothing/head/soft/black, + "blue"=/obj/item/clothing/head/soft/blue, + "green"=/obj/item/clothing/head/soft/green, + "grey"=/obj/item/clothing/head/soft/grey, + "orange"=/obj/item/clothing/head/soft/orange, + "purple"=/obj/item/clothing/head/soft/purple, + "rainbow"=/obj/item/clothing/head/soft/rainbow, + "red"=/obj/item/clothing/head/soft/red, + "yellow"=/obj/item/clothing/head/soft/yellow + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) /datum/gear/head/cap/mailman display_name = "cap, blue station" path = /obj/item/clothing/head/mailman -/datum/gear/head/cap/flat - display_name = "cap, brown-flat" - path = /obj/item/clothing/head/flatcap - -/datum/gear/head/cap/corp - display_name = "cap, corporate (Security)" - path = /obj/item/clothing/head/soft/sec/corp - allowed_roles = list("Security Officer","Head of Security","Warden", "Detective","Blueshield Guard","Security Pilot") //YW ADDITIONS - -/datum/gear/head/cap/green - display_name = "cap, green" - path = /obj/item/clothing/head/soft/green - -/datum/gear/head/cap/grey - display_name = "cap, grey" - path = /obj/item/clothing/head/soft/grey - -/datum/gear/head/cap/med - display_name = "cap, medical (Medical)" - path = /obj/item/clothing/head/soft/med - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Search and Rescue") - -/datum/gear/head/cap/orange - display_name = "cap, orange" - path = /obj/item/clothing/head/soft/orange - -/datum/gear/head/cap/purple - display_name = "cap, purple" - path = /obj/item/clothing/head/soft/purple - -/datum/gear/head/cap/rainbow - display_name = "cap, rainbow" - path = /obj/item/clothing/head/soft/rainbow - -/datum/gear/head/cap/red - display_name = "cap, red" - path = /obj/item/clothing/head/soft/red - -/datum/gear/head/cap/sec - display_name = "cap, security (Security)" - path = /obj/item/clothing/head/soft/sec - allowed_roles = list("Security Officer","Head of Security","Warden", "Detective","Blueshield Guard","Security Pilot") //YW ADDITIONS - -/datum/gear/head/cap/yellow - display_name = "cap, yellow" - path = /obj/item/clothing/head/soft/yellow - /datum/gear/head/cap/white display_name = "cap (colorable)" path = /obj/item/clothing/head/soft/mime @@ -134,69 +88,45 @@ ..() gear_tweaks += gear_tweak_free_color_choice -/datum/gear/head/cap/mbill - display_name = "cap, major bill's" - path = /obj/item/clothing/head/soft/mbill - /datum/gear/head/cap/sol display_name = "cap, sol" path = /obj/item/clothing/head/soft/solgov /datum/gear/head/cowboy - display_name = "cowboy" + display_name = "cowboy hat selector" + description = "Pick from a range of styles of classic cowboy hat. Giddyup!" path = /obj/item/clothing/head/cowboy -/datum/gear/head/cowboy/rattan - display_name = "cowboy, rattan" - path = /obj/item/clothing/head/cowboy/rattan - -/datum/gear/head/cowboy/dark - display_name = "cowboy, dark" - path = /obj/item/clothing/head/cowboy/dark - -/datum/gear/head/cowboy/ranger - display_name = "cowboy, ranger" - path = /obj/item/clothing/head/cowboy/ranger - -/datum/gear/head/cowboy/black - display_name = "cowboy, black" - path = /obj/item/clothing/head/cowboy/black - -/datum/gear/head/cowboy/fancy - display_name = "cowboy, fancy" - path = /obj/item/clothing/head/cowboy/fancy - -/datum/gear/head/cowboy/rustler - display_name = "cowboy, rustler" - path = /obj/item/clothing/head/cowboy/rustler - -/datum/gear/head/cowboy/black - display_name = "cowboy, bandit" - path = /obj/item/clothing/head/cowboy/bandit - -/datum/gear/head/cowboy/wide - display_name = "cowboy, wide" - path = /obj/item/clothing/head/cowboy/wide +/datum/gear/head/cowboy/New() + ..() + var/list/selector_uniforms = list( + "Classic"=/obj/item/clothing/head/cowboy, + "Rattan"=/obj/item/clothing/head/cowboy/rattan, + "Dark"=/obj/item/clothing/head/cowboy/dark, + "Ranger"=/obj/item/clothing/head/cowboy/ranger, + "Black"=/obj/item/clothing/head/cowboy/black, + "Fancy"=/obj/item/clothing/head/cowboy/fancy, + "Rustler's"=/obj/item/clothing/head/cowboy/rustler, + "Bandit's"=/obj/item/clothing/head/cowboy/bandit, + "Wide"=/obj/item/clothing/head/cowboy/wide + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) /datum/gear/head/fedora/grey - display_name = "fedora, grey" + display_name = "fedora selector" + description = "Pick from a range of fedoras. Available in grey, white, brown, beige, and panama style." path = /obj/item/clothing/head/fedora -/datum/gear/head/fedora/brown - display_name = "fedora, brown" - path = /obj/item/clothing/head/fedora/brown - -/datum/gear/head/fedora/white - display_name = "fedora, white" - path = /obj/item/clothing/head/fedora/white - -/datum/gear/head/fedora/beige - display_name = "fedora, beige" - path = /obj/item/clothing/head/fedora/beige - -/datum/gear/head/fedora/panama - display_name = "fedora, panama" - path = /obj/item/clothing/head/fedora/panama +/datum/gear/head/fedora/grey/New() + ..() + var/list/selector_uniforms = list( + "Brown"=/obj/item/clothing/head/fedora/brown, + "White"=/obj/item/clothing/head/fedora/white, + "Beige"=/obj/item/clothing/head/fedora/beige, + "Panama"=/obj/item/clothing/head/fedora/panama, + "Grey"=/obj/item/clothing/head/fedora + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) /datum/gear/head/hairflower display_name = "hair flower pin (colorable)" @@ -353,27 +283,23 @@ ..() gear_tweaks += gear_tweak_free_color_choice -/datum/gear/head/welding/ - display_name = "welding, normal (engineering/robotics)" +/datum/gear/head/welding + display_name = "welding mask selection" + description = "Select from a range of welding masks (engineering crew/roboticists only)" path = /obj/item/clothing/head/welding cost = 2 allowed_roles = list("Chief Engineer","Engineer","Atmospheric Technician","Research Director","Roboticist") -/datum/gear/head/welding/demon - display_name = "welding, demon (engineering/robotics)" - path = /obj/item/clothing/head/welding/demon - -/datum/gear/head/welding/knight - display_name = "welding, knight (engineering/robotics)" - path = /obj/item/clothing/head/welding/knight - -/datum/gear/head/welding/fancy - display_name = "welding, fancy (engineering/robotics)" - path = /obj/item/clothing/head/welding/fancy - -/datum/gear/head/welding/engie - display_name = "welding, engie (engineering/robotics)" - path = /obj/item/clothing/head/welding/engie +/datum/gear/head/welding/New() + ..() + var/list/selector_uniforms = list( + "plain"=/obj/item/clothing/head/welding, + "engineering"=/obj/item/clothing/head/welding/engie, + "fancy"=/obj/item/clothing/head/welding/fancy, + "demonic"=/obj/item/clothing/head/welding/demon, + "knightly"=/obj/item/clothing/head/welding/knight + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) /datum/gear/head/beret/solgov display_name = "beret sol, selection" @@ -445,3 +371,38 @@ /datum/gear/head/wheat display_name = "straw hat" path = /obj/item/clothing/head/wheat + +/datum/gear/head/sec_hat_selector + display_name = "Security - Basic Headwear" + description = "Select from a range of hats available to all Security personnel." + allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer","Blueshield Guard","Security Pilot") //YW ADDITIONS + path = /obj/item/clothing/head/soft/sec/corp + +/datum/gear/head/sec_hat_selector/New() + ..() + var/list/selector_uniforms = list( + "Navy Security Beret"=/obj/item/clothing/head/beret/sec/navy/officer, + "CorpSec Beret"=/obj/item/clothing/head/beret/sec/corporate/officer, + "Security Beret"=/obj/item/clothing/head/beret/sec, + "CorpSec Softcap"=/obj/item/clothing/head/soft/sec/corp, + "Security Softcap"=/obj/item/clothing/head/soft/sec, + "Proxima Centauri Contractor Beret"=/obj/item/clothing/head/beret/corp/pcrc + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) + +/datum/gear/head/med_hat_selector + display_name = "Medical - Basic Headwear" + description = "Select from a range of hats available to all Medical personnel." + allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic","Field Medic") // YW EDIT Field medic + path = /obj/item/clothing/head/soft/med + +/datum/gear/head/med_hat_selector/New() + ..() + var/list/selector_uniforms = list( + "medical softcap"=/obj/item/clothing/head/soft/med, + "paramedic softcap"=/obj/item/clothing/head/soft/paramed, + "medical beret"=/obj/item/clothing/head/beret/medical, + "chemist's beret"=/obj/item/clothing/head/beret/medical/chem, + "virologist's beret"=/obj/item/clothing/head/beret/medical/viro + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) diff --git a/code/modules/client/preference_setup/loadout/loadout_head_vr.dm b/code/modules/client/preference_setup/loadout/loadout_head_vr.dm index 83c66d8682..52d81e806d 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head_vr.dm @@ -1,8 +1,3 @@ -/datum/gear/head/cap/med - display_name = "cap, medical (Medical)" - path = /obj/item/clothing/head/soft/med - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic", "Field Medic") // YW EDIT Field medic - /*/datum/gear/head/cap/sol display_name = "cap, sol" path = /obj/item/clothing/head/soft/sol*/ @@ -33,28 +28,21 @@ allowed_roles = list("Head of Security", "Detective") /datum/gear/head/bearpelt - display_name = "brown bear pelt" + display_name = "animal pelt selection" + description = "Select from a range of (probably, hopefully) synthetic/artificial animal pelts." path = /obj/item/clothing/head/pelt -/datum/gear/head/wolfpelt - display_name = "brown wolf pelt" - path = /obj/item/clothing/head/pelt/wolfpelt - -/datum/gear/head/wolfpeltblack - display_name = "black wolf pelt" - path = /obj/item/clothing/head/pelt/wolfpeltblack - -/datum/gear/head/tigerpelt - display_name = "shiny tiger pelt" - path = /obj/item/clothing/head/pelt/tigerpelt - -/datum/gear/head/tigerpeltsnow - display_name = "snow tiger pelt" - path = /obj/item/clothing/head/pelt/tigerpeltsnow - -/datum/gear/head/tigerpeltpink - display_name = "pink tiger pelt" - path = /obj/item/clothing/head/pelt/tigerpeltpink +/datum/gear/head/bearpelt/New() + ..() + var/list/selector_uniforms = list( + "bear, brown"=/obj/item/clothing/head/pelt, + "wolf, brown"=/obj/item/clothing/head/pelt/wolfpelt, + "wolf, black"=/obj/item/clothing/head/pelt/wolfpeltblack, + "tiger, plain"=/obj/item/clothing/head/pelt/tigerpelt, + "tiger, white"=/obj/item/clothing/head/pelt/tigerpeltsnow, + "tiger, pink"=/obj/item/clothing/head/pelt/tigerpeltpink + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) /datum/gear/head/magic_hat display_name = "wizard hat, colorable" diff --git a/code/modules/client/preference_setup/loadout/loadout_mask.dm b/code/modules/client/preference_setup/loadout/loadout_mask.dm index 79cced4864..3531cfff72 100644 --- a/code/modules/client/preference_setup/loadout/loadout_mask.dm +++ b/code/modules/client/preference_setup/loadout/loadout_mask.dm @@ -68,11 +68,11 @@ for(var/gaiter in typesof(/obj/item/clothing/accessory/gaiter)) var/obj/item/clothing/accessory/gaiter_type = gaiter gaiters[initial(gaiter_type.name)] = gaiter_type - gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, /proc/cmp_text_asc)) + gear_tweaks += new/datum/gear_tweak/path(sortTim(gaiters, GLOBAL_PROC_REF(cmp_text_asc))) /datum/gear/mask/lace display_name = "lace veil" path = /obj/item/clothing/mask/lacemask /datum/gear/mask/lace/New() - gear_tweaks += gear_tweak_free_color_choice \ No newline at end of file + gear_tweaks += gear_tweak_free_color_choice diff --git a/code/modules/client/preference_setup/loadout/loadout_smoking.dm b/code/modules/client/preference_setup/loadout/loadout_smoking.dm index f9442518b2..f855d31ca2 100644 --- a/code/modules/client/preference_setup/loadout/loadout_smoking.dm +++ b/code/modules/client/preference_setup/loadout/loadout_smoking.dm @@ -48,6 +48,6 @@ /datum/gear/cigarettes/New() ..() var/list/cigarettes = list() - for(var/obj/item/weapon/storage/fancy/cigarettes/cigarette_brand as anything in (typesof(/obj/item/weapon/storage/fancy/cigarettes) - typesof(/obj/item/weapon/storage/fancy/cigarettes/killthroat))) + for(var/obj/item/weapon/storage/fancy/cigarettes/cigarette_brand as anything in (typesof(/obj/item/weapon/storage/fancy/cigarettes))) cigarettes[initial(cigarette_brand.name)] = cigarette_brand gear_tweaks += new/datum/gear_tweak/path(sortAssoc(cigarettes)) diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index f3057a522c..8457965042 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -31,52 +31,38 @@ path = /obj/item/clothing/suit/jacket/puffer/vest /datum/gear/suit/bomber - display_name = "bomber jacket" + display_name = "bomber jacket selection" + description = "Pick from a small selection of bomber jackets." path = /obj/item/clothing/suit/storage/toggle/bomber -/datum/gear/suit/bomber_alt - display_name = "bomber jacket, alt" - path = /obj/item/clothing/suit/storage/bomber/alt - -/datum/gear/suit/bomber_retro - display_name = "bomber jacket, retro" - path = /obj/item/clothing/suit/storage/toggle/bomber/retro +/datum/gear/suit/bomber/New() + ..() + var/list/selector_uniforms = list( + "classic"=/obj/item/clothing/suit/storage/toggle/bomber, + "classic alternative"=/obj/item/clothing/suit/storage/bomber/alt, + "retro"=/obj/item/clothing/suit/storage/toggle/bomber/retro + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) /datum/gear/suit/leather_jacket - display_name = "leather jacket, black" + display_name = "leather jacket and vest selection" + description = "Pick from a wide variety of leather vests and jackets." path = /obj/item/clothing/suit/storage/toggle/leather_jacket -/datum/gear/suit/leather_jacket_sleeveless - display_name = "leather vest, black" - path = /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless - -/datum/gear/suit/leather_jacket_alt - display_name = "leather jacket 2, black" - path = /obj/item/clothing/suit/storage/leather_jacket_alt - -/datum/gear/suit/leather_jacket_nt - display_name = "leather jacket, corporate, black" - path = /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen - -/datum/gear/suit/leather_jacket_nt/sleeveless - display_name = "leather vest, corporate, black" - path = /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless - -/datum/gear/suit/brown_jacket - display_name = "leather jacket, brown" - path = /obj/item/clothing/suit/storage/toggle/brown_jacket - -/datum/gear/suit/brown_jacket_sleeveless - display_name = "leather vest, brown" - path = /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless - -/datum/gear/suit/brown_jacket_nt - display_name = "leather jacket, corporate, brown" - path = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen - -/datum/gear/suit/brown_jacket_nt/sleeveless - display_name = "leather vest, corporate, brown" - path = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless +/datum/gear/suit/leather_jacket/New() + ..() + var/list/selector_uniforms = list( + "black jacket"=/obj/item/clothing/suit/storage/toggle/leather_jacket, + "black vest"=/obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless, + "black jacket, alternative"=/obj/item/clothing/suit/storage/leather_jacket_alt, + "black jacket, corporate"=/obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen, + "black vest, corporate"=/obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless, + "brown jacket"=/obj/item/clothing/suit/storage/toggle/brown_jacket, + "brown vest"=/obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless, + "brown jacket, corporate"=/obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen, + "brown vest, corporate"=/obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) //YW EDIT BEGINS /datum/gear/suit/mil @@ -204,17 +190,19 @@ path = /obj/item/clothing/suit/cyberpunk cost = 2 -/datum/gear/suit/puffycoat/blue - display_name = "puffy coat, blue" +/datum/gear/suit/puffycoat + display_name = "puffy coat selection" + description = "Pick from a few different colours of puffy coat." path = /obj/item/clothing/suit/storage/puffyblue -/datum/gear/suit/puffycoat/red - display_name = "puffy coat, red" - path = /obj/item/clothing/suit/storage/puffyred - -/datum/gear/suit/puffycoat/purple - display_name = "puffy coat, purple" - path = /obj/item/clothing/suit/storage/puffypurple +/datum/gear/suit/puffycoat/New() + ..() + var/list/selector_uniforms = list( + "blue"=/obj/item/clothing/suit/storage/puffyblue, + "red"=/obj/item/clothing/suit/storage/puffyred, + "purple"=/obj/item/clothing/suit/storage/puffypurple + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) /datum/gear/suit/poncho display_name = "poncho selection" @@ -558,20 +546,19 @@ gear_tweaks += new/datum/gear_tweak/path(flannel) /datum/gear/suit/denim_jacket - display_name = "denim jacket" + display_name = "denim jacket and vest selection" + description = "Select from a small range of denim jackets and vests." path = /obj/item/clothing/suit/storage/toggle/denim_jacket -/datum/gear/suit/denim_jacket/corporate - display_name = "denim jacket, corporate" - path = /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen - -/datum/gear/suit/denim_vest - display_name = "denim vest" - path = /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless - -/datum/gear/suit/denim_vest/corporate - display_name = "denim vest, corporate" - path = /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless +/datum/gear/suit/denim_jacket/New() + ..() + var/list/selector_uniforms = list( + "denim jacket"=/obj/item/clothing/suit/storage/toggle/denim_jacket, + "denim jacket, corporate"=/obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen, + "denim vest"=/obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless, + "denim vest, corporate"=/obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless + ) + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) /datum/gear/suit/miscellaneous/dep_jacket display_name = "department jacket selection" diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm index 8365de95c5..731a6d939c 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm @@ -23,7 +23,6 @@ path = /obj/item/clothing/suit/storage/toggle/labcoat/old/tox cost = 2 - /datum/gear/suit/roles/labcoat_old/New() ..() var/list/labcoats = list( @@ -92,7 +91,6 @@ display_name = "chiton" path = /obj/item/clothing/suit/chiton - //oversized t-shirt /datum/gear/suit/oversize display_name = "oversized t-shirt (colorable)" @@ -109,7 +107,6 @@ Talon winter coat display_name = "winter coat, Talon" path = /obj/item/clothing/suit/storage/hooded/wintercoat/talon - /datum/gear/suit/armor/combat/crusader_explo display_name = "knight, explo" path = /obj/item/clothing/suit/armor/combat/crusader_explo @@ -118,20 +115,14 @@ Talon winter coat /datum/gear/suit/armor/combat/crusader_explo/FM display_name = "knight, Field Medic" path = /obj/item/clothing/suit/armor/combat/crusader_explo/FM - allowed_roles = list ("Field Medic") + allowed_roles = list ("Paramedic") //Atmos-coloured hazard vest display_name = "hazard vest, atmospherics" path = /obj/item/clothing/suit/storage/hazardvest/atmos allowed_roles = list("Chief Engineer","Atmospheric Technician", "Engineer") -//Long fur coat -/datum/gear/suit/russofurcoat - display_name = "long fur coat" - path = /obj/item/clothing/suit/storage/vest/hoscoat/russofurcoat - //Colorable Hoodie - /datum/gear/suit/hoodie_vr display_name = "hoodie with hood (colorable)" path = /obj/item/clothing/suit/storage/hooded/hoodie diff --git a/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm b/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm index 28ca463500..f02baa6051 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uni_selector.dm @@ -7,7 +7,7 @@ allowed_roles = list("") path = slot = slot_w_uniform - sort_category = "Uniform Selectors" + sort_category = "Uniforms" cost = 2 /datum/gear/uniform/BLANK_selector/New() @@ -24,8 +24,8 @@ description = "Select from a range of outfits available to all Site Managers." allowed_roles = list("Site Manager") path = /obj/item/clothing/under/rank/neo_captain - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/site_manager_selector/New() ..() @@ -53,8 +53,8 @@ description = "Select from a range of outfits available to all Heads of Personnel." allowed_roles = list("Head of Personnel") path = /obj/item/clothing/under/rank/neo_hop - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/head_of_personnel_selector/New() ..() @@ -84,7 +84,7 @@ description = "Select from a range of outfits available to all Pilots." allowed_roles = list("Pilot") path = /obj/item/clothing/under/rank/neo_pilot - sort_category = "Uniform Selectors" + sort_category = "Uniforms" cost = 1 /datum/gear/uniform/pilot_uniform_selector/New() @@ -102,7 +102,7 @@ description = "Select from a range of outfits available to all Janitorial personnel." allowed_roles = list("Janitor") path = /obj/item/clothing/under/rank/neo_janitor - sort_category = "Uniform Selectors" + sort_category = "Uniforms" cost = 1 /datum/gear/uniform/janitor_uniform_selector/New() @@ -117,7 +117,7 @@ display_name = "Civilian - Basic Uniforms" description = "Select from a range of uniforms available to all personnel. Includes miscellaneous corporate contractor uniforms." path = /obj/item/clothing/under/utility/grey - sort_category = "Uniform Selectors" + sort_category = "Uniforms" cost = 1 /datum/gear/uniform/civvie_uniform_selector/New() @@ -138,6 +138,7 @@ "Corporate, Focal Point Energistics uniform"=/obj/item/clothing/under/corp/focal, "Corporate, Grayson Manufactories uniform"=/obj/item/clothing/under/corp/grayson, "Corporate, Grayson Manufactories jumpsuit"=/obj/item/clothing/under/corp/grayson_jump, + "Corporate, Kaleidoscope"=/obj/item/clothing/under/corp/kaleidoscope, "Corporate, Ward-Takahashi uniform"=/obj/item/clothing/under/corp/wardt, "Corporate, Hephaestus Arms uniform"=/obj/item/clothing/under/corp/hephaestus, "Corporate, Centauri Provisions uniform"=/obj/item/clothing/under/corp/centauri, @@ -163,8 +164,8 @@ description = "Select from a range of outfits available to all Security personnel." allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer") path = /obj/item/clothing/under/rank/security/corp - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/security_selector/New() ..() @@ -208,8 +209,8 @@ description = "Select from a range of outfits available to Wardens." allowed_roles = list("Head of Security","Warden") path = /obj/item/clothing/under/rank/warden/corp - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/security_warden_selector/New() ..() @@ -229,8 +230,8 @@ description = "Select from a range of outfits available to all Detectives." allowed_roles = list("Head of Security","Detective") path = /obj/item/clothing/under/det/corporate - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/security_detective_selector/New() ..() @@ -245,8 +246,8 @@ description = "Select from a range of outfits available to all Heads of Security." allowed_roles = list("Head of Security") path = /obj/item/clothing/under/rank/head_of_security/corp - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/security_head_selector/New() ..() @@ -284,8 +285,8 @@ description = "Select from a range of outfits available to all Quartermasters." allowed_roles = list("Quartermaster") path = /obj/item/clothing/under/rank/cargo/jeans - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/quartermaster_selector/New() ..() @@ -315,8 +316,8 @@ description = "Select from a range of outfits available to all Cargo personnel." allowed_roles = list("Cargo Technician","Shaft Miner","Quartermaster") path = /obj/item/clothing/under/rank/cargotech/jeans - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/cargo_general_selector/New() ..() @@ -343,8 +344,8 @@ description = "Select from a range of outfits available to all Mining personnel." allowed_roles = list("Shaft Miner","Quartermaster") path = /obj/item/clothing/under/rank/neo_miner - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/cargo_miner_selector/New() ..() @@ -361,8 +362,8 @@ description = "Select from a range of outfits available to all Chief Engineers." allowed_roles = list("Chief Engineer") path = /obj/item/clothing/under/rank/neo_chiefengi - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/engineering_chief_selector/New() ..() @@ -385,8 +386,8 @@ description = "Select from a range of outfits available to all Engineering personnel." allowed_roles = list("Chief Engineer","Engineer","Atmospheric Technician") path = /obj/item/clothing/under/rank/neo_engi - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/engineer_selector/New() ..() @@ -402,7 +403,8 @@ "voidsuit underlayer"=/obj/item/clothing/under/undersuit/hazard, "TG&C jumpsuit"=/obj/item/clothing/under/rank/neo_engi, "TG&C jumpskirt"=/obj/item/clothing/under/rank/neo_engi_skirt, - "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_engi_gorka + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_engi_gorka, + "hazard jumpsuit"=/obj/item/clothing/under/hazard ) gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) @@ -411,8 +413,8 @@ description = "Select from a range of outfits available to all Atmospherics Technicians." allowed_roles = list("Chief Engineer","Atmospheric Technician") path = /obj/item/clothing/under/rank/atmospheric_technician/skirt - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/engi_atmos_selector/New() ..() @@ -430,8 +432,8 @@ description = "Select from a range of outfits available to all Medical personnel." allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic") path = /obj/item/clothing/under/rank/neo_med - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/medical_selector/New() ..() @@ -452,7 +454,8 @@ "TG&C virology jumpskirt"=/obj/item/clothing/under/rank/neo_viro_skirt, "TG&C dark jumpsuit"=/obj/item/clothing/under/rank/neo_med_dark, "TG&C dark jumpskirt"=/obj/item/clothing/under/rank/neo_med_dark_skirt, - "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_med_gorka + "TG&C gorka suit"=/obj/item/clothing/under/rank/neo_med_gorka, + "sterile jumpsuit"=/obj/item/clothing/under/sterile ) gear_tweaks += new/datum/gear_tweak/path(sortAssoc(selector_uniforms)) @@ -461,8 +464,8 @@ description = "Select from a range of outfits available to all Chemists." allowed_roles = list("Chief Medical Officer","Chemist") path = /obj/item/clothing/under/rank/neo_chem - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/chemist_selector/New() ..() @@ -480,8 +483,8 @@ description = "Select from a range of outfits available to all Paramedics." allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") path = /obj/item/clothing/under/rank/paramedunidark - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/paramedic_selector/New() ..() @@ -502,7 +505,7 @@ description = "Select from a range of outfits available to all Chief Medical Officers." allowed_roles = list("Chief Medical Officer") path = /obj/item/clothing/under/rank/neo_cmo - sort_category = "Uniform Selectors" + sort_category = "Uniforms" cost = 2 /datum/gear/uniform/chief_medical_selector/New() @@ -530,8 +533,8 @@ description = "Select from a range of outfits available to all Research Directors." allowed_roles = list("Research Director") path = /obj/item/clothing/under/rank/neo_rd_suit - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/research_director_selector/New() ..() @@ -555,8 +558,8 @@ description = "Select from a range of outfits available to all Science personnel." allowed_roles = list("Scientist","Research Director","Roboticist","Xenobiologist","Xenobotanist") path = /obj/item/clothing/under/rank/neo_science - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/science_dept_selector/New() ..() @@ -579,8 +582,8 @@ description = "Select from a range of outfits available to all Roboticists." allowed_roles = list("Research Director","Roboticist") path = /obj/item/clothing/under/rank/neo_robo - sort_category = "Uniform Selectors" - cost = 2 + sort_category = "Uniforms" + cost = 1 /datum/gear/uniform/science_robotics_selector/New() ..() diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 4b5e532a51..cb307392c9 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -3,7 +3,7 @@ display_name = "blazer, blue" path = /obj/item/clothing/under/blazer slot = slot_w_uniform - sort_category = "Uniforms and Casual Dress" + sort_category = "Casual Dress" /datum/gear/uniform/blazerskirt display_name = "blazer, blue with skirt" @@ -106,116 +106,6 @@ shorts[initial(short_type.name)] = short_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(shorts)) -/datum/gear/uniform/job_skirt/ce - display_name = "skirt, ce" - path = /obj/item/clothing/under/rank/chief_engineer/skirt - allowed_roles = list("Chief Engineer") - -/datum/gear/uniform/job_skirt/atmos - display_name = "skirt, atmos" - path = /obj/item/clothing/under/rank/atmospheric_technician/skirt - allowed_roles = list("Chief Engineer","Atmospheric Technician") - -/datum/gear/uniform/job_skirt/eng - display_name = "skirt, engineer" - path = /obj/item/clothing/under/rank/engineer/skirt - allowed_roles = list("Chief Engineer","Engineer") - -/datum/gear/uniform/job_skirt/roboticist - display_name = "skirt, roboticist" - path = /obj/item/clothing/under/rank/roboticist/skirt - allowed_roles = list("Research Director","Roboticist") - -/datum/gear/uniform/job_skirt/cmo - display_name = "skirt, cmo" - path = /obj/item/clothing/under/rank/chief_medical_officer/skirt - allowed_roles = list("Chief Medical Officer") - -/datum/gear/uniform/job_skirt/chem - display_name = "skirt, chemist" - path = /obj/item/clothing/under/rank/chemist/skirt - allowed_roles = list("Chief Medical Officer","Chemist") - -/datum/gear/uniform/job_skirt/viro - display_name = "skirt, virologist" - path = /obj/item/clothing/under/rank/virologist/skirt - allowed_roles = list("Chief Medical Officer","Medical Doctor") - -/datum/gear/uniform/job_skirt/med - display_name = "skirt, medical" - path = /obj/item/clothing/under/rank/medical/skirt - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic") - -/datum/gear/uniform/job_skirt/sci - display_name = "skirt, scientist" - path = /obj/item/clothing/under/rank/scientist/skirt - allowed_roles = list("Research Director","Scientist", "Xenobiologist") - -/datum/gear/uniform/job_skirt/cargo - display_name = "skirt, cargo" - path = /obj/item/clothing/under/rank/cargotech/skirt - allowed_roles = list("Quartermaster","Cargo Technician") - -/datum/gear/uniform/job_skirt/qm - display_name = "skirt, QM" - path = /obj/item/clothing/under/rank/cargo/skirt - allowed_roles = list("Quartermaster") - -/datum/gear/uniform/job_skirt/warden - display_name = "skirt, warden" - path = /obj/item/clothing/under/rank/warden/skirt - allowed_roles = list("Head of Security", "Warden") - -/datum/gear/uniform/job_skirt/security - display_name = "skirt, security" - path = /obj/item/clothing/under/rank/security/skirt - allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer","Blueshield Guard","Security Pilot") //YW ADDITIONS - -/datum/gear/uniform/job_skirt/head_of_security - display_name = "skirt, hos" - path = /obj/item/clothing/under/rank/head_of_security/skirt - allowed_roles = list("Head of Security") - -/datum/gear/uniform/job_turtle/science - display_name = "turtleneck, science" - path = /obj/item/clothing/under/rank/scientist/turtleneck - allowed_roles = list("Research Director", "Scientist", "Roboticist", "Xenobiologist") - -/datum/gear/uniform/job_turtle/security - display_name = "turtleneck, security" - path = /obj/item/clothing/under/rank/security/turtleneck - allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer", "Security Pilot") //YW ADDITIONS - -/datum/gear/uniform/job_turtle/engineering - display_name = "turtleneck, engineering" - path = /obj/item/clothing/under/rank/engineer/turtleneck - allowed_roles = list("Chief Engineer", "Atmospheric Technician", "Engineer") - -/datum/gear/uniform/job_turtle/medical - display_name = "turtleneck, medical" - path = /obj/item/clothing/under/rank/medical/turtleneck - allowed_roles = list("Chief Medical Officer", "Paramedic", "Medical Doctor", "Psychiatrist", "Search and Rescue", "Chemist") - -/datum/gear/uniform/jeans_qm - display_name = "jeans, QM" - path = /obj/item/clothing/under/rank/cargo/jeans - allowed_roles = list("Quartermaster") - -/datum/gear/uniform/jeans_qmf - display_name = "female jeans, QM" - path = /obj/item/clothing/under/rank/cargo/jeans/female - allowed_roles = list("Quartermaster") - -/datum/gear/uniform/jeans_cargo - display_name = "jeans, cargo" - path = /obj/item/clothing/under/rank/cargotech/jeans - allowed_roles = list("Quartermaster","Cargo Technician") - -/datum/gear/uniform/jeans_cargof - display_name = "female jeans, cargo" - path = /obj/item/clothing/under/rank/cargotech/jeans/female - allowed_roles = list("Quartermaster","Cargo Technician") - /datum/gear/uniform/suit/lawyer display_name = "suit, one-piece selection" path = /obj/item/clothing/under/lawyer @@ -302,57 +192,6 @@ display_name = "flame dress" path = /obj/item/clothing/under/dress/dress_fire -/datum/gear/uniform/uniform_captain - display_name = "uniform, site manager's dress" - path = /obj/item/clothing/under/dress/dress_cap - allowed_roles = list("Site Manager") - -/datum/gear/uniform/corpdetsuit - display_name = "uniform, corporate (Detective)" - path = /obj/item/clothing/under/det/corporate - allowed_roles = list("Detective","Head of Security") - -/datum/gear/uniform/corpsecsuit - display_name = "uniform, corporate (Security)" - path = /obj/item/clothing/under/rank/security/corp - allowed_roles = list("Security Officer","Head of Security","Warden","Blueshield Guard","Security Pilot") //YW ADDITIONS - -/datum/gear/uniform/corpwarsuit - display_name = "uniform, corporate (Warden)" - path = /obj/item/clothing/under/rank/warden/corp - allowed_roles = list("Head of Security","Warden") - -/datum/gear/uniform/corphossuit - display_name = "uniform, corporate (Head of Security)" - path = /obj/item/clothing/under/rank/head_of_security/corp - allowed_roles = list("Head of Security") - -/datum/gear/uniform/uniform_hop - display_name = "uniform, HoP's dress" - path = /obj/item/clothing/under/dress/dress_hop - allowed_roles = list("Head of Personnel") - -/datum/gear/uniform/uniform_hr - display_name = "uniform, HR director (HoP)" - path = /obj/item/clothing/under/dress/dress_hr - - allowed_roles = list("Head of Personnel") - -/datum/gear/uniform/navysecsuit - display_name = "uniform, navy blue (Security)" - path = /obj/item/clothing/under/rank/security/navyblue - allowed_roles = list("Security Officer","Head of Security","Warden","Blueshield Guard","Security Pilot") //YW ADDITIONS - -/datum/gear/uniform/navywarsuit - display_name = "uniform, navy blue (Warden)" - path = /obj/item/clothing/under/rank/warden/navyblue - allowed_roles = list("Head of Security","Warden") - -/datum/gear/uniform/navyhossuit - display_name = "uniform, navy blue (Head of Security)" - path = /obj/item/clothing/under/rank/head_of_security/navyblue - allowed_roles = list("Head of Security") - /datum/gear/uniform/shortplaindress display_name = "plain dress" path = /obj/item/clothing/under/dress/white3 @@ -408,18 +247,6 @@ maids[initial(maid_type.name)] = maid_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(maids)) -/datum/gear/uniform/utility - display_name = "utility, black" - path = /obj/item/clothing/under/utility - -/datum/gear/uniform/utility/blue - display_name = "utility, blue" - path = /obj/item/clothing/under/utility/blue - -/datum/gear/uniform/utility/grey - display_name = "utility, grey" - path = /obj/item/clothing/under/utility/grey - /datum/gear/uniform/sweater display_name = "sweater, grey" path = /obj/item/clothing/under/rank/psych/turtleneck/sweater @@ -648,26 +475,6 @@ ..() gear_tweaks += gear_tweak_free_color_choice -/datum/gear/uniform/paramedunidark - display_name = "paramedic uniform, dark" - path = /obj/item/clothing/under/rank/paramedunidark - allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") - -/datum/gear/uniform/parameduniskirtdark - display_name = "paramedic skirt, dark" - path = /obj/item/clothing/under/rank/parameduniskirtdark - allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") - -/datum/gear/uniform/paramedunilight - display_name = "paramedic uniform, light" - path = /obj/item/clothing/under/rank/paramedunilight - allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") - -/datum/gear/uniform/parameduniskirtlight - display_name = "paramedic skirt, light" - path = /obj/item/clothing/under/rank/parameduniskirtlight - allowed_roles = list("Medical Doctor","Chief Medical Officer","Paramedic") - /datum/gear/uniform/tourist_1 display_name = "tourist outfit, white" path = /obj/item/clothing/under/tourist_1 @@ -690,14 +497,6 @@ ) gear_tweaks += new/datum/gear_tweak/path(cowboy_outfits) -/datum/gear/uniform/utility/gsa - display_name = "utility, galactic survey" - path = /obj/item/clothing/under/gsa - -/datum/gear/uniform/utility/gsa_work - display_name = "heavy utility, galactic survey" - path = /obj/item/clothing/under/gsa_work - /* * 80s */ @@ -717,75 +516,3 @@ /datum/gear/uniform/tropical_outfit/blue display_name = "tropical outfit, miami vice" path = /obj/item/clothing/under/tropical/blue - -/* - * Branded Uniforms - */ - -/datum/gear/uniform/brandsuit/mbill - display_name = "uniform, major bill's" - path = /obj/item/clothing/under/mbill - -/datum/gear/uniform/brandsuit/mbill_flight - display_name = "uniform, major bill's flightsuit (Pilot)" - path = /obj/item/clothing/under/mbill_flight - allowed_roles = list("Pilot") - -/datum/gear/uniform/brandsuit/aether - display_name = "jumpsuit, aether" - path = /obj/item/clothing/under/corp/aether - -/datum/gear/uniform/brandsuit/focal - display_name = "jumpsuit, focal" - path = /obj/item/clothing/under/corp/focal - -/datum/gear/uniform/brandsuit/pcrc - display_name = "uniform, PCRC (Security)" - path = /obj/item/clothing/under/corp/pcrc - allowed_roles = list("Security Officer","Head of Security","Warden") - -/datum/gear/uniform/brandsuit/grayson - display_name = "outfit, grayson" - path = /obj/item/clothing/under/corp/grayson - -/datum/gear/uniform/brandsuit/grayson_jump - display_name = "jumpsuit, grayson" - path = /obj/item/clothing/under/corp/grayson_jump - -/datum/gear/uniform/brandsuit/wardt - display_name = "jumpsuit, ward-takahashi" - path = /obj/item/clothing/under/corp/wardt - -/datum/gear/uniform/brandsuit/hephaestus - display_name = "jumpsuit, hephaestus" - path = /obj/item/clothing/under/corp/hephaestus - -/datum/gear/uniform/brandsuit/centauri - display_name = "jumpsuit, centauri provisions" - path = /obj/item/clothing/under/corp/centauri - -/datum/gear/uniform/brandsuit/morpheus - display_name = "jumpsuit, morpheus" - path = /obj/item/clothing/under/corp/morpheus - -/datum/gear/uniform/brandsuit/wulf - display_name = "jumpsuit, wulf" - path = /obj/item/clothing/under/corp/wulf - -/datum/gear/uniform/brandsuit/zenghu - display_name = "jumpsuit, zeng-hu" - path = /obj/item/clothing/under/corp/zenghu - -/datum/gear/uniform/brandsuit/xion - display_name = "jumpsuit, xion" - path = /obj/item/clothing/under/corp/xion - -/datum/gear/uniform/brandsuit/vedmed - display_name = "jumpsuit, vey-med (Medical)" - path = /obj/item/clothing/under/corp/veymed - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Psychiatrist","Paramedic") - -/datum/gear/uniform/brandsuit/kaleidoscope - display_name = "outfit, kaleidoscope (Science)" - path = /obj/item/clothing/under/corp/kaleidoscope - allowed_roles = list("Research Director","Scientist","Xenobiologist") diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm index 07a179b7ce..9de81f6a19 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform_vr.dm @@ -11,52 +11,6 @@ display_name = "pt uniform, planetside sec" path = /obj/item/clothing/under/solgov/pt/sifguard -/datum/gear/uniform/job_skirt/sci - allowed_roles = list("Research Director","Scientist", "Xenobiologist", "Xenobotanist") - -/datum/gear/uniform/job_turtle/science - allowed_roles = list("Research Director", "Scientist", "Roboticist", "Xenobiologist", "Xenobotanist") - -/datum/gear/uniform/job_turtle/medical - display_name = "turtleneck, medical" - path = /obj/item/clothing/under/rank/medical/turtleneck - allowed_roles = list("Chief Medical Officer", "Paramedic", "Medical Doctor", "Psychiatrist", "Chemist", "Field Medic") // YW EDIT Field medic - -//KHI Uniforms -/datum/gear/uniform/job_khi/cmd - display_name = "khi uniform, cmd" - path = /obj/item/clothing/under/rank/khi/cmd - allowed_roles = list("Head of Security","Site Manager","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Blueshield Guard") //YW ADDITIONS - -/datum/gear/uniform/job_khi/sec - display_name = "khi uniform, sec" - path = /obj/item/clothing/under/rank/khi/sec - allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer","Blueshield Guard","Security Pilot") //YW ADDITIONS - -/datum/gear/uniform/job_khi/med - display_name = "khi uniform, med" - path = /obj/item/clothing/under/rank/khi/med - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Psychiatrist", "Field Medic") // YW EDIT Field medic - -/datum/gear/uniform/job_khi/eng - display_name = "khi uniform, eng" - path = /obj/item/clothing/under/rank/khi/eng - allowed_roles = list("Chief Engineer","Atmospheric Technician","Engineer") - -/datum/gear/uniform/job_khi/sci - display_name = "khi uniform, sci" - path = /obj/item/clothing/under/rank/khi/sci - allowed_roles = list("Research Director", "Scientist", "Roboticist", "Xenobiologist", "Xenobotanist") - -/datum/gear/uniform/job_khi/crg - display_name = "khi uniform, cargo" - path = /obj/item/clothing/under/rank/khi/crg - allowed_roles = list("Quartermaster", "Cargo Technician", "Shaft Miner") - -/datum/gear/uniform/job_khi/civ - display_name = "khi uniform, civ" - path = /obj/item/clothing/under/rank/khi/civ - //Federation jackets /datum/gear/suit/job_fed/sec display_name = "fed uniform, sec" @@ -72,56 +26,6 @@ display_name = "fed uniform, eng" path = /obj/item/clothing/suit/storage/fluff/fedcoat/fedeng allowed_roles = list("Chief Engineer","Atmospheric Technician","Engineer") - -// Trekie things -//TOS -/datum/gear/uniform/job_trek/cmd/tos - display_name = "TOS uniform, cmd" - path = /obj/item/clothing/under/rank/trek/command - allowed_roles = list("Head of Security","Site Manager","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Blueshield Guard") //YW ADDITIONS - -/datum/gear/uniform/job_trek/medsci/tos - display_name = "TOS uniform, med/sci" - path = /obj/item/clothing/under/rank/trek/medsci - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist", "Xenobotanist", "Field Medic") // YW EDIT Field medic - -/datum/gear/uniform/job_trek/eng/tos - display_name = "TOS uniform, eng/sec" - path = /obj/item/clothing/under/rank/trek/engsec - allowed_roles = list("Chief Engineer","Atmospheric Technician","Engineer","Warden","Detective","Security Officer","Head of Security","Blueshield Guard","Security Pilot") //YW ADDITIONS - -//TNG -/datum/gear/uniform/job_trek/cmd/tng - display_name = "TNG uniform, cmd" - path = /obj/item/clothing/under/rank/trek/command/next - allowed_roles = list("Head of Security","Site Manager","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Blueshield Guard") //YW ADDITIONS - -/datum/gear/uniform/job_trek/medsci/tng - display_name = "TNG uniform, med/sci" - path = /obj/item/clothing/under/rank/trek/medsci/next - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist", "Xenobotanist", "Field Medic") // YW EDIT Field medic - -/datum/gear/uniform/job_trek/eng/tng - display_name = "TNG uniform, eng/sec" - path = /obj/item/clothing/under/rank/trek/engsec/next - allowed_roles = list("Chief Engineer","Atmospheric Technician","Engineer","Warden","Detective","Security Officer","Head of Security","Blueshield Guard","Security Pilot") //YW ADDITIONS - -//VOY -/datum/gear/uniform/job_trek/cmd/voy - display_name = "VOY uniform, cmd" - path = /obj/item/clothing/under/rank/trek/command/voy - allowed_roles = list("Head of Security","Site Manager","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Blueshield Guard") //YW ADDITIONS - -/datum/gear/uniform/job_trek/medsci/voy - display_name = "VOY uniform, med/sci" - path = /obj/item/clothing/under/rank/trek/medsci/voy - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist", "Xenobotanist", "Field Medic") // YW EDIT Field medic - -/datum/gear/uniform/job_trek/eng/voy - display_name = "VOY uniform, eng/sec" - path = /obj/item/clothing/under/rank/trek/engsec/voy - allowed_roles = list("Chief Engineer","Atmospheric Technician","Engineer","Warden","Detective","Security Officer","Head of Security","Pathfinder","Explorer","Field Medic","Blueshield Guard","Security Pilot") //YW ADDITIONS - //DS9 /datum/gear/suit/job_trek/ds9_coat @@ -132,38 +36,6 @@ "Scientist","Roboticist","Xenobiologist","Xenobotanist","Atmospheric Technician", "Engineer","Warden","Detective","Security Officer", "Pathfinder", "Explorer", "Field Medic", "Blueshield Guard","Security Pilot") //YW ADDITIONS, Blueshield, Sec pilot, Exploration - -/datum/gear/uniform/job_trek/cmd/ds9 - display_name = "DS9 uniform, cmd" - path = /obj/item/clothing/under/rank/trek/command/ds9 - allowed_roles = list("Head of Security","Site Manager","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Blueshield Guard") //YW ADDITIONS - -/datum/gear/uniform/job_trek/medsci/ds9 - display_name = "DS9 uniform, med/sci" - path = /obj/item/clothing/under/rank/trek/medsci/ds9 - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist", "Xenobotanist", "Field Medic") // YW EDIT Field medic - -/datum/gear/uniform/job_trek/eng/ds9 - display_name = "DS9 uniform, eng/sec" - path = /obj/item/clothing/under/rank/trek/engsec/ds9 - allowed_roles = list("Chief Engineer","Atmospheric Technician","Engineer","Warden","Detective","Security Officer","Head of Security","Blueshield Guard","Security Pilot") //YW ADDITIONS - - -//ENT -/datum/gear/uniform/job_trek/cmd/ent - display_name = "ENT uniform, cmd" - path = /obj/item/clothing/under/rank/trek/command/ent - allowed_roles = list("Head of Security","Site Manager","Head of Personnel","Chief Engineer","Research Director","Chief Medical Officer","Blueshield Guard") //YW ADDITIONS - -/datum/gear/uniform/job_trek/medsci/ent - display_name = "ENT uniform, med/sci" - path = /obj/item/clothing/under/rank/trek/medsci/ent - allowed_roles = list("Chief Medical Officer","Medical Doctor","Chemist","Paramedic","Geneticist","Research Director","Scientist", "Roboticist", "Xenobiologist", "Xenobotanist", "Field Medic") // YW EDIT Field medic - -/datum/gear/uniform/job_trek/eng/ent - display_name = "ENT uniform, eng/sec" - path = /obj/item/clothing/under/rank/trek/engsec/ent - allowed_roles = list("Chief Engineer","Atmospheric Technician","Engineer","Warden","Detective","Security Officer","Head of Security","Blueshield Guard","Security Pilot") //YW ADDITIONS /* Swimsuits */ @@ -269,26 +141,6 @@ Talon jumpsuit suits[initial(undersuit_type.name)] = undersuit_type gear_tweaks += new/datum/gear_tweak/path(sortAssoc(suits)) -/datum/gear/uniform/undersuit_haz - display_name = "undersuit, hazard (Engineering)" - allowed_roles = list("Chief Engineer", "Atmospheric Technician", "Engineer") - path = /obj/item/clothing/under/undersuit/hazard - -/datum/gear/uniform/undersuit_sec - display_name = "undersuit, security (Security)" - allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer") - path = /obj/item/clothing/under/undersuit/sec - -/datum/gear/uniform/undersuit_hos - display_name = "undersuit, security command (HoS)" - allowed_roles = list("Head of Security") - path = /obj/item/clothing/under/undersuit/sec/hos - -/datum/gear/uniform/undersuit_com - display_name = "undersuit, command (SM/HoP)" - allowed_roles = list("Site Manager", "Head of Personnel") - path = /obj/item/clothing/under/undersuit/command - //Altevian Uniforms /datum/gear/uniform/altevian description = "An extremely comfortable set of clothing that's made to help people handle their day to day work around the fleets with little to no discomfort." @@ -315,12 +167,6 @@ Talon jumpsuit jumpsuits[initial(jumpsuit.name)] = jumpsuit gear_tweaks += new/datum/gear_tweak/path(sortAssoc(jumpsuits)) -//Modernized Sec Jumpsuit -/datum/gear/uniform/modernsec - display_name = "undersuit, security, modernized (Security)" - allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer") - path = /obj/item/clothing/under/rank/security/modern - /datum/gear/uniform/singer_blue display_name = "blue singer dress" path = /obj/item/clothing/under/dress/singer @@ -365,4 +211,4 @@ Talon jumpsuit /datum/gear/uniform/stripeddungarees display_name = "striped dungarees" - path = /obj/item/clothing/under/stripeddungarees \ No newline at end of file + path = /obj/item/clothing/under/stripeddungarees diff --git a/code/modules/client/preferences_factions.dm b/code/modules/client/preferences_factions.dm index 74ba6b78ca..f0f357132f 100644 --- a/code/modules/client/preferences_factions.dm +++ b/code/modules/client/preferences_factions.dm @@ -25,7 +25,6 @@ var/global/list/citizenship_choices = list( "Third Ares Confederation", "Teshari Expeditionary Fleet", "Altevian Hegemony", - "Kitsuhana Heavy Industries", "Kosaky Fleets" ) @@ -39,7 +38,6 @@ var/global/list/home_system_choices = list( "Titan, Sol", "Toledo, New Ohio", "The Pact, Myria", - "Kitsuhana Prime", "Kishar, Alpha Centauri", "Anshar, Alpha Centauri", "Heaven Complex, Alpha Centauri", @@ -92,7 +90,6 @@ var/global/list/faction_choices = list( "Gilthari Exports", "Coyote Salvage Corp.", "Chimera Genetics Corp.", - "Kitsuhana Heavy Industries", "Independent Pilots Association", "Local System Defense Force", "United Solar Defense Force", diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index bbf0809bc4..c2c597ad7b 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -106,3 +106,9 @@ desc = "It's a field cap in white, with a blue cross on the front." icon_state = "medsoft" item_state_slots = list(slot_r_hand_str = "mimesoft", slot_l_hand_str = "mimesoft") + +/obj/item/clothing/head/soft/paramed + name = "paramedic's cap" + desc = "It's a field cap in dark blue, with a white cross on the front." + icon_state = "emtsoft" + item_state_slots = list(slot_r_hand_str = "bluesoft", slot_l_hand_str = "bluesoft") diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/under/accessories/accessory_vr.dm index b9cb44faea..4aaff66354 100644 --- a/code/modules/clothing/under/accessories/accessory_vr.dm +++ b/code/modules/clothing/under/accessories/accessory_vr.dm @@ -127,7 +127,7 @@ usr.audible_message("[usr] jingles the [src]'s bell.", runemessage = "jingle") playsound(src, 'sound/items/pickup/ring.ogg', 50, 1) jingled = 1 - addtimer(CALLBACK(src, .proc/jingledreset), 50) + addtimer(CALLBACK(src, PROC_REF(jingledreset)), 50) return /obj/item/clothing/accessory/collar/bell/proc/jingledreset() @@ -721,4 +721,4 @@ name = "drab crop jacket" desc = "A cut down jacket that looks like it's light enough to wear on top of some other clothes. This one's a sort of olive-drab kind of colour." icon_state = "cropjacket_drab" - item_state = "cropjacket_drab" \ No newline at end of file + item_state = "cropjacket_drab" diff --git a/code/modules/economy/vending.dm b/code/modules/economy/vending.dm index 929023ce86..e17d5c951f 100644 --- a/code/modules/economy/vending.dm +++ b/code/modules/economy/vending.dm @@ -619,7 +619,7 @@ GLOBAL_LIST_EMPTY(vending_products) use_power(vend_power_usage) //actuators and stuff flick("[icon_state]-vend",src) - addtimer(CALLBACK(src, .proc/delayed_vend, R, user), vend_delay) + addtimer(CALLBACK(src, PROC_REF(delayed_vend), R, user), vend_delay) /obj/machinery/vending/proc/delayed_vend(datum/stored_item/vending_product/R, mob/user) R.get_product(get_turf(src)) @@ -777,7 +777,7 @@ GLOBAL_LIST_EMPTY(vending_products) if(!throw_item) return FALSE throw_item.vendor_action(src) - INVOKE_ASYNC(throw_item, /atom/movable.proc/throw_at, target, rand(3, 10), rand(1, 3), src) + INVOKE_ASYNC(throw_item, TYPE_PROC_REF(/atom/movable, throw_at), target, rand(3, 10), rand(1, 3), src) visible_message("\The [src] launches \a [throw_item] at \the [target]!") return 1 diff --git a/code/modules/economy/vending_machines.dm b/code/modules/economy/vending_machines.dm index 0471788413..ed4c16fdba 100644 --- a/code/modules/economy/vending_machines.dm +++ b/code/modules/economy/vending_machines.dm @@ -329,12 +329,14 @@ /obj/item/weapon/storage/fancy/cigarettes/luckystars = 10, /obj/item/weapon/storage/fancy/cigarettes/jerichos = 10, /obj/item/weapon/storage/fancy/cigarettes/menthols = 10, + /obj/item/weapon/storage/fancy/cigarettes/carcinomas = 10, + /obj/item/weapon/storage/fancy/cigarettes/professionals = 10, /obj/item/weapon/storage/rollingpapers = 10, /obj/item/weapon/storage/rollingpapers/blunt = 10, /obj/item/weapon/storage/chewables/tobacco = 5, /obj/item/weapon/storage/chewables/tobacco/fine = 5, /obj/item/weapon/storage/box/matches = 10, - /obj/item/weapon/flame/lighter/random = 4, + /obj/item/weapon/flame/lighter = 4, /obj/item/clothing/mask/smokable/ecig/util = 2, ///obj/item/clothing/mask/smokable/ecig/deluxe = 2, /obj/item/clothing/mask/smokable/ecig/simple = 2, @@ -349,21 +351,21 @@ /obj/item/weapon/reagent_containers/ecig_cartridge/blanknico = 2, /obj/item/weapon/storage/box/fancy/chewables/tobacco/nico = 5) contraband = list(/obj/item/weapon/flame/lighter/zippo = 4) - premium = list(/obj/item/weapon/storage/fancy/cigar = 5, - /obj/item/weapon/storage/fancy/cigarettes/carcinomas = 5, - /obj/item/weapon/storage/fancy/cigarettes/professionals = 5) + premium = list(/obj/item/weapon/storage/fancy/cigar = 5) prices = list(/obj/item/weapon/storage/fancy/cigarettes = 12, /obj/item/weapon/storage/fancy/cigarettes/dromedaryco = 20, /obj/item/weapon/storage/fancy/cigarettes/killthroat = 14, /obj/item/weapon/storage/fancy/cigarettes/luckystars = 17, /obj/item/weapon/storage/fancy/cigarettes/jerichos = 22, /obj/item/weapon/storage/fancy/cigarettes/menthols = 18, + /obj/item/weapon/storage/fancy/cigarettes/carcinomas = 24, + /obj/item/weapon/storage/fancy/cigarettes/professionals = 27, /obj/item/weapon/storage/rollingpapers = 10, /obj/item/weapon/storage/rollingpapers/blunt = 20, /obj/item/weapon/storage/chewables/tobacco = 10, /obj/item/weapon/storage/chewables/tobacco/fine = 20, /obj/item/weapon/storage/box/matches = 1, - /obj/item/weapon/flame/lighter/random = 2, + /obj/item/weapon/flame/lighter/ = 2, /obj/item/clothing/mask/smokable/ecig/util = 100, ///obj/item/clothing/mask/smokable/ecig/deluxe = 300, /obj/item/clothing/mask/smokable/ecig/simple = 150, diff --git a/code/modules/economy/vending_machines_vr.dm b/code/modules/economy/vending_machines_vr.dm index 73dcab7895..b561cf7f31 100644 --- a/code/modules/economy/vending_machines_vr.dm +++ b/code/modules/economy/vending_machines_vr.dm @@ -3519,6 +3519,8 @@ /obj/item/weapon/reagent_containers/food/snacks/ratfruitcake = 15, /obj/item/weapon/reagent_containers/food/snacks/ratpackburger = 8, /obj/item/weapon/reagent_containers/food/snacks/ratpackcheese = 8, + /obj/item/weapon/reagent_containers/food/snacks/ratpackramen = 8, + /obj/item/weapon/reagent_containers/food/snacks/ratpacktaco = 8, /obj/item/weapon/reagent_containers/food/snacks/ratpackturkey = 2) prices = list(/obj/item/weapon/reagent_containers/food/snacks/ratprotein = 8, @@ -3527,4 +3529,6 @@ /obj/item/weapon/reagent_containers/food/snacks/ratfruitcake = 8, /obj/item/weapon/reagent_containers/food/snacks/ratpackburger = 10, /obj/item/weapon/reagent_containers/food/snacks/ratpackcheese = 10, + /obj/item/weapon/reagent_containers/food/snacks/ratpackramen = 10, + /obj/item/weapon/reagent_containers/food/snacks/ratpacktaco = 10, /obj/item/weapon/reagent_containers/food/snacks/ratpackturkey = 200) diff --git a/code/modules/eventkit/event_machinery.dm b/code/modules/eventkit/event_machinery.dm new file mode 100644 index 0000000000..be65102625 --- /dev/null +++ b/code/modules/eventkit/event_machinery.dm @@ -0,0 +1,3 @@ +/obj/machinery/eventkit/custom + name = "Custom Machine" + desc = "A custom machine created by a GM." diff --git a/code/modules/eventkit/gm_interfaces/mob_spawner.dm b/code/modules/eventkit/gm_interfaces/mob_spawner.dm new file mode 100644 index 0000000000..568875065f --- /dev/null +++ b/code/modules/eventkit/gm_interfaces/mob_spawner.dm @@ -0,0 +1,139 @@ +/datum/eventkit/mob_spawner + // The path of the mob to be spawned + var/path + + // Defines if the location of the spawned mob should be bound of the users position + var/loc_lock = FALSE + +/datum/eventkit/mob_spawner/New() + . = ..() + +/datum/eventkit/mob_spawner/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "MobSpawner", "EventKit - Mob Spawner") + ui.set_autoupdate(FALSE) + ui.open() + +/datum/eventkit/mob_spawner/Destroy() + . = ..() + +/datum/eventkit/mob_spawner/tgui_state(mob/user) + return GLOB.tgui_admin_state + +/datum/eventkit/mob_spawner/tgui_static_data(mob/user) + var/list/data = list() + + data["initial_x"] = usr.x; + data["initial_y"] = usr.y; + data["initial_z"] = usr.z; + + return data + +/datum/eventkit/mob_spawner/tgui_data(mob/user) + var/list/data = list() + + data["loc_lock"] = loc_lock; + if(loc_lock) + data["loc_x"] = usr.x; + data["loc_y"] = usr.y; + data["loc_z"] = usr.z; + + data["path"] = path; + + if(path) + var/mob/M = new path(); + if(M) + data["default_path_name"] = M.name; + data["default_desc"] = M.desc; + data["default_flavor_text"] = M.flavor_text; + qdel(M); + + return data + +/datum/eventkit/mob_spawner/tgui_act(action, list/params) + . = ..() + if(.) + return + if(!check_rights_for(usr.client, R_SPAWN)) + return + switch(action) + if("select_path") + var/list/choices = typesof(/mob) + var/newPath = tgui_input_list(usr, "Please select the new path of the mob you want to spawn.", items = choices) + + path = newPath + + return TRUE + if("loc_lock") + loc_lock = !loc_lock + return TRUE + if("start_spawn") + var/confirm = tgui_alert(usr, "Are you sure that you want to start spawning your custom mobs?", "Confirmation", list("Yes", "Cancel")) + + if(confirm != "Yes") + return FALSE + + var/amount = params["amount"] + var/name = params["name"] + var/x = params["x"] + var/y = params["y"] + var/z = params["z"] + + if(!name) + to_chat(usr, "Name cannot be empty.") + return FALSE + + var/turf/T = locate(x, y, z) + if(!T) + to_chat(usr, "Those coordinates are outside the boundaries of the map.") + return FALSE + + for(var/i = 0, i < amount, i++) + if(ispath(path,/turf)) + var/turf/TU = get_turf(locate(x, y, z)) + TU.ChangeTurf(path) + else + var/mob/M = new path(usr.loc) + + M.name = sanitize(name) + M.desc = sanitize(params["desc"]) + M.flavor_text = sanitize(params["flavor_text"]) + + /* + WIP: Radius around selected coords + + var/list/turf/destTurfs + for(var/turf/RT in orange(T, params["r"])) + destTurfs += RT + + var/turf/targetTurf = rand(0,length(destTurfs)) + */ + + var/size_mul = params["size_multiplier"] + if(isnum(size_mul)) + M.size_multiplier = size_mul + M.update_icon() + else + to_chat(usr, "Size Multiplier not applied: ([size_mul]) is not a valid input.") + + M.forceMove(T) + + log_and_message_admins("spawned [path] ([name]) at ([x],[y],[z]) [amount] times.") + + return TRUE + +/datum/eventkit/mob_spawner/tgui_close(mob/user) + . = ..() + qdel(src) + +/client/proc/eventkit_open_mob_spawner() + set category = "EventKit" + set name = "Open Mob Spawner" + set desc = "Opens an advanced version of the mob spawner." + + if(!check_rights(R_SPAWN)) + return + + var/datum/eventkit/mob_spawner/spawner = new() + spawner.tgui_interact(usr) diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm index 7f991b44fc..5f7640b321 100644 --- a/code/modules/events/carp_migration.dm +++ b/code/modules/events/carp_migration.dm @@ -69,7 +69,7 @@ // Spawn a single carp at given location. /datum/event/carp_migration/proc/spawn_one_carp(var/loc) var/mob/living/simple_mob/animal/M = new /mob/living/simple_mob/animal/space/carp/event(loc) - GLOB.destroyed_event.register(M, src, .proc/on_carp_destruction) + GLOB.destroyed_event.register(M, src, PROC_REF(on_carp_destruction)) spawned_carp.Add(M) return M @@ -83,7 +83,7 @@ // If carp is bomphed, remove it from the list. /datum/event/carp_migration/proc/on_carp_destruction(var/mob/M) spawned_carp -= M - GLOB.destroyed_event.unregister(M, src, .proc/on_carp_destruction) + GLOB.destroyed_event.unregister(M, src, PROC_REF(on_carp_destruction)) /datum/event/carp_migration/end() . = ..() diff --git a/code/modules/events/gnat_migration.dm b/code/modules/events/gnat_migration.dm index e807f85b3c..8d0428eab8 100644 --- a/code/modules/events/gnat_migration.dm +++ b/code/modules/events/gnat_migration.dm @@ -69,7 +69,7 @@ // Spawn a single gnat at given location. /datum/event/gnat_migration/proc/spawn_one_gnat(var/loc) var/mob/living/simple_mob/animal/M = new /mob/living/simple_mob/animal/space/gnat(loc) - GLOB.destroyed_event.register(M, src, .proc/on_gnat_destruction) + GLOB.destroyed_event.register(M, src, PROC_REF(on_gnat_destruction)) spawned_gnat.Add(M) return M @@ -83,7 +83,7 @@ // If gnat is bomphed, remove it from the list. /datum/event/gnat_migration/proc/on_gnat_destruction(var/mob/M) spawned_gnat -= M - GLOB.destroyed_event.unregister(M, src, .proc/on_gnat_destruction) + GLOB.destroyed_event.unregister(M, src, PROC_REF(on_gnat_destruction)) /datum/event/gnat_migration/end() . = ..() diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm index d0d221d5fd..17fcdec8d6 100644 --- a/code/modules/events/infestation.dm +++ b/code/modules/events/infestation.dm @@ -53,7 +53,7 @@ // Spawn a single vermin at given location. /datum/event/infestation/proc/spawn_one_vermin(var/loc) var/mob/living/simple_mob/animal/M = new spawn_types(loc) - GLOB.destroyed_event.register(M, src, .proc/on_vermin_destruction) + GLOB.destroyed_event.register(M, src, PROC_REF(on_vermin_destruction)) spawned_vermin.Add(M) return M @@ -67,7 +67,7 @@ // If vermin is kill, remove it from the list. /datum/event/infestation/proc/on_vermin_destruction(var/mob/M) spawned_vermin -= M - GLOB.destroyed_event.unregister(M, src, .proc/on_vermin_destruction) + GLOB.destroyed_event.unregister(M, src, PROC_REF(on_vermin_destruction)) @@ -75,4 +75,4 @@ command_announcement.Announce("Bioscans indicate that [vermstring] have been breeding all over the facility. Clear them out, before this starts to affect productivity.", "Vermin infestation") #undef VERM_MICE -#undef VERM_LIZARDS \ No newline at end of file +#undef VERM_LIZARDS diff --git a/code/modules/events/jellyfish_migration.dm b/code/modules/events/jellyfish_migration.dm index 7498539ae1..0a0f639451 100644 --- a/code/modules/events/jellyfish_migration.dm +++ b/code/modules/events/jellyfish_migration.dm @@ -69,7 +69,7 @@ // Spawn a single jellyfish at given location. /datum/event/jellyfish_migration/proc/spawn_one_jellyfish(var/loc) var/mob/living/simple_mob/animal/M = new /mob/living/simple_mob/vore/alienanimals/space_jellyfish(loc) - GLOB.destroyed_event.register(M, src, .proc/on_jellyfish_destruction) + GLOB.destroyed_event.register(M, src, PROC_REF(on_jellyfish_destruction)) spawned_jellyfish.Add(M) return M @@ -83,7 +83,7 @@ // If jellyfish is bomphed, remove it from the list. /datum/event/jellyfish_migration/proc/on_jellyfish_destruction(var/mob/M) spawned_jellyfish -= M - GLOB.destroyed_event.unregister(M, src, .proc/on_jellyfish_destruction) + GLOB.destroyed_event.unregister(M, src, PROC_REF(on_jellyfish_destruction)) /datum/event/jellyfish_migration/end() . = ..() diff --git a/code/modules/events/ray_migration.dm b/code/modules/events/ray_migration.dm index 3df3971a81..559f77169b 100644 --- a/code/modules/events/ray_migration.dm +++ b/code/modules/events/ray_migration.dm @@ -69,7 +69,7 @@ // Spawn a single ray at given location. /datum/event/ray_migration/proc/spawn_one_ray(var/loc) var/mob/living/simple_mob/animal/M = new /mob/living/simple_mob/animal/space/ray(loc) - GLOB.destroyed_event.register(M, src, .proc/on_ray_destruction) + GLOB.destroyed_event.register(M, src, PROC_REF(on_ray_destruction)) spawned_ray.Add(M) return M @@ -83,7 +83,7 @@ // If ray is bomphed, remove it from the list. /datum/event/ray_migration/proc/on_ray_destruction(var/mob/M) spawned_ray -= M - GLOB.destroyed_event.unregister(M, src, .proc/on_ray_destruction) + GLOB.destroyed_event.unregister(M, src, PROC_REF(on_ray_destruction)) /datum/event/ray_migration/end() . = ..() diff --git a/code/modules/events/shark_migration.dm b/code/modules/events/shark_migration.dm index 7baed0af9c..dc3d0d9438 100644 --- a/code/modules/events/shark_migration.dm +++ b/code/modules/events/shark_migration.dm @@ -69,7 +69,7 @@ // Spawn a single shark at given location. /datum/event/shark_migration/proc/spawn_one_shark(var/loc) var/mob/living/simple_mob/animal/M = new /mob/living/simple_mob/animal/space/shark/event(loc) - GLOB.destroyed_event.register(M, src, .proc/on_shark_destruction) + GLOB.destroyed_event.register(M, src, PROC_REF(on_shark_destruction)) spawned_shark.Add(M) return M @@ -83,7 +83,7 @@ // If shark is bomphed, remove it from the list. /datum/event/shark_migration/proc/on_shark_destruction(var/mob/M) spawned_shark -= M - GLOB.destroyed_event.unregister(M, src, .proc/on_shark_destruction) + GLOB.destroyed_event.unregister(M, src, PROC_REF(on_shark_destruction)) /datum/event/shark_migration/end() . = ..() diff --git a/code/modules/ext_scripts/irc.dm b/code/modules/ext_scripts/irc.dm index a554cdd20a..5cfeae553c 100644 --- a/code/modules/ext_scripts/irc.dm +++ b/code/modules/ext_scripts/irc.dm @@ -18,7 +18,7 @@ nudge_lib = "lib/nudge.so" spawn(0) - call(nudge_lib, "nudge")("[config.comms_password]","[config.irc_bot_host]","[channel]","[escape_shell_arg(msg)]") + LIBCALL(nudge_lib, "nudge")("[config.comms_password]","[config.irc_bot_host]","[channel]","[escape_shell_arg(msg)]") else spawn(0) ext_python("ircbot_message.py", "[config.comms_password] [config.irc_bot_host] [channel] [escape_shell_arg(msg)]") @@ -39,4 +39,3 @@ /hook/startup/proc/ircNotify() send2mainirc("Server starting up on byond://[config.serverurl ? config.serverurl : (config.server ? config.server : "[world.address]:[world.port]")]") return 1 - diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index ff5768559d..d00bd2ed4f 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -3579,7 +3579,7 @@ slice_path = /obj/item/weapon/reagent_containers/food/snacks/slice/meatpizza slices_num = 6 center_of_mass = list("x"=16, "y"=11) - nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 15) + nutriment_desc = list("pizza crust" = 10, "tomato" = 10, "cheese" = 15, "meat" = 10) nutriment_amt = 10 bitesize = 2 diff --git a/code/modules/food/kitchen/smartfridge/smartfridge.dm b/code/modules/food/kitchen/smartfridge/smartfridge.dm index c683bf9a60..1a10b3c219 100644 --- a/code/modules/food/kitchen/smartfridge/smartfridge.dm +++ b/code/modules/food/kitchen/smartfridge/smartfridge.dm @@ -119,7 +119,7 @@ user.remove_from_mob(O) stock(O) user.visible_message("[user] has added \the [O] to \the [src].", "You add \the [O] to \the [src].") - sortTim(item_records, /proc/cmp_stored_item_name) + sortTim(item_records, GLOBAL_PROC_REF(cmp_stored_item_name)) else if(istype(O, /obj/item/weapon/storage/bag)) var/obj/item/weapon/storage/bag/P = O diff --git a/code/modules/gamemaster/event2/events/engineering/airlock_failure.dm b/code/modules/gamemaster/event2/events/engineering/airlock_failure.dm index 54548a88dd..c3cd5d0b24 100644 --- a/code/modules/gamemaster/event2/events/engineering/airlock_failure.dm +++ b/code/modules/gamemaster/event2/events/engineering/airlock_failure.dm @@ -70,7 +70,7 @@ for(var/obj/machinery/door/airlock/door in area.contents) if(can_break_door(door)) - addtimer(CALLBACK(src, .proc/break_door, door), 1) // Emagging proc is actually a blocking proc and that's bad for the ticker. + addtimer(CALLBACK(src, PROC_REF(break_door), door), 1) // Emagging proc is actually a blocking proc and that's bad for the ticker. door.visible_message(span("danger", "\The [door]'s panel sparks!")) playsound(door, "sparks", 50, 1) log_debug("Airlock Failure event has broken \the [door] airlock in [area].") diff --git a/code/modules/gamemaster/event2/events/engineering/blob.dm b/code/modules/gamemaster/event2/events/engineering/blob.dm index f3b8a16f8d..048c073f39 100644 --- a/code/modules/gamemaster/event2/events/engineering/blob.dm +++ b/code/modules/gamemaster/event2/events/engineering/blob.dm @@ -106,19 +106,19 @@ for(var/i = 1 to number_of_blobs) var/turf/T = pick(open_turfs) var/obj/structure/blob/core/new_blob = new spawn_blob_type(T) - blobs += weakref(new_blob) + blobs += WEAKREF(new_blob) open_turfs -= T // So we can't put two cores on the same tile if doing multiblob. log_debug("Spawned [new_blob.overmind.blob_type.name] blob at [get_area(new_blob)].") /datum/event2/event/blob/should_end() - for(var/weakref/weakref as anything in blobs) + for(var/datum/weakref/weakref as anything in blobs) if(weakref.resolve()) // If the weakref is resolvable, that means the blob hasn't been deleted yet. return FALSE return TRUE // Only end if all blobs die. // Normally this does nothing, but is useful if aborted by an admin. /datum/event2/event/blob/end() - for(var/weakref/weakref as anything in blobs) + for(var/datum/weakref/weakref as anything in blobs) var/obj/structure/blob/core/B = weakref.resolve() if(istype(B)) qdel(B) @@ -128,7 +128,7 @@ var/danger_level = 0 var/list/blob_type_names = list() var/multiblob = FALSE - for(var/weakref/weakref as anything in blobs) + for(var/datum/weakref/weakref as anything in blobs) var/obj/structure/blob/core/B = weakref.resolve() if(!istype(B)) continue diff --git a/code/modules/gamemaster/event2/events/everyone/radiation_storm.dm b/code/modules/gamemaster/event2/events/everyone/radiation_storm.dm index ebd137b404..c81968c23e 100644 --- a/code/modules/gamemaster/event2/events/everyone/radiation_storm.dm +++ b/code/modules/gamemaster/event2/events/everyone/radiation_storm.dm @@ -38,7 +38,7 @@ Please allow for up to one minute while radiation levels dissipate, and report to \ medbay if you experience any unusual symptoms. Maintenance will lose all \ access again shortly.", "Anomaly Alert") - addtimer(CALLBACK(src, .proc/maint_callback), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(maint_callback)), 2 MINUTES) /datum/event2/event/radiation_storm/proc/maint_callback() revoke_maint_all_access() diff --git a/code/modules/gamemaster/event2/events/mob_spawning.dm b/code/modules/gamemaster/event2/events/mob_spawning.dm index 4f3bcffa02..35321cd2f0 100644 --- a/code/modules/gamemaster/event2/events/mob_spawning.dm +++ b/code/modules/gamemaster/event2/events/mob_spawning.dm @@ -80,7 +80,7 @@ /datum/event2/event/mob_spawning/proc/spawn_one_mob(new_loc, mob_type) var/mob/living/simple_mob/M = new mob_type(new_loc) - GLOB.destroyed_event.register(M, src, .proc/on_mob_destruction) + GLOB.destroyed_event.register(M, src, PROC_REF(on_mob_destruction)) spawned_mobs += M return M @@ -94,4 +94,4 @@ // If simple_mob is bomphed, remove it from the list. /datum/event2/event/mob_spawning/proc/on_mob_destruction(mob/M) spawned_mobs -= M - GLOB.destroyed_event.unregister(M, src, .proc/on_mob_destruction) \ No newline at end of file + GLOB.destroyed_event.unregister(M, src, PROC_REF(on_mob_destruction)) diff --git a/code/modules/gamemaster/event2/events/security/prison_break.dm b/code/modules/gamemaster/event2/events/security/prison_break.dm index 4684f0ae17..80f6ad2f9a 100644 --- a/code/modules/gamemaster/event2/events/security/prison_break.dm +++ b/code/modules/gamemaster/event2/events/security/prison_break.dm @@ -205,7 +205,7 @@ Disabling the main breaker in the APCs will protect the APC's room from being compromised.")) var/time_to_flicker = start_delay - 10 SECONDS - addtimer(CALLBACK(src, .proc/flicker_area), time_to_flicker) + addtimer(CALLBACK(src, PROC_REF(flicker_area)), time_to_flicker) /datum/event2/event/prison_break/proc/flicker_area() diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 6d6693aca5..f88628a694 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -5,6 +5,7 @@ desc = "A tool used to take samples from plants." icon = 'icons/obj/weapons.dmi' icon_state = "clippers" + random_color = FALSE /obj/item/weapon/tool/wirecutters/clippers/trimmers name = "hedgetrimmers" diff --git a/code/modules/instruments/instrument_data/_instrument_data.dm b/code/modules/instruments/instrument_data/_instrument_data.dm index a37d7a2dd9..cf37e25c9b 100644 --- a/code/modules/instruments/instrument_data/_instrument_data.dm +++ b/code/modules/instruments/instrument_data/_instrument_data.dm @@ -88,7 +88,7 @@ samples = list() for(var/key in real_samples) real_keys += text2num(key) - sortTim(real_keys, /proc/cmp_numeric_asc, associative = FALSE) + sortTim(real_keys, GLOBAL_PROC_REF(cmp_numeric_asc), associative = FALSE) for(var/i in 1 to (length(real_keys) - 1)) var/from_key = real_keys[i] diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index def8741909..4d6725f8f1 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -81,8 +81,8 @@ /obj/item/instrument/piano_synth/headphones/Initialize() . = ..() - RegisterSignal(src, COMSIG_SONG_START, .proc/start_playing) - RegisterSignal(src, COMSIG_SONG_END, .proc/stop_playing) + RegisterSignal(src, COMSIG_SONG_START, PROC_REF(start_playing)) + RegisterSignal(src, COMSIG_SONG_END, PROC_REF(stop_playing)) /** * Called by a component signal when our song starts playing. @@ -252,7 +252,7 @@ /obj/item/instrument/harmonica/equipped(mob/M, slot) . = ..() - RegisterSignal(M, COMSIG_MOB_SAY, .proc/handle_speech) + RegisterSignal(M, COMSIG_MOB_SAY, PROC_REF(handle_speech)) /obj/item/instrument/harmonica/dropped(mob/M) . = ..() diff --git a/code/modules/instruments/songs/editor.dm b/code/modules/instruments/songs/editor.dm index d63ae107cd..c4941cec13 100644 --- a/code/modules/instruments/songs/editor.dm +++ b/code/modules/instruments/songs/editor.dm @@ -160,7 +160,7 @@ tempo = sanitize_tempo(tempo + text2num(href_list["tempo"])) else if(href_list["play"]) - INVOKE_ASYNC(src, .proc/start_playing, usr) + INVOKE_ASYNC(src, PROC_REF(start_playing), usr) else if(href_list["newline"]) var/newline = html_encode(tgui_input_text(usr, "Enter your line: ", parent.name)) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 1f08f1dec5..20802b90cc 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -263,7 +263,7 @@ if(proximity) var/scanned = FALSE for(var/obj/item/integrated_circuit/input/sensor/S in contents) -// S.set_pin_data(IC_OUTPUT, 1, weakref(target)) +// S.set_pin_data(IC_OUTPUT, 1, WEAKREF(target)) // S.check_then_do_work() if(S.scan(target)) scanned = TRUE @@ -397,4 +397,4 @@ // Returns TRUE if I is something that could/should have a valid interaction. Used to tell circuitclothes to hit the circuit with something instead of the clothes /obj/item/device/electronic_assembly/proc/is_valid_tool(var/obj/item/I) - return I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/integrated_circuit) || istype(I, /obj/item/weapon/cell/device) || istype(I, /obj/item/device/integrated_electronics) \ No newline at end of file + return I.is_crowbar() || I.is_screwdriver() || istype(I, /obj/item/integrated_circuit) || istype(I, /obj/item/weapon/cell/device) || istype(I, /obj/item/device/integrated_electronics) diff --git a/code/modules/integrated_electronics/core/helpers.dm b/code/modules/integrated_electronics/core/helpers.dm index 8af8f11fba..92d011e08c 100644 --- a/code/modules/integrated_electronics/core/helpers.dm +++ b/code/modules/integrated_electronics/core/helpers.dm @@ -21,7 +21,7 @@ /obj/item/integrated_circuit/proc/set_pin_data(var/pin_type, var/pin_number, datum/new_data) if (istype(new_data) && !isweakref(new_data)) - new_data = weakref(new_data) + new_data = WEAKREF(new_data) var/datum/integrated_io/pin = get_pin_ref(pin_type, pin_number) return pin.write_data_to_pin(new_data) @@ -72,4 +72,4 @@ if(pin) debugger.write_data(pin, usr) return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/integrated_electronics/core/pins.dm b/code/modules/integrated_electronics/core/pins.dm index 1d972fa0d7..cc5cee7672 100644 --- a/code/modules/integrated_electronics/core/pins.dm +++ b/code/modules/integrated_electronics/core/pins.dm @@ -21,7 +21,7 @@ D [1]/ || /datum/integrated_io var/name = "input/output" var/obj/item/integrated_circuit/holder = null - var/weakref/data = null // This is a weakref, to reduce typecasts. Note that oftentimes numbers and text may also occupy this. + var/datum/weakref/data = null // This is a weakref, to reduce typecasts. Note that oftentimes numbers and text may also occupy this. var/list/linked = list() var/io_type = DATA_CHANNEL @@ -47,7 +47,7 @@ D [1]/ || /datum/integrated_io/proc/data_as_type(var/as_type) if(!isweakref(data)) return - var/weakref/w = data + var/datum/weakref/w = data var/output = w.resolve() return istype(output, as_type) ? output : null @@ -82,7 +82,7 @@ list[]( return result if(isweakref(input)) - var/weakref/w = input + var/datum/weakref/w = input var/atom/A = w.resolve() //return A ? "([A.name] \[Ref\])" : "(null)" // For refs, we want just the name displayed. return A ? "(\ref[A] \[Ref\])" : "(null)" diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index bc3b9493e2..f5abc20db1 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -143,7 +143,7 @@ /obj/item/device/integrated_electronics/debugger/afterattack(atom/target, mob/living/user, proximity) if(accepting_refs && proximity) - data_to_write = weakref(target) + data_to_write = WEAKREF(target) visible_message("[user] slides \a [src]'s over \the [target].") to_chat(user, "You set \the [src]'s memory to a reference to [target.name] \[Ref\]. The ref scanner is \ now off.") @@ -154,7 +154,7 @@ io.write_data_to_pin(data_to_write) var/data_to_show = data_to_write if(isweakref(data_to_write)) - var/weakref/w = data_to_write + var/datum/weakref/w = data_to_write var/atom/A = w.resolve() data_to_show = A.name to_chat(user, "You write '[data_to_write ? data_to_show : "NULL"]' to the '[io]' pin of \the [io.holder].") @@ -244,7 +244,7 @@ /obj/item/device/multitool/afterattack(atom/target, mob/living/user, proximity) if(accepting_refs && toolmode == MULTITOOL_MODE_INTCIRCUITS && proximity) - weakref_wiring = weakref(target) + weakref_wiring = WEAKREF(target) visible_message("[user] slides \a [src]'s over \the [target].") to_chat(user, "You set \the [src]'s memory to a reference to [target.name] \[Ref\]. The ref scanner is \ now off.") @@ -550,4 +550,4 @@ if(IC.spawn_flags & spawn_flags_to_use) for(var/i = 1 to 4) new IC.type(src) - make_exact_fit() \ No newline at end of file + make_exact_fit() diff --git a/code/modules/integrated_electronics/passive/power.dm b/code/modules/integrated_electronics/passive/power.dm index 6c5842389e..ecb19ae78e 100644 --- a/code/modules/integrated_electronics/passive/power.dm +++ b/code/modules/integrated_electronics/passive/power.dm @@ -125,7 +125,7 @@ create_reagents(volume) /obj/item/integrated_circuit/passive/power/chemical_cell/interact(mob/user) - set_pin_data(IC_OUTPUT, 2, weakref(src)) + set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) push_data() ..() diff --git a/code/modules/integrated_electronics/subtypes/converters.dm b/code/modules/integrated_electronics/subtypes/converters.dm index ada8eadbc6..b9026e54c3 100644 --- a/code/modules/integrated_electronics/subtypes/converters.dm +++ b/code/modules/integrated_electronics/subtypes/converters.dm @@ -97,7 +97,7 @@ /obj/item/integrated_circuit/converter/refdecode/do_work() pull_data() - set_pin_data(IC_OUTPUT, 1, weakref(locate(get_pin_data(IC_INPUT, 1)))) + set_pin_data(IC_OUTPUT, 1, WEAKREF(locate(get_pin_data(IC_INPUT, 1)))) push_data() activate_pin(2) @@ -391,4 +391,4 @@ set_pin_data(IC_OUTPUT, 1, result) push_data() - activate_pin(2) \ No newline at end of file + activate_pin(2) diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 914a20a70d..13bb767579 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -235,7 +235,7 @@ O.data = null if(assembly) if(istype(assembly.loc, /mob/living)) // Now check if someone's holding us. - O.data = weakref(assembly.loc) + O.data = WEAKREF(assembly.loc) O.push_data() @@ -272,7 +272,7 @@ continue valid_things.Add(thing) if(valid_things.len) - O.data = weakref(pick(valid_things)) + O.data = WEAKREF(pick(valid_things)) activate_pin(2) else activate_pin(3) @@ -321,7 +321,7 @@ if(findtext(addtext(thing.name," ",thing.desc), DT, 1, 0) ) valid_things.Add(thing) if(valid_things.len) - O.data = weakref(pick(valid_things)) + O.data = WEAKREF(pick(valid_things)) O.push_data() activate_pin(2) else @@ -359,7 +359,7 @@ . = ..() set_pin_data(IC_INPUT, 1, frequency) set_pin_data(IC_INPUT, 2, code) - addtimer(CALLBACK(src, .proc/set_frequency, frequency), 40) + addtimer(CALLBACK(src, PROC_REF(set_frequency), frequency), 40) /obj/item/integrated_circuit/input/signaler/Destroy() if(radio_controller) @@ -647,7 +647,7 @@ if(istype(A, /obj/item/weapon/storage)) return FALSE - set_pin_data(IC_OUTPUT, 1, weakref(A)) + set_pin_data(IC_OUTPUT, 1, WEAKREF(A)) push_data() activate_pin(1) return TRUE @@ -675,7 +675,7 @@ set_pin_data(IC_OUTPUT, 1, null) set_pin_data(IC_OUTPUT, 2, null) set_pin_data(IC_OUTPUT, 3, null) - set_pin_data(IC_OUTPUT, 4, weakref(assembly)) + set_pin_data(IC_OUTPUT, 4, WEAKREF(assembly)) if(assembly) if(assembly.battery) diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index 022eeb3da9..ea9e083a65 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -118,8 +118,8 @@ /obj/item/integrated_circuit/memory/constant/afterattack(atom/target, mob/living/user, proximity) if(accepting_refs && proximity) var/datum/integrated_io/O = outputs[1] - O.data = weakref(target) + O.data = WEAKREF(target) visible_message("[user] slides \a [src]'s over \the [target].") to_chat(user, "You set \the [src]'s memory to a reference to [O.display_data(O.data)]. The ref scanner is \ now off.") - accepting_refs = 0 \ No newline at end of file + accepting_refs = 0 diff --git a/code/modules/integrated_electronics/subtypes/output.dm b/code/modules/integrated_electronics/subtypes/output.dm index 9a193f9bf7..a20a02c8f1 100644 --- a/code/modules/integrated_electronics/subtypes/output.dm +++ b/code/modules/integrated_electronics/subtypes/output.dm @@ -444,11 +444,11 @@ /obj/item/integrated_circuit/output/holographic_projector/Initialize() . = ..() - GLOB.moved_event.register(src, src, .proc/on_moved) + GLOB.moved_event.register(src, src, PROC_REF(on_moved)) /obj/item/integrated_circuit/output/holographic_projector/Destroy() destroy_hologram() - GLOB.moved_event.unregister(src, src, .proc/on_moved) + GLOB.moved_event.unregister(src, src, PROC_REF(on_moved)) return ..() /obj/item/integrated_circuit/output/holographic_projector/do_work() diff --git a/code/modules/integrated_electronics/subtypes/reagents.dm b/code/modules/integrated_electronics/subtypes/reagents.dm index b7fc6ae0b6..fb74ae9eb9 100644 --- a/code/modules/integrated_electronics/subtypes/reagents.dm +++ b/code/modules/integrated_electronics/subtypes/reagents.dm @@ -32,7 +32,7 @@ /obj/item/integrated_circuit/reagent/smoke/interact(mob/user) - set_pin_data(IC_OUTPUT, 2, weakref(src)) + set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) push_data() ..() @@ -66,7 +66,7 @@ var/transfer_amount = 10 /obj/item/integrated_circuit/reagent/injector/interact(mob/user) - set_pin_data(IC_OUTPUT, 2, weakref(src)) + set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) push_data() ..() @@ -251,7 +251,7 @@ /obj/item/integrated_circuit/reagent/storage/interact(mob/user) - set_pin_data(IC_OUTPUT, 2, weakref(src)) + set_pin_data(IC_OUTPUT, 2, WEAKREF(src)) push_data() ..() @@ -356,6 +356,3 @@ source.reagents.trans_id_to(target, G.id, transfer_amount) activate_pin(2) push_data() - - - diff --git a/code/modules/integrated_electronics/subtypes/time.dm b/code/modules/integrated_electronics/subtypes/time.dm index 9633ef7881..1acaea0f3b 100644 --- a/code/modules/integrated_electronics/subtypes/time.dm +++ b/code/modules/integrated_electronics/subtypes/time.dm @@ -25,7 +25,7 @@ var/new_delay = CLAMP(delay_input, 1, 1 HOUR) delay = new_delay - addtimer(CALLBACK(src, .proc/activate_pin, 2), delay) + addtimer(CALLBACK(src, PROC_REF(activate_pin), 2), delay) /obj/item/integrated_circuit/time/ticker name = "ticker circuit" @@ -65,7 +65,7 @@ /obj/item/integrated_circuit/time/ticker/proc/tick() if(is_running && check_power()) - addtimer(CALLBACK(src, .proc/tick), delay) + addtimer(CALLBACK(src, PROC_REF(tick)), delay) if(world.time > next_fire) next_fire = world.time + delay activate_pin(1) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 39e3c27f25..a04cd6c6eb 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -33,7 +33,6 @@ /// Whether we have applied our light yet or not. var/applied = FALSE - /// whether we are to be added to SSlighting's sources_queue list for an update var/needs_update = LIGHTING_NO_UPDATE @@ -275,4 +274,4 @@ #undef EFFECT_UPDATE #undef LUM_FALLOFF #undef REMOVE_CORNER -#undef APPLY_CORNER \ No newline at end of file +#undef APPLY_CORNER diff --git a/code/modules/mining/kinetic_crusher.dm b/code/modules/mining/kinetic_crusher.dm index 043dfe8188..2a66826282 100644 --- a/code/modules/mining/kinetic_crusher.dm +++ b/code/modules/mining/kinetic_crusher.dm @@ -69,8 +69,8 @@ /obj/item/weapon/kinetic_crusher/Initialize() . = ..() if(requires_Wield) - RegisterSignal(src, COMSIG_TWOHANDED_WIELD, .proc/on_wield) - RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, .proc/on_unwield) + RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield)) + RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield)) /obj/item/weapon/kinetic_crusher/ComponentInitialize() . = ..() @@ -163,7 +163,7 @@ D.fire() charged = FALSE update_icon() - addtimer(CALLBACK(src, .proc/Recharge), charge_time) + addtimer(CALLBACK(src, PROC_REF(Recharge)), charge_time) // * (user?.ConflictElementCount(CONFLICT_ELEMENT_CRUSHER) || 1 - tentatively commented out return if(proximity_flag && isliving(target)) @@ -258,7 +258,7 @@ update_item_state = FALSE slot_flags = SLOT_BELT - + /obj/item/weapon/kinetic_crusher/machete/gauntlets @@ -425,4 +425,3 @@ but alas - hatterhat */ - diff --git a/code/modules/mob/_modifiers/modifiers.dm b/code/modules/mob/_modifiers/modifiers.dm index 56422efdf6..d49ff28874 100644 --- a/code/modules/mob/_modifiers/modifiers.dm +++ b/code/modules/mob/_modifiers/modifiers.dm @@ -7,7 +7,7 @@ var/desc = null // Ditto. var/icon_state = null // See above. var/mob/living/holder = null // The mob that this datum is affecting. - var/weakref/origin = null // A weak reference to whatever caused the modifier to appear. THIS NEEDS TO BE A MOB/LIVING. It's a weakref to not interfere with qdel(). + var/datum/weakref/origin = null // A weak reference to whatever caused the modifier to appear. THIS NEEDS TO BE A MOB/LIVING. It's a weakref to not interfere with qdel(). var/expire_at = null // world.time when holder's Life() will remove the datum. If null, it lasts forever or until it gets deleted by something else. var/on_created_text = null // Text to show to holder upon being created. var/on_expired_text = null // Text to show to holder when it expires. @@ -68,9 +68,9 @@ /datum/modifier/New(var/new_holder, var/new_origin) holder = new_holder if(new_origin) - origin = weakref(new_origin) + origin = WEAKREF(new_origin) else // We assume the holder caused the modifier if not told otherwise. - origin = weakref(holder) + origin = WEAKREF(holder) ..() // Checks if the modifier should be allowed to be applied to the mob before attaching it. diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 3d854bd166..ffbd20a6f1 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -40,7 +40,7 @@ visible_message("Something flies out of [src]. It seems to be acting oddly.") var/obj/effect/decal/cleanable/blood/gibs/gib = new /obj/effect/decal/cleanable/blood/gibs(loc) // TODO - I have a feeling weakrefs will not work in ignore_list, verify this ~Leshana - var/weakref/g = weakref(gib) + var/datum/weakref/g = WEAKREF(gib) ignore_list += g spawn(600) ignore_list -= g diff --git a/code/modules/mob/living/carbon/human/human_modular_limbs.dm b/code/modules/mob/living/carbon/human/human_modular_limbs.dm index c38bf4ebd6..481c9e5734 100644 --- a/code/modules/mob/living/carbon/human/human_modular_limbs.dm +++ b/code/modules/mob/living/carbon/human/human_modular_limbs.dm @@ -73,13 +73,13 @@ // Called in robotize(), replaced() and removed() to update our modular limb verbs. /mob/living/carbon/human/proc/refresh_modular_limb_verbs() if(length(get_modular_limbs(return_first_found = TRUE, validate_proc = /obj/item/organ/external/proc/can_attach_modular_limb_here))) - verbs |= .proc/attach_limb_verb + verbs |= PROC_REF(attach_limb_verb) else - verbs -= .proc/attach_limb_verb + verbs -= PROC_REF(attach_limb_verb) if(length(get_modular_limbs(return_first_found = TRUE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb))) - verbs |= .proc/detach_limb_verb + verbs |= PROC_REF(detach_limb_verb) else - verbs -= .proc/detach_limb_verb + verbs -= PROC_REF(detach_limb_verb) // Proc helper for attachment verb. /mob/living/carbon/human/proc/check_can_attach_modular_limb(var/obj/item/organ/external/E) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 740d8e2fa1..4afe699cfa 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1528,7 +1528,9 @@ if(!isbelly(loc)) //VOREStation Add - Belly fullscreens safety clear_fullscreen("belly") - //clear_fullscreen("belly2") //For multilayered stomachs. Not currently implemented. + clear_fullscreen("belly2") + clear_fullscreen("belly3") + clear_fullscreen("belly4") if(config.welder_vision) var/found_welder diff --git a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm index 649e35850a..76bb771c7b 100644 --- a/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/prommie_blob.dm @@ -8,7 +8,7 @@ unity = TRUE water_resist = 100 // Lets not kill the prommies cores = 0 - movement_cooldown = 1 + movement_cooldown = 0 //appearance_flags = RADIATION_GLOWS shock_resist = 0 // Lets not be immune to zaps. friendly = list("nuzzles", "glomps", "snuggles", "cuddles", "squishes") // lets be cute :3 diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index 09c1b80cfa..cd4f760241 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -35,7 +35,7 @@ max_n2 = 0 minbodytemp = 0 maxbodytemp = 900 - movement_cooldown = 1 + movement_cooldown = -0.5 // Should mean that the little blurb about being quicker in blobform rings true. May need further adjusting. var/mob/living/carbon/human/humanform var/obj/item/organ/internal/nano/refactory/refactory diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index 94e0d2f47c..fc5f82d132 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -470,7 +470,7 @@ if(noise) src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!") else - src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!", range = 1) + src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!", range = 1) if(bleed) //Due to possibility of missing/misclick and missing the bleeding cues, we are warning the scene members of BLEEDING being on to_chat(src, SPAN_WARNING("This is going to cause [B] to keep bleeding!")) @@ -481,7 +481,7 @@ if(noise) src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!") else - src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!", range = 1) + src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!", range = 1) if(bleed) B.apply_damage(10, BRUTE, BP_HEAD, blocked = 0, soaked = 0, sharp = TRUE, edge = FALSE) var/obj/item/organ/external/E = B.get_organ(BP_HEAD) @@ -492,12 +492,17 @@ else B.apply_damage(5, BRUTE, BP_HEAD) //You're getting fangs pushed into your neck. What do you expect???? - B.drip(80) //Remove enough blood to make them a bit woozy, but not take oxyloss. - adjust_nutrition(400) - sleep(50) - B.drip(1) - sleep(50) - B.drip(1) + + if(!noise && !bleed) //If we're quiet and careful, there should be no blood to serve as evidence + B.remove_blood(82) //Removing in one go since we dont want splatter + adjust_nutrition(410) //We drink it all, not letting any go to waste! + else //Otherwise, we're letting blood drop to the floor + B.drip(80) //Remove enough blood to make them a bit woozy, but not take oxyloss. + adjust_nutrition(400) + sleep(50) + B.drip(1) + sleep(50) + B.drip(1) //Welcome to the adapted changeling absorb code. diff --git a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm index d51860b815..1c4d0a972e 100644 --- a/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm +++ b/code/modules/mob/living/carbon/human/species/station/traits_vr/neutral.dm @@ -202,8 +202,19 @@ YW change end */ /datum/trait/neutral/long_vore name = "Long Predatorial Reach" - desc = "Makes you able to use your tongue to grab creatures." + desc = "Makes you able to use an unspecified appendage to grab creatures." + tutorial = "This trait allows you to change its colour and functionality in-game as well as on the trait panel.
\ + The trait panel persists between rounds, whereas the in-game modifications are temporary.

\ + Two functionalities exist: Reach out with the appendage towards prey (default, 'Disabled' option on character setup \ + for the 'Throw Yourself' entry), or fling yourself at the prey and devour them with a pounce!
\ + Maximum range: 5 tiles
\ + Governed by: Throw Vore preferences (both prey and pred must enable it!)
\ + Governed by: Drop Vore (both prey and pred must enable it!)
\ + Governed by: Spontaneous Pred/Prey (Both sides must have appropriate one enabled.)
\ + If both sides have both pred/prey enabled, favours the character being thrown as prey." cost = 0 + has_preferences = list("appendage_color" = list(TRAIT_PREF_TYPE_COLOR, "Appendage Colour", TRAIT_VAREDIT_TARGET_MOB, "#e03997"), + "appendage_alt_setting" = list(TRAIT_PREF_TYPE_BOOLEAN, "Throw yourself?", TRAIT_VAREDIT_TARGET_MOB, FALSE),) custom_only = FALSE /datum/trait/neutral/long_vore/apply(var/datum/species/S,var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index d9af7a3689..eb93f679e3 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -49,7 +49,7 @@ . = drop_r_hand(Target) if (istype(item_dropped) && !QDELETED(item_dropped) && is_preference_enabled(/datum/client_preference/drop_sounds)) - addtimer(CALLBACK(src, .proc/make_item_drop_sound, item_dropped), 1) + addtimer(CALLBACK(src, PROC_REF(make_item_drop_sound), item_dropped), 1) /mob/proc/make_item_drop_sound(obj/item/I) if(QDELETED(I)) @@ -119,14 +119,14 @@ // We're the first! if(!L) L = list() - + // Lefty grab! if (istype(l_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = l_hand L |= G.affecting if(mobchain_limit-- > 0) G.affecting?.ret_grab(L, mobchain_limit) // Recurse! They can update the list. It's the same instance as ours. - + // Righty grab! if (istype(r_hand, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = r_hand @@ -144,7 +144,7 @@ if(!checkClickCooldown()) return - + setClickCooldown(1) if(istype(loc,/obj/mecha)) return @@ -272,7 +272,7 @@ if(..()) return TRUE - // If anyone wants the inventory panel to actually work, + // If anyone wants the inventory panel to actually work, // add code to handle actions "mask", "l_hand", "r_hand", "back", "pockets", and "internals" here // No mobs other than humans actually supported stripping or putting stuff on before the /datum/inventory_panel was // created, so feature parity demands not adding that and risking breaking stuff @@ -345,12 +345,12 @@ data["sensors"] = FALSE if(istype(suit) && suit.has_sensor == 1) data["sensors"] = TRUE - + data["handcuffed"] = FALSE if(H.handcuffed) data["handcuffed"] = TRUE data["handcuffedParams"] = list("slot" = slot_handcuffed) - + data["legcuffed"] = FALSE if(H.legcuffed) data["legcuffed"] = TRUE @@ -360,4 +360,4 @@ if(suit && LAZYLEN(suit.accessories)) data["accessory"] = TRUE - return data \ No newline at end of file + return data diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 311682f056..aae66646ca 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1258,7 +1258,7 @@ /datum/component/character_setup/RegisterWithParent() . = ..() - RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, .proc/create_mob_button) + RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(create_mob_button)) var/mob/owner = parent if(owner.client) create_mob_button(parent) @@ -1276,7 +1276,7 @@ var/datum/hud/HUD = user.hud_used if(!screen_icon) screen_icon = new() - RegisterSignal(screen_icon, COMSIG_CLICK, .proc/character_setup_click) + RegisterSignal(screen_icon, COMSIG_CLICK, PROC_REF(character_setup_click)) if(ispAI(user)) screen_icon.icon = 'icons/mob/pai_hud.dmi' screen_icon.screen_loc = ui_acti diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index 7a9279eaa0..f58c741ded 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -3,6 +3,9 @@ var/mob/moving_mob = mover if ((other_mobs && moving_mob.other_mobs)) return TRUE + if(is_shifted && (abs(pixel_x) >= 8 || abs(pixel_y) >= 8)) + // they're wallflowering, let 'em through + return TRUE if(istype(mover, /obj/item/projectile)) var/obj/item/projectile/P = mover return !P.can_hit_target(src, P.permutated, src == P.original, TRUE) diff --git a/code/modules/mob/living/silicon/robot/robot_animation_vr.dm b/code/modules/mob/living/silicon/robot/robot_animation_vr.dm index f69b1049cd..6d1c66be63 100644 --- a/code/modules/mob/living/silicon/robot/robot_animation_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_animation_vr.dm @@ -1,5 +1,5 @@ /mob/living/silicon/robot/proc/transform_with_anim() - INVOKE_ASYNC(src, .proc/do_transform_animation) + INVOKE_ASYNC(src, PROC_REF(do_transform_animation)) /mob/living/silicon/robot/proc/do_transform_animation() notransform = TRUE @@ -19,4 +19,4 @@ if(!prev_lockcharge) SetLockdown(0) anchored = FALSE - notransform = FALSE \ No newline at end of file + notransform = FALSE diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index 50223021d7..3926e65fe8 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -1,6 +1,6 @@ /mob/living/silicon/robot - var/sleeper_g - var/sleeper_r + var/sleeper_g //Set to True only for Medical mechs when patient alive + var/sleeper_r //Used in every other case. Currently also for Vorebellies. Ideally vorebellies will use sleeper_o once icons are made var/leaping = 0 var/pounce_cooldown = 0 var/pounce_cooldown_time = 40 @@ -110,10 +110,29 @@ vr_sprite_check() ..() if(dogborg == TRUE && stat == CONSCIOUS) - if(sleeper_g == TRUE) - add_overlay("[module_sprites[icontype]]-sleeper_g") - if(sleeper_r == TRUE) - add_overlay("[module_sprites[icontype]]-sleeper_r") + if(vore_selected.silicon_belly_overlay_preference == "Sleeper") + if(sleeper_g == TRUE) + add_overlay("[module_sprites[icontype]]-sleeper_g") + if(sleeper_r == TRUE) + add_overlay("[module_sprites[icontype]]-sleeper_r") + else if(vore_selected.silicon_belly_overlay_preference == "Vorebelly") + if(LAZYLEN(vore_selected.contents) >= vore_selected.visible_belly_minimum_prey) + if(vore_selected.overlay_min_prey_size == 0) //if min size is 0, we dont check for size + add_overlay("[module_sprites[icontype]]-sleeper_r") + else + var/show_belly = FALSE + if(vore_selected.override_min_prey_size && (LAZYLEN(vore_selected.contents) > vore_selected.override_min_prey_num)) + show_belly = TRUE //Override regardless of content size + else + for(var/content in vore_selected.contents) //If ANY in belly are big enough, we set to true + if(!istype(content, /mob/living)) continue + var/mob/living/prey = content + if(prey.size_multiplier >= vore_selected.overlay_min_prey_size) + show_belly = TRUE + break + if(show_belly) + add_overlay("[module_sprites[icontype]]-sleeper_r") + if(istype(module_active,/obj/item/weapon/gun/energy/laser/mounted)) add_overlay("laser") if(istype(module_active,/obj/item/weapon/gun/energy/taser/mounted/cyborg)) diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm index 4efce708e8..d9d38faae2 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm @@ -1,5 +1,5 @@ // Spawner landmarks are used because platforms that are mapped during -// SSatoms init try to Initialize() twice. I have no idea why and I am +// SSatoms init try to Initialize() twice. I have no idea why and I am // not paid enough to spend more time trying to debug it. /obj/effect/landmark/robot_platform name = "recon platform spawner" @@ -40,7 +40,7 @@ var/tmp/recharge_complete = FALSE var/tmp/recharger_charge_amount = 10 KILOWATTS var/tmp/recharger_tick_cost = 80 KILOWATTS - var/weakref/recharging + var/datum/weakref/recharging var/list/stored_atoms var/max_stored_atoms = 1 @@ -82,7 +82,7 @@ components["armour"] = new /datum/robot_component/armour/platform(src) /mob/living/silicon/robot/platform/Destroy() - for(var/weakref/drop_ref in stored_atoms) + for(var/datum/weakref/drop_ref in stored_atoms) var/atom/movable/drop_atom = drop_ref.resolve() if(istype(drop_atom) && !QDELETED(drop_atom) && drop_atom.loc == src) drop_atom.dropInto(loc) @@ -110,7 +110,7 @@ if(length(stored_atoms)) var/list/atom_names = list() - for(var/weakref/stored_ref in stored_atoms) + for(var/datum/weakref/stored_ref in stored_atoms) var/atom/movable/AM = stored_ref.resolve() if(istype(AM)) atom_names += "\a [AM]" diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm index 852c09ff61..87b23bf457 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm @@ -22,7 +22,7 @@ to_chat(user, SPAN_WARNING("\The [src] already has \a [recharging.resolve()] inserted into its recharging port.")) else if(user.unEquip(W)) W.forceMove(src) - recharging = weakref(W) + recharging = WEAKREF(W) recharge_complete = FALSE user.visible_message("\The [user] slots \the [W] into \the [src]'s recharging port.") return TRUE @@ -43,7 +43,7 @@ if(jobban_isbanned(user, "Robot")) to_chat(user, SPAN_WARNING("You are banned from synthetic roles and cannot take control of \the [src].")) - return + return // Boilerplate from drone fabs, unsure if there's a shared proc to use instead. var/deathtime = world.time - user.timeofdeath @@ -65,7 +65,7 @@ if(key != user.key) key = user.key SetName("[modtype] [braintype]-[rand(100,999)]") - addtimer(CALLBACK(src, .proc/welcome_client), 1) + addtimer(CALLBACK(src, PROC_REF(welcome_client)), 1) qdel(user) /mob/living/silicon/robot/platform/proc/welcome_client() diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm index 6ffe75bfe3..27af8c1590 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm @@ -10,7 +10,7 @@ recharging = null if(length(stored_atoms)) - for(var/weakref/stored_ref in stored_atoms) + for(var/datum/weakref/stored_ref in stored_atoms) var/atom/movable/dropping = stored_ref.resolve() if(istype(dropping) && !QDELETED(dropping) && dropping.loc == src) dropping.dropInto(loc) @@ -67,18 +67,18 @@ /mob/living/silicon/robot/platform/proc/store_atom(var/atom/movable/storing, var/mob/user) if(istype(storing)) storing.forceMove(src) - LAZYDISTINCTADD(stored_atoms, weakref(storing)) + LAZYDISTINCTADD(stored_atoms, WEAKREF(storing)) /mob/living/silicon/robot/platform/proc/drop_stored_atom(var/atom/movable/ejecting, var/mob/user) if(!ejecting && length(stored_atoms)) - var/weakref/stored_ref = stored_atoms[1] + var/datum/weakref/stored_ref = stored_atoms[1] if(!istype(stored_ref)) LAZYREMOVE(stored_atoms, stored_ref) else ejecting = stored_ref?.resolve() - LAZYREMOVE(stored_atoms, weakref(ejecting)) + LAZYREMOVE(stored_atoms, WEAKREF(ejecting)) if(istype(ejecting) && !QDELETED(ejecting) && ejecting.loc == src) ejecting.dropInto(loc) if(user == src) @@ -90,11 +90,11 @@ if(isrobot(user) && user.Adjacent(src)) return try_remove_cargo(user) return ..() - + /mob/living/silicon/robot/platform/proc/try_remove_cargo(var/mob/user) if(!length(stored_atoms) || !istype(user)) return FALSE - var/weakref/remove_ref = stored_atoms[length(stored_atoms)] + var/datum/weakref/remove_ref = stored_atoms[length(stored_atoms)] var/atom/movable/removing = remove_ref?.resolve() if(!istype(removing) || QDELETED(removing) || removing.loc != src) LAZYREMOVE(stored_atoms, remove_ref) @@ -136,4 +136,4 @@ return FALSE if(user.incapacitated() || !Adjacent(user) || !dropping.Adjacent(user)) return FALSE - return TRUE \ No newline at end of file + return TRUE diff --git a/code/modules/mob/living/simple_mob/overmap_mob_vr.dm b/code/modules/mob/living/simple_mob/overmap_mob_vr.dm index d9b544cc73..8a998d48ea 100644 --- a/code/modules/mob/living/simple_mob/overmap_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/overmap_mob_vr.dm @@ -8,7 +8,7 @@ //The MOB being invisible presents some problems though, which I am not entirely sure how to resolve //Such as, being unable to be attacked by other mobs, and possibly unable to be attacked by players. -//This does not at all prevent the mob from attacking other things though +//This does not at all prevent the mob from attacking other things though //so in general, please ensure that you never spawn these where players can ordinarily access them. //The mob was made invisible though, because the sensors can't detect invisible objects, so when the /visitable/simplemob was made invisible @@ -47,7 +47,7 @@ /obj/effect/overmap/visitable/simplemob/proc/om_mob_event_setup() scanner_desc = parent.scanner_desc - RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/on_parent_moved) + RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(on_parent_moved)) skybox_pixel_x = rand(-100,100) if(known) name = initial(parent.name) @@ -109,4 +109,3 @@ /mob/living/simple_mob/vore/overmap/Destroy() qdel_null(child_om_marker) return ..() - diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm index 6fea80f626..6b4b514e28 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/catslug.dm @@ -242,7 +242,7 @@ else if(prob(0.5)) holder.lay_down() go_sleep() - addtimer(CALLBACK(src, .proc/consider_awakening), rand(1 MINUTE, 5 MINUTES), TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) + addtimer(CALLBACK(src, PROC_REF(consider_awakening)), rand(1 MINUTE, 5 MINUTES), TIMER_UNIQUE|TIMER_OVERRIDE|TIMER_STOPPABLE) else return ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm index 9346ecd9ac..a59560f2e1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/spookyghost.dm @@ -192,7 +192,7 @@ . = ..() icon_living = "spookyghost-[rand(1,2)]" icon_state = icon_living - addtimer(CALLBACK(src, .proc/death), 35 SECONDS) + addtimer(CALLBACK(src, PROC_REF(death)), 35 SECONDS) update_icon() /datum/ai_holder/simple_mob/melee/space_ghost diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother_spawn.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother_spawn.dm index 8d07077f1a..5ebb7df0d7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother_spawn.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother_spawn.dm @@ -10,7 +10,7 @@ /mob/living/simple_mob/animal/giant_spider/frost/broodling/Initialize() . = ..() adjust_scale(0.75) - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(death)), 2 MINUTES) /mob/living/simple_mob/animal/giant_spider/frost/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) @@ -28,7 +28,7 @@ /mob/living/simple_mob/animal/giant_spider/electric/broodling/Initialize() . = ..() adjust_scale(0.75) - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(death)), 2 MINUTES) /mob/living/simple_mob/animal/giant_spider/electric/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) @@ -43,7 +43,7 @@ /mob/living/simple_mob/animal/giant_spider/hunter/broodling/Initialize() . = ..() adjust_scale(0.75) - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(death)), 2 MINUTES) /mob/living/simple_mob/animal/giant_spider/hunter/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) @@ -58,7 +58,7 @@ /mob/living/simple_mob/animal/giant_spider/lurker/broodling/Initialize() . = ..() adjust_scale(0.75) - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(death)), 2 MINUTES) /mob/living/simple_mob/animal/giant_spider/lurker/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) @@ -74,7 +74,7 @@ /mob/living/simple_mob/animal/giant_spider/nurse/broodling/Initialize() . = ..() adjust_scale(0.75) - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(death)), 2 MINUTES) /mob/living/simple_mob/animal/giant_spider/nurse/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) @@ -89,7 +89,7 @@ /mob/living/simple_mob/animal/giant_spider/pepper/broodling/Initialize() . = ..() adjust_scale(0.75) - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(death)), 2 MINUTES) /mob/living/simple_mob/animal/giant_spider/pepper/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) @@ -107,7 +107,7 @@ /mob/living/simple_mob/animal/giant_spider/thermic/broodling/Initialize() . = ..() adjust_scale(0.75) - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(death)), 2 MINUTES) /mob/living/simple_mob/animal/giant_spider/thermic/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) @@ -122,7 +122,7 @@ /mob/living/simple_mob/animal/giant_spider/tunneler/broodling/Initialize() . = ..() adjust_scale(0.75) - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(death)), 2 MINUTES) /mob/living/simple_mob/animal/giant_spider/tunneler/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) @@ -139,7 +139,7 @@ /mob/living/simple_mob/animal/giant_spider/webslinger/broodling/Initialize() . = ..() adjust_scale(0.75) - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(death)), 2 MINUTES) /mob/living/simple_mob/animal/giant_spider/webslinger/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) @@ -157,7 +157,7 @@ /mob/living/simple_mob/animal/giant_spider/broodling/Initialize() . = ..() adjust_scale(0.75) - addtimer(CALLBACK(src, .proc/death), 2 MINUTES) + addtimer(CALLBACK(src, PROC_REF(death)), 2 MINUTES) /mob/living/simple_mob/animal/giant_spider/broodling/death() new /obj/effect/decal/cleanable/spiderling_remains(src.loc) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm index 27bd772e25..b9297da852 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/possum.dm @@ -88,7 +88,7 @@ /datum/ai_holder/simple_mob/passive/possum/poppy/on_hear_say(mob/living/speaker, message) . = ..() - addtimer(CALLBACK(src, .proc/check_keywords, message), rand(1 SECOND, 3 SECONDS)) + addtimer(CALLBACK(src, PROC_REF(check_keywords), message), rand(1 SECOND, 3 SECONDS)) /datum/ai_holder/simple_mob/passive/possum/poppy/proc/check_keywords(var/message) var/mob/living/simple_mob/animal/passive/opossum/poss = holder @@ -205,4 +205,4 @@ hit_zones = list("head", "body", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "pouch") /decl/mob_organ_names/poppy - hit_zones = list("head", "body", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "pouch", "cute little jacket") \ No newline at end of file + hit_zones = list("head", "body", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "pouch", "cute little jacket") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm index ae1a90f303..6b6cc5a192 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/bigdragon.dm @@ -733,7 +733,7 @@ I think I covered everything. var/atom/movable/AM = am if(AM == src || AM.anchored) continue - addtimer(CALLBACK(src, .proc/yeet, am), 1) + addtimer(CALLBACK(src, PROC_REF(yeet), am), 1) playsound(src, "sound/weapons/punchmiss.ogg", 50, 1) //Split repulse into two parts so I can recycle this later @@ -766,7 +766,7 @@ I think I covered everything. do_windup_animation(A, charge_warmup) //callbacks are more reliable than byond's process scheduler - addtimer(CALLBACK(src, .proc/chargeend, A), charge_warmup) + addtimer(CALLBACK(src, PROC_REF(chargeend), A), charge_warmup) /mob/living/simple_mob/vore/bigdragon/proc/chargeend(var/atom/A, var/explicit = 0, var/gentle = 0) @@ -804,7 +804,7 @@ I think I covered everything. set_AI_busy(TRUE) flames = 1 build_icons() - addtimer(CALLBACK(src, .proc/firebreathend, A), charge_warmup) + addtimer(CALLBACK(src, PROC_REF(firebreathend), A), charge_warmup) playsound(src, "sound/magic/Fireball.ogg", 50, 1) /mob/living/simple_mob/vore/bigdragon/proc/firebreathend(var/atom/A) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm index 0b6e6e5607..8cbf335e3a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm @@ -44,8 +44,8 @@ /mob/living/dominated_brain/proc/lets_register_our_signals() if(prey_body) - RegisterSignal(prey_body, COMSIG_PARENT_QDELETING, .proc/prey_was_deleted, TRUE) - RegisterSignal(pred_body, COMSIG_PARENT_QDELETING, .proc/pred_was_deleted, TRUE) + RegisterSignal(prey_body, COMSIG_PARENT_QDELETING, PROC_REF(prey_was_deleted), TRUE) + RegisterSignal(pred_body, COMSIG_PARENT_QDELETING, PROC_REF(pred_was_deleted), TRUE) /mob/living/dominated_brain/proc/lets_unregister_our_signals() prey_was_deleted() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/frog.dm b/code/modules/mob/living/simple_mob/subtypes/vore/frog.dm index a3b76c282b..dfa3bfe541 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/frog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/frog.dm @@ -54,7 +54,7 @@ /mob/living/simple_mob/vore/aggressive/frog/do_special_attack(atom/A) set_AI_busy(TRUE) do_windup_animation(A, 20) - addtimer(CALLBACK(src, .proc/chargeend, A), 20) + addtimer(CALLBACK(src, PROC_REF(chargeend), A), 20) /mob/living/simple_mob/vore/aggressive/frog/proc/chargeend(atom/A) if(stat) //you are dead diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm b/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm index f622eee483..02f2fa025d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/pakkun.dm @@ -130,7 +130,7 @@ /mob/living/simple_mob/vore/pakkun/on_throw_vore_special(var/pred, var/mob/living/target) if(pred && !extra_posessive && !(LAZYFIND(prey_excludes, target))) LAZYSET(prey_excludes, target, world.time) - addtimer(CALLBACK(src, .proc/removeMobFromPreyExcludes, weakref(target)), 5 MINUTES) + addtimer(CALLBACK(src, PROC_REF(removeMobFromPreyExcludes), WEAKREF(target)), 5 MINUTES) if(ai_holder) ai_holder.remove_target() @@ -155,7 +155,7 @@ for(var/mob/living/L in living_mobs(0)) if(!(LAZYFIND(prey_excludes, L))) LAZYSET(prey_excludes, L, world.time) - addtimer(CALLBACK(src, .proc/removeMobFromPreyExcludes, weakref(L)), 5 MINUTES) + addtimer(CALLBACK(src, PROC_REF(removeMobFromPreyExcludes), WEAKREF(L)), 5 MINUTES) else ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm index fb761a167b..76db60732b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm @@ -26,8 +26,6 @@ permit_healbelly = client.prefs_vr.permit_healbelly noisy = client.prefs_vr.noisy selective_preference = client.prefs_vr.selective_preference - appendage_color = client.prefs_vr.appendage_color - appendage_alt_setting = client.prefs_vr.appendage_alt_setting eating_privacy_global = client.prefs_vr.eating_privacy_global drop_vore = client.prefs_vr.drop_vore diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 95ad3fe05a..a136950741 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1203,7 +1203,7 @@ flags = HAIR_TIEABLE /datum/sprite_accessory/hair/una_hood - name = "Cobra Hood" + name = "Cobra Hood (small)" icon = 'icons/mob/human_face_alt.dmi' icon_add = 'icons/mob/human_face_alt_add.dmi' icon_state = "soghun_hood" diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm index 168908ee34..8ed35baba9 100644 --- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm @@ -518,6 +518,14 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY +/datum/sprite_accessory/ears/cobra_hood + name = "Cobra hood (large)" + desc = "" + icon_state = "cobra_hood" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "cobra_hood-inner" + // Special snowflake ears go below here. /datum/sprite_accessory/ears/molenar_kitsune @@ -923,4 +931,87 @@ desc = "" icon = 'icons/mob/vore/ears_vr.dmi' icon_state = "kara_horn" - ckeys_allowed = list("satinisle") \ No newline at end of file + ckeys_allowed = list("satinisle") + +/datum/sprite_accessory/ears/shark + name = "shark ears (Colorable)" + desc = "" + icon_state = "shark_ears" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sharkhigh + name = "shark upper ears (Colorable)" + desc = "" + icon_state = "shark_ears_upper" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sharklow + name = "shark lower ears (Colorable)" + desc = "" + icon_state = "shark_ears_lower" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sharkfin + name = "shark fin (Colorable)" + desc = "" + icon_state = "shark_fin" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sharkfinalt + name = "shark fin alt style (Colorable)" + desc = "" + icon_state = "shark_fin_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sharkboth + name = "shark ears and fin (Colorable)" + desc = "" + icon_state = "shark_ears" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "shark_fin" + +/datum/sprite_accessory/ears/sharkbothalt + name = "shark ears and fin alt style (Colorable)" + desc = "" + icon_state = "shark_ears" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "shark_fin_alt" + +/datum/sprite_accessory/ears/sharkhighboth + name = "shark upper ears and fin (Colorable)" + desc = "" + icon_state = "shark_ears_upper" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "shark_fin" + +/datum/sprite_accessory/ears/sharkhighbothalt + name = "shark upper ears and fin alt style (Colorable)" + desc = "" + icon_state = "shark_ears_upper" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "shark_fin_alt" + +/datum/sprite_accessory/ears/sharklowboth + name = "shark lower ears and fin (Colorable)" + desc = "" + icon_state = "shark_ears_lower" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "shark_fin" + +/datum/sprite_accessory/ears/sharklowbothalt + name = "shark lower ears and fin alt style (Colorable)" + desc = "" + icon_state = "shark_ears_lower" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "shark_fin_alt" diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm index 08c0d4e015..0fd3cebe8e 100644 --- a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm @@ -758,7 +758,7 @@ species_allowed = list(SPECIES_TESHARI) /datum/sprite_accessory/marking/vr_unathihood - name = "Cobra Hood" + name = "Cobra hood (small)" icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "unathihood" color_blend_mode = ICON_MULTIPLY @@ -981,3 +981,17 @@ icon_state = "nevrean_long" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr_heterochromia_l + name = "Heterochromia (left eye)" + icon = 'icons/mob/human_races/markings_vr.dmi' + icon_state = "heterochromia_l" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr_teshi_heterochromia_l + name = "Heterochromia (Teshari) (left eye)" + icon = 'icons/mob/human_races/markings_vr.dmi' + icon_state = "teshi_heterochromia_l" + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm index bc29290da6..b78de37bf7 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm @@ -1385,3 +1385,32 @@ clip_mask_icon = 'icons/mob/vore/taurs_vr.dmi' clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. extra_overlay = "horse" //I can't believe this works. + +/datum/sprite_accessory/tail/turkey //Would have been a really good thing for Thanksgiving probably but I'm not going to wait that long. + name = "turkey" + desc = "" + icon_state = "turkey" + +/datum/sprite_accessory/tail/shark_markings + name = "akula tail, colorable, tail and fins" + desc = "" + icon_state = "sharktail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sharktail_markings" + +/datum/sprite_accessory/tail/shark_stripes + name = "akula tail, colorable, stripe" + desc = "" + icon_state = "sharktail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sharktail_stripemarkings" + +/datum/sprite_accessory/tail/shark_tips + name = "akula tail, colorable, tips" + desc = "" + icon_state = "sharktail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sharktail_tipmarkings" diff --git a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm index 2a290f488d..790ae7dc83 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm @@ -488,6 +488,30 @@ extra_overlay_w = "fatsynthfeline_markings" extra_overlay2_w = "fatsynthfeline_glow" +/datum/sprite_accessory/tail/taur/synthetic/syntheticagi + name = "Synthetic chassis - agile (Taur)" + icon_state = "synthtaur1_s" + extra_overlay = "synthtaur1_markings" + extra_overlay2 = "synthtaur1_glow" + clip_mask_state = "taur_clip_mask_synthtaur1" + +/datum/sprite_accessory/tail/taur/synthetic/syntheticagi_fat + name = "Synthetic chassis - agile (Taur, Fat)" + icon_state = "synthtaur1_s" + extra_overlay = "synthtaur1_fat_markings" + extra_overlay2 = "synthtaur1_glow" + clip_mask_state = "taur_clip_mask_synthtaur1" + +/datum/sprite_accessory/tail/taur/synthetic/syntheticagi_wag + name = "Synthetic chassis - agile (Taur, Fat vwag)" + icon_state = "synthtaur1_s" + extra_overlay = "synthtaur1_markings" + extra_overlay2 = "synthtaur1_glow" + ani_state = "synthtaur1_s" + extra_overlay_w = "synthtaur1_fat_markings" + extra_overlay2_w = "synthtaur1_glow" + clip_mask_state = "taur_clip_mask_synthtaur1" + /datum/sprite_accessory/tail/taur/slug name = "Slug (Taur)" icon_state = "slug_s" @@ -657,6 +681,45 @@ msg_prey_stepunder = "You jump over %prey's thick tail." msg_owner_stepunder = "%owner bounds over your tail." +/datum/sprite_accessory/tail/taur/altmermaid + name = "Mermaid Alt. (Taur)" + icon_state = "altmermaid_s" + can_ride = 0 + icon_sprite_tag = "altmermaid" + + msg_owner_help_walk = "You carefully slither around %prey." + msg_prey_help_walk = "%owner's huge tail slithers past beside you!" + + msg_owner_help_run = "You carefully slither around %prey." + msg_prey_help_run = "%owner's huge tail slithers past beside you!" + + msg_owner_disarm_run = "Your tail slides over %prey, pushing them down to the ground!" + msg_prey_disarm_run = "%owner's tail slides over you, forcing you down to the ground!" + + msg_owner_disarm_walk = "You push down on %prey with your tail, pinning them down under you!" + msg_prey_disarm_walk = "%owner pushes down on you with their tail, pinning you down below them!" + + msg_owner_harm_run = "Your heavy tail carelessly slides past %prey, crushing them!" + msg_prey_harm_run = "%owner quickly goes over your body, carelessly crushing you with their heavy tail!" + + msg_owner_harm_walk = "Your heavy tail slowly and methodically slides down upon %prey, crushing against the floor below!" + msg_prey_harm_walk = "%owner's thick, heavy tail slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!" + + msg_owner_grab_success = "You slither over %prey with your large, thick tail, smushing them against the ground before coiling up around them, trapping them within the tight confines of your tail!" + msg_prey_grab_success = "%owner slithers over you with their large, thick tail, smushing you against the ground before coiling up around you, trapping you within the tight confines of their tail!" + + msg_owner_grab_fail = "You squish %prey under your large, thick tail, forcing them onto the ground!" + msg_prey_grab_fail = "%owner pins you under their large, thick tail, forcing you onto the ground!" + + msg_prey_stepunder = "You jump over %prey's thick tail." + msg_owner_stepunder = "%owner bounds over your tail." + +/datum/sprite_accessory/tail/taur/altmermaid/marked + name = "Mermaid Koi (Taur)" + icon_state = "altmermaid_s" + extra_overlay = "altmermaid_markings" + extra_overlay2 = "altmermaid_markings2" + /datum/sprite_accessory/tail/taur/pawcow // this grabs suit sprites from the normal cow, the outline is the same name = "Cow w/ paws (Taur)" icon_state = "pawcow_s" @@ -962,3 +1025,4 @@ name = "Naga (Taur, Fat, dual color)" icon_state = "fatnaga_s" extra_overlay = "fatnaga_markings" + diff --git a/code/modules/nifsoft/nif_tgui.dm b/code/modules/nifsoft/nif_tgui.dm index 203e0bb858..b3f21c39e5 100644 --- a/code/modules/nifsoft/nif_tgui.dm +++ b/code/modules/nifsoft/nif_tgui.dm @@ -31,7 +31,7 @@ /datum/component/nif_menu/RegisterWithParent() . = ..() - RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, .proc/create_mob_button) + RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(create_mob_button)) var/mob/owner = parent if(owner.client) create_mob_button(parent) @@ -53,7 +53,7 @@ var/datum/hud/HUD = user.hud_used if(!screen_icon) screen_icon = new() - RegisterSignal(screen_icon, COMSIG_CLICK, .proc/nif_menu_click) + RegisterSignal(screen_icon, COMSIG_CLICK, PROC_REF(nif_menu_click)) screen_icon.icon = HUD.ui_style screen_icon.color = HUD.ui_color screen_icon.alpha = HUD.ui_alpha @@ -65,7 +65,7 @@ /datum/component/nif_menu/proc/nif_menu_click(source, location, control, params, user) var/mob/living/carbon/human/H = user if(istype(H) && H.nif) - INVOKE_ASYNC(H.nif, .proc/tgui_interact, user) + INVOKE_ASYNC(H.nif, PROC_REF(tgui_interact), user) /** * Screen object for NIF menu access diff --git a/code/modules/overmap/disperser/disperser_console.dm b/code/modules/overmap/disperser/disperser_console.dm index d67bb87c5c..a173163c17 100644 --- a/code/modules/overmap/disperser/disperser_console.dm +++ b/code/modules/overmap/disperser/disperser_console.dm @@ -55,9 +55,9 @@ middle = M back = B if(is_valid_setup()) - GLOB.destroyed_event.register(F, src, .proc/release_links) - GLOB.destroyed_event.register(M, src, .proc/release_links) - GLOB.destroyed_event.register(B, src, .proc/release_links) + GLOB.destroyed_event.register(F, src, PROC_REF(release_links)) + GLOB.destroyed_event.register(M, src, PROC_REF(release_links)) + GLOB.destroyed_event.register(B, src, PROC_REF(release_links)) return TRUE return FALSE @@ -69,9 +69,9 @@ return FALSE /obj/machinery/computer/ship/disperser/proc/release_links() - GLOB.destroyed_event.unregister(front, src, .proc/release_links) - GLOB.destroyed_event.unregister(middle, src, .proc/release_links) - GLOB.destroyed_event.unregister(back, src, .proc/release_links) + GLOB.destroyed_event.unregister(front, src, PROC_REF(release_links)) + GLOB.destroyed_event.unregister(middle, src, PROC_REF(release_links)) + GLOB.destroyed_event.unregister(back, src, PROC_REF(release_links)) front = null middle = null back = null @@ -207,4 +207,4 @@ . = TRUE if(. && !issilicon(usr)) - playsound(src, "terminal_type", 50, 1) \ No newline at end of file + playsound(src, "terminal_type", 50, 1) diff --git a/code/modules/overmap/sectors.dm b/code/modules/overmap/sectors.dm index d3da39a343..285d1e3a1b 100644 --- a/code/modules/overmap/sectors.dm +++ b/code/modules/overmap/sectors.dm @@ -268,7 +268,7 @@ I.appearance_flags = KEEP_APART|RESET_TRANSFORM|RESET_COLOR add_overlay(I) - addtimer(CALLBACK(src, .proc/distress_update), 5 MINUTES) + addtimer(CALLBACK(src, PROC_REF(distress_update)), 5 MINUTES) return TRUE /obj/effect/overmap/visitable/proc/get_distress_info() diff --git a/code/modules/overmap/ships/computers/ship.dm b/code/modules/overmap/ships/computers/ship.dm index 46d56e29f7..8f52fdbe0b 100644 --- a/code/modules/overmap/ships/computers/ship.dm +++ b/code/modules/overmap/ships/computers/ship.dm @@ -79,7 +79,7 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov user.set_viewsize(world.view + extra_view) GLOB.moved_event.register(user, src, /obj/machinery/computer/ship/proc/unlook) // TODO GLOB.stat_set_event.register(user, src, /obj/machinery/computer/ship/proc/unlook) - LAZYDISTINCTADD(viewers, weakref(user)) + LAZYDISTINCTADD(viewers, WEAKREF(user)) /obj/machinery/computer/ship/proc/unlook(var/mob/user) user.reset_view() @@ -92,10 +92,10 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov user.set_viewsize() // reset to default GLOB.moved_event.unregister(user, src, /obj/machinery/computer/ship/proc/unlook) // TODO GLOB.stat_set_event.unregister(user, src, /obj/machinery/computer/ship/proc/unlook) - LAZYREMOVE(viewers, weakref(user)) + LAZYREMOVE(viewers, WEAKREF(user)) /obj/machinery/computer/ship/proc/viewing_overmap(mob/user) - return (weakref(user) in viewers) + return (WEAKREF(user) in viewers) /obj/machinery/computer/ship/tgui_status(mob/user) . = ..() @@ -120,7 +120,7 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov /obj/machinery/computer/ship/sensors/Destroy() sensors = null if(LAZYLEN(viewers)) - for(var/weakref/W in viewers) + for(var/datum/weakref/W in viewers) var/M = W.resolve() if(M) unlook(M) diff --git a/code/modules/overmap/ships/landable.dm b/code/modules/overmap/ships/landable.dm index a76a39b60e..45c8386da5 100644 --- a/code/modules/overmap/ships/landable.dm +++ b/code/modules/overmap/ships/landable.dm @@ -71,8 +71,8 @@ if(istype(shuttle_datum,/datum/shuttle/autodock/overmap)) var/datum/shuttle/autodock/overmap/oms = shuttle_datum oms.myship = src - GLOB.shuttle_pre_move_event.register(shuttle_datum, src, .proc/pre_shuttle_jump) - GLOB.shuttle_moved_event.register(shuttle_datum, src, .proc/on_shuttle_jump) + GLOB.shuttle_pre_move_event.register(shuttle_datum, src, PROC_REF(pre_shuttle_jump)) + GLOB.shuttle_moved_event.register(shuttle_datum, src, PROC_REF(on_shuttle_jump)) on_landing(landmark, shuttle_datum.current_location) // We "land" at round start to properly place ourselves on the overmap. @@ -144,7 +144,7 @@ /obj/effect/shuttle_landmark/visiting_shuttle/shuttle_arrived(datum/shuttle/shuttle) LAZYSET(core_landmark.visitors, src, shuttle) - GLOB.shuttle_moved_event.register(shuttle, src, .proc/shuttle_left) + GLOB.shuttle_moved_event.register(shuttle, src, PROC_REF(shuttle_left)) /obj/effect/shuttle_landmark/visiting_shuttle/proc/shuttle_left(datum/shuttle/shuttle, obj/effect/shuttle_landmark/old_landmark, obj/effect/shuttle_landmark/new_landmark) if(old_landmark == src) @@ -206,4 +206,4 @@ if(SHIP_STATUS_TRANSIT) return "Maneuvering under secondary thrust." if(SHIP_STATUS_OVERMAP) - return "In open space." \ No newline at end of file + return "In open space." diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 708fe7fca4..ae9bb2f509 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -61,7 +61,7 @@ switch(action) if("make_copy") - addtimer(CALLBACK(src, .proc/copy_operation, usr), 0) + addtimer(CALLBACK(src, PROC_REF(copy_operation), usr), 0) . = TRUE if("remove") if(copyitem) diff --git a/code/modules/pda/core_apps.dm b/code/modules/pda/core_apps.dm index d140faed5c..f45f6d5e70 100644 --- a/code/modules/pda/core_apps.dm +++ b/code/modules/pda/core_apps.dm @@ -113,7 +113,7 @@ // Values were extracted from the template itself results = list( list("entry" = "Pressure", "units" = "kPa", "val" = "[round(pressure,0.1)]", "bad_high" = 120, "poor_high" = 110, "poor_low" = 95, "bad_low" = 80), - list("entry" = "Temperature", "units" = "°C", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5), + list("entry" = "Temperature", "units" = "\u00B0C", "val" = "[round(environment.temperature-T0C,0.1)]", "bad_high" = 35, "poor_high" = 25, "poor_low" = 15, "bad_low" = 5), list("entry" = "Oxygen", "units" = "kPa", "val" = "[round(o2_level*100,0.1)]", "bad_high" = 140, "poor_high" = 135, "poor_low" = 19, "bad_low" = 17), list("entry" = "Nitrogen", "units" = "kPa", "val" = "[round(n2_level*100,0.1)]", "bad_high" = 105, "poor_high" = 85, "poor_low" = 50, "bad_low" = 40), list("entry" = "Carbon Dioxide", "units" = "kPa", "val" = "[round(co2_level*100,0.1)]", "bad_high" = 10, "poor_high" = 5, "poor_low" = 0, "bad_low" = 0), @@ -203,4 +203,4 @@ news.Cut(1, news.len - 2) // Last three have largest timestamps, youngest posts news.Swap(1, 3) // List is sorted in ascending order of timestamp, we want descending - return news \ No newline at end of file + return news diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 265c2be4c9..987a391253 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -974,7 +974,7 @@ GLOBAL_LIST_EMPTY(apcs) for(var/obj/machinery/light/L in area) if(!initial(L.no_emergency)) //If there was an override set on creation, keep that override L.no_emergency = emergency_lights - INVOKE_ASYNC(L, /obj/machinery/light/.proc/update, FALSE) + INVOKE_ASYNC(L, TYPE_PROC_REF(/obj/machinery/light, update), FALSE) CHECK_TICK if("overload") if(locked_exception) // Reusing for simplicity! @@ -1371,4 +1371,4 @@ GLOBAL_LIST_EMPTY(apcs) #undef APC_HAS_ELECTRONICS_NONE #undef APC_HAS_ELECTRONICS_WIRED -#undef APC_HAS_ELECTRONICS_SECURED \ No newline at end of file +#undef APC_HAS_ELECTRONICS_SECURED diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index eaafdcba81..0f24618623 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -25,6 +25,7 @@ var/self_recharge = FALSE // If true, the cell will recharge itself. var/charge_amount = 25 // How much power to give, if self_recharge is true. The number is in absolute cell charge, as it gets divided by CELLRATE later. var/last_use = 0 // A tracker for use in self-charging + var/connector_type = "standard" //What connector sprite to use when in a cell charger, null if no connectors var/charge_delay = 0 // How long it takes for the cell to start recharging after last use matter = list(MAT_STEEL = 700, MAT_GLASS = 50) drop_sound = 'sound/items/drop/component.ogg' diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm index f618d767fa..e4d822044a 100644 --- a/code/modules/power/cells/device_cells.dm +++ b/code/modules/power/cells/device_cells.dm @@ -20,10 +20,45 @@ charge = 0 update_icon() +/* + * Crap Device + */ +/obj/item/weapon/cell/device/crap + name = "\improper rechargable D battery" + desc = "An older, cheap power cell designed to power handheld devices. It's probably been in use for quite some time now." + description_fluff = "You can't top the rust top." //TOTALLY TRADEMARK INFRINGEMENT + origin_tech = list(TECH_POWER = 0) + icon_state = "device_crap" + maxcharge = 240 + matter = list(MAT_STEEL = 350, MAT_GLASS = 30) + +/obj/item/weapon/cell/device/crap/update_icon() //No visible charge indicator + return + +/obj/item/weapon/cell/device/crap/empty/Initialize() + . = ..() + charge = 0 + update_icon() + +/* + * Hyper Device + */ +/obj/item/weapon/cell/device/hyper + name = "hyper device power cell" + desc = "A small power cell designed to power handheld devices. Has a better charge than a standard device cell." + icon_state = "hype_device_cell" + maxcharge = 600 + matter = list(MAT_STEEL = 400, MAT_GLASS = 60) + +/obj/item/weapon/cell/device/hyper/empty/Initialize() + . = ..() + charge = 0 + update_icon() + /* * EMP Proof Device */ -/obj/item/weapon/cell/device/empproof //UNUSED +/obj/item/weapon/cell/device/empproof name = "shielded device power cell" desc = "A small power cell designed to power handheld devices. Shielded from EMPs." icon_state = "up_device_cell" diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm index bae1028a16..082abfb9da 100644 --- a/code/modules/power/cells/power_cells.dm +++ b/code/modules/power/cells/power_cells.dm @@ -1,33 +1,29 @@ +/* + * Empty + */ +/obj/item/weapon/cell/empty/New() + ..() + charge = 0 + /* * Crap */ /obj/item/weapon/cell/crap - name = "\improper rechargable AA battery" - desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT + name = "\improper rechargable DD battery" + desc = "An older, cheap power cell. It's probably been in use for quite some time now." + description_fluff = "You can't top the rust top." //TOTALLY TRADEMARK INFRINGEMENT origin_tech = list(TECH_POWER = 0) icon_state = "crap" maxcharge = 500 matter = list(MAT_STEEL = 700, MAT_GLASS = 40) +/obj/item/weapon/cell/crap/update_icon() //No visible charge indicator + return + /obj/item/weapon/cell/crap/empty/New() ..() charge = 0 -/* - * Security Borg - */ -/obj/item/weapon/cell/secborg - name = "security borg rechargable D battery" - origin_tech = list(TECH_POWER = 0) - icon_state = "secborg" - maxcharge = 600 //600 max charge / 100 charge per shot = six shots - matter = list(MAT_STEEL = 700, MAT_GLASS = 40) - -/obj/item/weapon/cell/secborg/empty/New() - ..() - charge = 0 - update_icon() - /* * APC */ @@ -89,10 +85,23 @@ /obj/item/weapon/cell/mech name = "mecha power cell" icon_state = "mech" + connector_type = "mech" charge = 15000 maxcharge = 15000 matter = list(MAT_STEEL = 800, MAT_GLASS = 60) +/obj/item/weapon/cell/mech/lead + name = "lead acid battery" + desc = "An ancient battery design not commonly seen anymore. It looks like it'd fit inside a mech however..." + origin_tech = list(TECH_POWER = 0) //Litteraly an old car battery, doesn't need tech + icon_state = "lead" + charge = 8000 + maxcharge = 8000 + matter = list(MAT_STEEL = 300, MAT_GLASS = 10) + +/obj/item/weapon/cell/mech/lead/update_icon() //No visible charge indicator + return + /obj/item/weapon/cell/mech/high name = "high-capacity mecha power cell" origin_tech = list(TECH_POWER = 3) @@ -146,6 +155,7 @@ origin_tech = list(TECH_POWER = 4, TECH_BIO = 5) icon = 'icons/mob/slimes.dmi' //'icons/obj/harvest.dmi' icon_state = "yellow slime extract" //"potato_battery" + connector_type = "slime" description_info = "This 'cell' holds a max charge of 10k and self recharges over time." maxcharge = 10000 matter = null @@ -161,8 +171,12 @@ maxcharge = 120 //Emergency lights use 0.2 W per tick, meaning ~10 minutes of emergency power from a cell matter = list(MAT_GLASS = 20) icon_state = "em_light" + connector_type = "emergency" w_class = ITEMSIZE_TINY +/obj/item/weapon/cell/emergency_light/update_icon() //No visible charge indicator + return + /obj/item/weapon/cell/emergency_light/Initialize() . = ..() var/area/A = get_area(src) diff --git a/code/modules/power/port_gen_vr.dm b/code/modules/power/port_gen_vr.dm index 6296d3c9b4..61341a92cd 100644 --- a/code/modules/power/port_gen_vr.dm +++ b/code/modules/power/port_gen_vr.dm @@ -156,7 +156,7 @@ "You hear a loud electrical crack!") playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5) tesla_zap(src, 5, power_gen * 0.05) - addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, get_turf(src), 2, 3, 4, 8), 100) // Not a normal explosion. + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(explosion), get_turf(src), 2, 3, 4, 8), 100) // Not a normal explosion. /obj/machinery/power/rtg/abductor/bullet_act(obj/item/projectile/Proj) . = ..() diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm index 33caa542a4..e36a1f1dc3 100644 --- a/code/modules/power/tesla/coil.dm +++ b/code/modules/power/tesla/coil.dm @@ -83,7 +83,7 @@ flick("coilhit", src) playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5) tesla_zap(src, 5, power_produced) - //addtimer(CALLBACK(src, .proc/reset_shocked), 10) + //addtimer(CALLBACK(src, PROC_REF(reset_shocked)), 10) spawn(10) reset_shocked() else ..() diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index cf7aa9e2c1..fe85a12f87 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -101,7 +101,7 @@ energy_to_raise = energy_to_raise * 1.25 playsound(src, 'sound/effects/lightning_chargeup.ogg', 100, 1, extrarange = 30) - //addtimer(CALLBACK(src, .proc/new_mini_ball), 100) + //addtimer(CALLBACK(src, PROC_REF(new_mini_ball)), 100) spawn(100) new_mini_ball() else if(energy < energy_to_lower && orbiting_balls.len) diff --git a/code/modules/power/tesla/tesla_act.dm b/code/modules/power/tesla/tesla_act.dm index 01b58f8a80..8111d1e4d1 100644 --- a/code/modules/power/tesla/tesla_act.dm +++ b/code/modules/power/tesla/tesla_act.dm @@ -9,8 +9,8 @@ being_shocked = TRUE var/power_bounced = power / 2 tesla_zap(src, 3, power_bounced) - //addtimer(CALLBACK(src, .proc/reset_shocked), 10) - //schedule_task_with_source_in(10, src, .proc/reset_shocked) + //addtimer(CALLBACK(src, PROC_REF(reset_shocked)), 10) + //schedule_task_with_source_in(10, src, PROC_REF(reset_shocked)) spawn(10) reset_shocked() /obj/proc/reset_shocked() @@ -63,12 +63,3 @@ /obj/mecha/tesla_act(power) ..() take_damage(power / 200, "energy") // A surface lightning strike will do 100 damage. - - - - - - - - - diff --git a/code/modules/projectiles/guns/energy/altevian_vr.dm b/code/modules/projectiles/guns/energy/altevian_vr.dm index 150d05c421..4208d2d9e2 100644 --- a/code/modules/projectiles/guns/energy/altevian_vr.dm +++ b/code/modules/projectiles/guns/energy/altevian_vr.dm @@ -10,7 +10,7 @@ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2) matter = list(MAT_STEEL = 1000) projectile_type = /obj/item/projectile/beam/meeplaser - charge_cost = 150 + charge_cost = 450 /obj/item/weapon/gun/energy/altevian/large name = "Proto-Reactive Beam Thruster" @@ -23,7 +23,7 @@ origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 4) matter = list(MAT_STEEL = 2000) projectile_type = /obj/item/projectile/beam/meeplaser/strong - charge_cost = 300 + charge_cost = 200 /obj/item/projectile/beam/meeplaser name = "meep beam" diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm index 8792b0feb1..689be8359d 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm @@ -182,7 +182,7 @@ if(!QDELING(src) && !holds_charge) // Put it on a delay because moving item from slot to hand // calls dropped(). - addtimer(CALLBACK(src, .proc/empty_if_not_held), 2) + addtimer(CALLBACK(src, PROC_REF(empty_if_not_held)), 2) /obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty_if_not_held() if(!ismob(loc) && !istype(loc, /obj/item/integrated_circuit)) @@ -206,7 +206,7 @@ var/carried = max(1, loc.ConflictElementCount(CONFLICT_ELEMENT_KA)) deltimer(recharge_timerid) - recharge_timerid = addtimer(CALLBACK(src, .proc/reload), recharge_time * carried, TIMER_STOPPABLE) + recharge_timerid = addtimer(CALLBACK(src, PROC_REF(reload)), recharge_time * carried, TIMER_STOPPABLE) /obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity) return diff --git a/code/modules/projectiles/guns/projectile/smartgun.dm b/code/modules/projectiles/guns/projectile/smartgun.dm index c74f1b6122..ba13558160 100644 --- a/code/modules/projectiles/guns/projectile/smartgun.dm +++ b/code/modules/projectiles/guns/projectile/smartgun.dm @@ -34,7 +34,7 @@ var/image/I = ..() if(I) I.pixel_x = -16 - return I + return I /obj/item/weapon/gun/projectile/smartgun/loaded magazine_type = /obj/item/ammo_magazine/smartgun @@ -68,7 +68,7 @@ return cycling = TRUE - + if(closed) icon_state = "[initial(icon_state)]_open" playsound(src, 'sound/weapons/smartgunopen.ogg', 75, 0) @@ -77,7 +77,7 @@ icon_state = "[initial(icon_state)]_closed" playsound(src, 'sound/weapons/smartgunclose.ogg', 75, 0) to_chat(user, "You ready [src] so that it can be fired.") - addtimer(CALLBACK(src, .proc/toggle_real_state), 2 SECONDS, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(toggle_real_state)), 2 SECONDS, TIMER_UNIQUE) /obj/item/weapon/gun/projectile/smartgun/proc/toggle_real_state() cycling = FALSE @@ -147,4 +147,3 @@ max_ammo = 5 ammo_type = /obj/item/ammo_casing/smartgun multiple_sprites = TRUE - diff --git a/code/modules/random_map/drop/droppod_doors.dm b/code/modules/random_map/drop/droppod_doors.dm index c19aba40fd..78df7a6699 100644 --- a/code/modules/random_map/drop/droppod_doors.dm +++ b/code/modules/random_map/drop/droppod_doors.dm @@ -13,7 +13,7 @@ /obj/structure/droppod_door/Initialize(var/mapload, var/autoopen) . = ..() if(autoopen) - addtimer(CALLBACK(src, .proc/deploy), 10 SECONDS) + addtimer(CALLBACK(src, PROC_REF(deploy)), 10 SECONDS) /obj/structure/droppod_door/attack_ai(var/mob/user) if(!user.Adjacent(src)) @@ -76,4 +76,4 @@ door_bottom.density = FALSE door_bottom.set_opacity(0) door_bottom.dir = src.dir - door_bottom.icon_state = "rampbottom" \ No newline at end of file + door_bottom.icon_state = "rampbottom" diff --git a/code/modules/reagents/reagent_containers/syringes_vr.dm b/code/modules/reagents/reagent_containers/syringes_vr.dm index 89d81d1f18..1e69c63322 100644 --- a/code/modules/reagents/reagent_containers/syringes_vr.dm +++ b/code/modules/reagents/reagent_containers/syringes_vr.dm @@ -63,7 +63,7 @@ /obj/item/weapon/reagent_containers/syringe/proc/infect_limb(var/obj/item/organ/external/eo) src = null - var/weakref/limb_ref = weakref(eo) + var/datum/weakref/limb_ref = WEAKREF(eo) spawn(rand(5 MINUTES,10 MINUTES)) var/obj/item/organ/external/found_limb = limb_ref.resolve() if(istype(found_limb)) diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index a5e95899f5..51666ab3c0 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -142,6 +142,8 @@ user.drop_item() if(I) + if(istype(I, /obj/item/weapon/holder/micro)) + log_and_message_admins("placed [I.name] inside \the [src]", user) I.forceMove(src) to_chat(user, "You place \the [I] into the [src].") @@ -181,6 +183,7 @@ // must be awake, not stunned or whatever msg = "[user.name] climbs into the [src]." to_chat(user, "You climb into the [src].") + log_and_message_admins("climbed into disposals!", user) else if(target != user && !user.restrained() && !user.stat && !user.weakened && !user.stunned && !user.paralysis) msg = "[user.name] stuffs [target.name] into the [src]!" to_chat(user, "You stuff [target.name] into the [src]!") @@ -527,6 +530,8 @@ . = ..() if(istype(AM, /obj/item) && !istype(AM, /obj/item/projectile)) if(prob(75)) + if(istype(AM, /obj/item/weapon/holder/micro)) + log_and_message_admins("[AM] was thrown into \the [src]") AM.forceMove(src) visible_message("\The [AM] lands in \the [src].") else @@ -541,6 +546,8 @@ return if(prob(75)) I.forceMove(src) + if(istype(I, /obj/item/weapon/holder/micro)) + log_and_message_admins("[I.name] was thrown into \the [src]") for(var/mob/M in viewers(src)) M.show_message("\The [I] lands in \the [src].", 3) else diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index a69a57015e..5bf3d94fff 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -110,7 +110,7 @@ Note: Must be placed within 3 tiles of the R&D Console qdel(B) playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1) rped_recycler_ready = FALSE - addtimer(CALLBACK(src, .proc/rped_ready), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(rped_ready)), 5 SECONDS) to_chat(user, "You deconstruct all the parts of rating [lowest_rating] in [replacer] with [src].") return 1 else @@ -118,4 +118,4 @@ Note: Must be placed within 3 tiles of the R&D Console /obj/machinery/r_n_d/destructive_analyzer/proc/rped_ready() rped_recycler_ready = TRUE - playsound(get_turf(src), 'sound/machines/chime.ogg', 50, 1) \ No newline at end of file + playsound(get_turf(src), 'sound/machines/chime.ogg', 50, 1) diff --git a/code/modules/research/rdconsole_tgui.dm b/code/modules/research/rdconsole_tgui.dm index bbd340fd0a..b9683c0f43 100644 --- a/code/modules/research/rdconsole_tgui.dm +++ b/code/modules/research/rdconsole_tgui.dm @@ -242,7 +242,7 @@ "chem_list" = chem_list, ))) - data = sortTim(data, /proc/cmp_designs_rdconsole, FALSE) + data = sortTim(data, GLOBAL_PROC_REF(cmp_designs_rdconsole), FALSE) if(LAZYLEN(data) > ENTRIES_PER_RDPAGE) var/first_index = clamp(ENTRIES_PER_RDPAGE * page, 1, LAZYLEN(data)) var/last_index = min((ENTRIES_PER_RDPAGE * page) + ENTRIES_PER_RDPAGE, LAZYLEN(data) + 1) @@ -280,7 +280,7 @@ "chem_list" = chem_list, ))) - data = sortTim(data, /proc/cmp_designs_rdconsole, FALSE) + data = sortTim(data, GLOBAL_PROC_REF(cmp_designs_rdconsole), FALSE) if(LAZYLEN(data) > ENTRIES_PER_RDPAGE) var/first_index = clamp(ENTRIES_PER_RDPAGE * page, 1, LAZYLEN(data)) var/last_index = min((ENTRIES_PER_RDPAGE * page) + ENTRIES_PER_RDPAGE, LAZYLEN(data) + 1) @@ -303,7 +303,7 @@ "id" = D.id, ))) - data = sortTim(data, /proc/cmp_designs_rdconsole, FALSE) + data = sortTim(data, GLOBAL_PROC_REF(cmp_designs_rdconsole), FALSE) if(LAZYLEN(data) > ENTRIES_PER_RDPAGE) var/first_index = clamp(ENTRIES_PER_RDPAGE * page, 1, LAZYLEN(data)) var/last_index = clamp((ENTRIES_PER_RDPAGE * page) + ENTRIES_PER_RDPAGE, 1, LAZYLEN(data) + 1) @@ -637,4 +637,4 @@ PR.info_links = PR.info PR.icon_state = "paper_words" PR.forceMove(loc) - busy_msg = null \ No newline at end of file + busy_msg = null diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index 9f83cdf933..e486197b84 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -116,7 +116,7 @@ @param time: time to sleep in deciseconds (1/10th second) */ - interpreter.SetProc("sleep", /proc/delay) + interpreter.SetProc("sleep", GLOBAL_PROC_REF(delay)) /* -> Replaces a string with another string @@ -127,7 +127,7 @@ @param replacestring: the string to replace the substring with */ - interpreter.SetProc("replace", /proc/string_replacetext) + interpreter.SetProc("replace", GLOBAL_PROC_REF(string_replacetext)) /* -> Locates an element/substring inside of a list or string @@ -139,7 +139,7 @@ @param end: the position to end in */ - interpreter.SetProc("find", /proc/smartfind) + interpreter.SetProc("find", GLOBAL_PROC_REF(smartfind)) /* -> Finds the length of a string or list @@ -148,42 +148,42 @@ @param container: the list or container to measure */ - interpreter.SetProc("length", /proc/smartlength) + interpreter.SetProc("length", GLOBAL_PROC_REF(smartlength)) /* -- Clone functions, carried from default BYOND procs --- */ // vector namespace - interpreter.SetProc("vector", /proc/n_list) - interpreter.SetProc("at", /proc/n_listpos) - interpreter.SetProc("copy", /proc/n_listcopy) - interpreter.SetProc("push_back", /proc/n_listadd) - interpreter.SetProc("remove", /proc/n_listremove) - interpreter.SetProc("cut", /proc/n_listcut) - interpreter.SetProc("swap", /proc/n_listswap) - interpreter.SetProc("insert", /proc/n_listinsert) + interpreter.SetProc("vector", GLOBAL_PROC_REF(n_list)) + interpreter.SetProc("at", GLOBAL_PROC_REF(n_listpos)) + interpreter.SetProc("copy", GLOBAL_PROC_REF(n_listcopy)) + interpreter.SetProc("push_back", GLOBAL_PROC_REF(n_listadd)) + interpreter.SetProc("remove", GLOBAL_PROC_REF(n_listremove)) + interpreter.SetProc("cut", GLOBAL_PROC_REF(n_listcut)) + interpreter.SetProc("swap", GLOBAL_PROC_REF(n_listswap)) + interpreter.SetProc("insert", GLOBAL_PROC_REF(n_listinsert)) - interpreter.SetProc("pick", /proc/n_pick) - interpreter.SetProc("prob", /proc/prob_chance) - interpreter.SetProc("substr", /proc/docopytext) + interpreter.SetProc("pick", GLOBAL_PROC_REF(n_pick)) + interpreter.SetProc("prob", GLOBAL_PROC_REF(prob_chance)) + interpreter.SetProc("substr", GLOBAL_PROC_REF(docopytext)) // Donkie~ // Strings - interpreter.SetProc("lower", /proc/n_lower) - interpreter.SetProc("upper", /proc/n_upper) - interpreter.SetProc("explode", /proc/string_explode) - interpreter.SetProc("repeat", /proc/n_repeat) - interpreter.SetProc("reverse", /proc/n_reverse) - interpreter.SetProc("tonum", /proc/n_str2num) + interpreter.SetProc("lower", GLOBAL_PROC_REF(n_lower)) + interpreter.SetProc("upper", GLOBAL_PROC_REF(n_upper)) + interpreter.SetProc("explode", GLOBAL_PROC_REF(string_explode)) + interpreter.SetProc("repeat", GLOBAL_PROC_REF(n_repeat)) + interpreter.SetProc("reverse", GLOBAL_PROC_REF(n_reverse)) + interpreter.SetProc("tonum", GLOBAL_PROC_REF(n_str2num)) // Numbers - interpreter.SetProc("tostring", /proc/n_num2str) - interpreter.SetProc("sqrt", /proc/n_sqrt) - interpreter.SetProc("abs", /proc/n_abs) - interpreter.SetProc("floor", /proc/n_floor) - interpreter.SetProc("ceil", /proc/n_ceil) - interpreter.SetProc("round", /proc/n_round) - interpreter.SetProc("clamp", /proc/n_clamp) - interpreter.SetProc("inrange", /proc/n_inrange) + interpreter.SetProc("tostring", GLOBAL_PROC_REF(n_num2str)) + interpreter.SetProc("sqrt", GLOBAL_PROC_REF(n_sqrt)) + interpreter.SetProc("abs", GLOBAL_PROC_REF(n_abs)) + interpreter.SetProc("floor", GLOBAL_PROC_REF(n_floor)) + interpreter.SetProc("ceil", GLOBAL_PROC_REF(n_ceil)) + interpreter.SetProc("round", GLOBAL_PROC_REF(n_round)) + interpreter.SetProc("clamp", GLOBAL_PROC_REF(n_clamp)) + interpreter.SetProc("inrange", GLOBAL_PROC_REF(n_inrange)) // End of Donkie~ @@ -278,4 +278,3 @@ var/pass = S.relay_information(newsign, /obj/machinery/telecomms/hub) if(!pass) S.relay_information(newsign, /obj/machinery/telecomms/broadcaster) // send this simple message to broadcasters - diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm index b298e028a7..6754878674 100644 --- a/code/modules/shieldgen/directional_shield.dm +++ b/code/modules/shieldgen/directional_shield.dm @@ -102,13 +102,13 @@ START_PROCESSING(SSobj, src) if(always_on) create_shields() - GLOB.moved_event.register(src, src, .proc/moved_event) + GLOB.moved_event.register(src, src, PROC_REF(moved_event)) return ..() /obj/item/shield_projector/Destroy() destroy_shields() STOP_PROCESSING(SSobj, src) - GLOB.moved_event.unregister(src, src, .proc/moved_event) + GLOB.moved_event.unregister(src, src, PROC_REF(moved_event)) return ..() /obj/item/shield_projector/proc/moved_event() diff --git a/code/modules/shieldgen/energy_shield.dm b/code/modules/shieldgen/energy_shield.dm index 0982b2d3b8..68c03ff1fe 100644 --- a/code/modules/shieldgen/energy_shield.dm +++ b/code/modules/shieldgen/energy_shield.dm @@ -147,7 +147,7 @@ continue // Note: Range is a non-exact aproximation of the spread effect. If it doesn't look good // we'll need to switch to actually walking along the shields to get exact number of steps away. - addtimer(CALLBACK(S, .proc/impact_flash), get_dist(src, S) * 2) + addtimer(CALLBACK(S, PROC_REF(impact_flash)), get_dist(src, S) * 2) impact_flash() // Small visual effect, makes the shield tiles brighten up by becoming more opaque for a moment diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm index 1051ba6c2d..6cfe6ba6a3 100644 --- a/code/modules/shuttles/shuttles_web.dm +++ b/code/modules/shuttles/shuttles_web.dm @@ -208,7 +208,7 @@ /obj/machinery/computer/shuttle_control/web/tgui_data(mob/user) var/list/data = list() - + var/list/routes[0] var/datum/shuttle/autodock/web_shuttle/shuttle = SSshuttles.shuttles[shuttle_tag] if(!istype(shuttle)) @@ -409,10 +409,10 @@ /obj/shuttle_connector/Initialize() . = ..() - GLOB.shuttle_added.register_global(src, .proc/setup_routes) + GLOB.shuttle_added.register_global(src, PROC_REF(setup_routes)) /obj/shuttle_connector/Destroy() - GLOB.shuttle_added.unregister_global(src, .proc/setup_routes) + GLOB.shuttle_added.unregister_global(src, PROC_REF(setup_routes)) . = ..() // This is called whenever a shuttle is initialized. If its our shuttle, do our thing! diff --git a/code/modules/tgs/v3210/api.dm b/code/modules/tgs/v3210/api.dm index 666201a322..1de5917891 100644 --- a/code/modules/tgs/v3210/api.dm +++ b/code/modules/tgs/v3210/api.dm @@ -99,11 +99,7 @@ if(skip_compat_check && !fexists(SERVICE_INTERFACE_DLL)) TGS_ERROR_LOG("Service parameter present but no interface DLL detected. This is symptomatic of running a service less than version 3.1! Please upgrade.") return - #if DM_VERSION >= 515 - call_ext(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval - #else - call(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval - #endif + LIBCALL(SERVICE_INTERFACE_DLL, SERVICE_INTERFACE_FUNCTION)(instance_name, command) //trust no retval return TRUE /datum/tgs_api/v3210/OnTopic(T) diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index a90d69689b..169cd5a3da 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -65,13 +65,13 @@ owner = H if(owner) - GLOB.moved_event.register(owner, src, .proc/update_active_camera_screen) + GLOB.moved_event.register(owner, src, PROC_REF(update_active_camera_screen)) check_whitelist = check_species_whitelist whitelist = species_whitelist blacklist = species_blacklist /datum/tgui_module/appearance_changer/Destroy() - GLOB.moved_event.unregister(owner, src, .proc/update_active_camera_screen) + GLOB.moved_event.unregister(owner, src, PROC_REF(update_active_camera_screen)) last_camera_turf = null qdel(cam_screen) QDEL_LIST(cam_plane_masters) diff --git a/code/modules/tgui/modules/camera.dm b/code/modules/tgui/modules/camera.dm index fa67030d55..5a4551f260 100644 --- a/code/modules/tgui/modules/camera.dm +++ b/code/modules/tgui/modules/camera.dm @@ -34,7 +34,7 @@ cam_screen.assigned_map = map_name cam_screen.del_on_map_removal = FALSE cam_screen.screen_loc = "[map_name]:1,1" - + cam_plane_masters = get_tgui_plane_masters() for(var/obj/screen/instance as anything in cam_plane_masters) @@ -68,7 +68,7 @@ /datum/tgui_module/camera/Destroy() if(active_camera) - GLOB.moved_event.unregister(active_camera, src, .proc/update_active_camera_screen) + GLOB.moved_event.unregister(active_camera, src, PROC_REF(update_active_camera_screen)) active_camera = null last_camera_turf = null qdel(cam_screen) @@ -131,7 +131,7 @@ /datum/tgui_module/camera/tgui_act(action, params) if(..()) return TRUE - + if(action && !issilicon(usr)) playsound(tgui_host(), "terminal_type", 50, 1) @@ -140,9 +140,9 @@ var/list/cameras = get_available_cameras(usr) var/obj/machinery/camera/C = cameras["[ckey(c_tag)]"] if(active_camera) - GLOB.moved_event.unregister(active_camera, src, .proc/update_active_camera_screen) + GLOB.moved_event.unregister(active_camera, src, PROC_REF(update_active_camera_screen)) active_camera = C - GLOB.moved_event.register(active_camera, src, .proc/update_active_camera_screen) + GLOB.moved_event.register(active_camera, src, PROC_REF(update_active_camera_screen)) playsound(tgui_host(), get_sfx("terminal_type"), 25, FALSE) update_active_camera_screen() return TRUE @@ -167,9 +167,9 @@ if(target) if(active_camera) - GLOB.moved_event.unregister(active_camera, src, .proc/update_active_camera_screen) + GLOB.moved_event.unregister(active_camera, src, PROC_REF(update_active_camera_screen)) active_camera = target - GLOB.moved_event.register(active_camera, src, .proc/update_active_camera_screen) + GLOB.moved_event.register(active_camera, src, PROC_REF(update_active_camera_screen)) playsound(tgui_host(), get_sfx("terminal_type"), 25, FALSE) update_active_camera_screen() . = TRUE @@ -273,7 +273,7 @@ // Turn off the console if(length(concurrent_users) == 0 && is_living) if(active_camera) - GLOB.moved_event.unregister(active_camera, src, .proc/update_active_camera_screen) + GLOB.moved_event.unregister(active_camera, src, PROC_REF(update_active_camera_screen)) active_camera = null playsound(tgui_host(), 'sound/machines/terminal_off.ogg', 25, FALSE) @@ -298,4 +298,3 @@ /datum/tgui_module/camera/bigscreen/tgui_state(mob/user) return GLOB.tgui_physical_state_bigscreen - \ No newline at end of file diff --git a/code/modules/tgui/modules/ntos-only/uav.dm b/code/modules/tgui/modules/ntos-only/uav.dm index 54dcda1675..eec4a42078 100644 --- a/code/modules/tgui/modules/ntos-only/uav.dm +++ b/code/modules/tgui/modules/ntos-only/uav.dm @@ -30,7 +30,7 @@ var/list/paired_map = list() var/obj/item/modular_computer/mc_host = tgui_host() if(istype(mc_host)) - for(var/weakref/wr as anything in mc_host.paired_uavs) + for(var/datum/weakref/wr as anything in mc_host.paired_uavs) var/obj/item/device/uav/U = wr.resolve() paired_map.Add(list(list("name" = "[U ? U.nickname : "!!Missing!!"]", "uavref" = "\ref[U]"))) @@ -40,7 +40,7 @@ /datum/tgui_module/uav/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) if(..()) return TRUE - + switch(action) if("switch_uav") var/obj/item/device/uav/U = locate(params["switch_uav"]) //This is a \ref to the UAV itself @@ -59,9 +59,9 @@ var/refstring = params["del_uav"] //This is a \ref to the UAV itself var/obj/item/modular_computer/mc_host = tgui_host() //This is so we can really scrape up any weakrefs that can't resolve - for(var/weakref/wr in mc_host.paired_uavs) - if(wr.ref == refstring) - if(current_uav?.weakref == wr) + for(var/datum/weakref/wr in mc_host.paired_uavs) + if(wr.reference == refstring) + if(current_uav?.weak_reference == wr) set_current(null) LAZYREMOVE(mc_host.paired_uavs, wr) return TRUE @@ -82,7 +82,7 @@ else if(current_uav.toggle_power()) //Clean up viewers faster if(LAZYLEN(viewers)) - for(var/weakref/W in viewers) + for(var/datum/weakref/W in viewers) var/M = W.resolve() if(M) unlook(M) @@ -94,10 +94,10 @@ signal_strength = 0 current_uav = U - RegisterSignal(U, COMSIG_MOVABLE_Z_CHANGED, .proc/current_uav_changed_z) + RegisterSignal(U, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(current_uav_changed_z)) if(LAZYLEN(viewers)) - for(var/weakref/W in viewers) + for(var/datum/weakref/W in viewers) var/M = W.resolve() if(M) look(M) @@ -111,7 +111,7 @@ current_uav = null if(LAZYLEN(viewers)) - for(var/weakref/W in viewers) + for(var/datum/weakref/W in viewers) var/M = W.resolve() if(M) to_chat(M, "You're disconnected from the UAV's camera!") @@ -172,7 +172,7 @@ /* All handling viewers */ /datum/tgui_module/uav/Destroy() if(LAZYLEN(viewers)) - for(var/weakref/W in viewers) + for(var/datum/weakref/W in viewers) var/M = W.resolve() if(M) unlook(M) @@ -191,7 +191,7 @@ unlook(user) /datum/tgui_module/uav/proc/viewing_uav(mob/user) - return (weakref(user) in viewers) + return (WEAKREF(user) in viewers) /datum/tgui_module/uav/proc/look(mob/user) if(issilicon(user)) //Too complicated for me to want to mess with at the moment @@ -205,14 +205,14 @@ user.set_machine(tgui_host()) user.reset_view(current_uav) current_uav.add_master(user) - LAZYDISTINCTADD(viewers, weakref(user)) + LAZYDISTINCTADD(viewers, WEAKREF(user)) /datum/tgui_module/uav/proc/unlook(mob/user) user.unset_machine() user.reset_view() if(current_uav) current_uav.remove_master(user) - LAZYREMOVE(viewers, weakref(user)) + LAZYREMOVE(viewers, WEAKREF(user)) /datum/tgui_module/uav/check_eye(mob/user) if(get_dist(user, tgui_host()) > 1 || user.blinded || !current_uav) @@ -239,7 +239,7 @@ /datum/tgui_module/uav/apply_visual(mob/M) if(!M.client) return - if(weakref(M) in viewers) + if(WEAKREF(M) in viewers) M.overlay_fullscreen("fishbed",/obj/screen/fullscreen/fishbed) M.overlay_fullscreen("scanlines",/obj/screen/fullscreen/scanline) diff --git a/code/modules/tgui/modules/overmap.dm b/code/modules/tgui/modules/overmap.dm index 13d80d9f93..2bdca28b93 100644 --- a/code/modules/tgui/modules/overmap.dm +++ b/code/modules/tgui/modules/overmap.dm @@ -11,7 +11,7 @@ /datum/tgui_module/ship/Destroy() if(LAZYLEN(viewers)) - for(var/weakref/W in viewers) + for(var/datum/weakref/W in viewers) var/M = W.resolve() if(M) unlook(M) @@ -56,16 +56,16 @@ user.reset_view(linked) user.set_viewsize(world.view + extra_view) GLOB.moved_event.register(user, src, /datum/tgui_module/ship/proc/unlook) - LAZYDISTINCTADD(viewers, weakref(user)) + LAZYDISTINCTADD(viewers, WEAKREF(user)) /datum/tgui_module/ship/proc/unlook(var/mob/user) user.reset_view() user.set_viewsize() // reset to default GLOB.moved_event.unregister(user, src, /datum/tgui_module/ship/proc/unlook) - LAZYREMOVE(viewers, weakref(user)) + LAZYREMOVE(viewers, WEAKREF(user)) /datum/tgui_module/ship/proc/viewing_overmap(mob/user) - return (weakref(user) in viewers) + return (WEAKREF(user) in viewers) /datum/tgui_module/ship/check_eye(var/mob/user) if(!get_dist(user, tgui_host()) > 1 || user.blinded || !linked) @@ -457,4 +457,4 @@ /datum/tgui_module/ship/fullmonty/attempt_hook_up_recursive() return /datum/tgui_module/ship/fullmonty/attempt_hook_up() - return \ No newline at end of file + return diff --git a/code/modules/tgui/tgui.dm b/code/modules/tgui/tgui.dm index 39835cc8c7..5c39c756ad 100644 --- a/code/modules/tgui/tgui.dm +++ b/code/modules/tgui/tgui.dm @@ -197,7 +197,7 @@ return //if(!COOLDOWN_FINISHED(src, refresh_cooldown)) //refreshing = TRUE - //addtimer(CALLBACK(src, .proc/send_full_update), TGUI_REFRESH_FULL_UPDATE_COOLDOWN, TIMER_UNIQUE) + //addtimer(CALLBACK(src, PROC_REF(send_full_update)), TGUI_REFRESH_FULL_UPDATE_COOLDOWN, TIMER_UNIQUE) //return //refreshing = FALSE var/should_update_data = force || status >= STATUS_UPDATE diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index 77570c686c..d2cf51e632 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -89,7 +89,7 @@ Notes: /datum/tooltip/proc/hide() if (queueHide) - addtimer(CALLBACK(src, .proc/do_hide), 1) + addtimer(CALLBACK(src, PROC_REF(do_hide)), 1) else do_hide() diff --git a/code/modules/vchat/vchat_client.dm b/code/modules/vchat/vchat_client.dm index 3fc8e0c98b..3ef89ec260 100644 --- a/code/modules/vchat/vchat_client.dm +++ b/code/modules/vchat/vchat_client.dm @@ -310,7 +310,7 @@ GLOBAL_LIST_EMPTY(bicon_cache) // Cache of the tag results, not the icons base64 = icon2base64(A.examine_icon(), key) GLOB.bicon_cache[key] = base64 if(changes_often) - addtimer(CALLBACK(GLOBAL_PROC, .proc/expire_bicon_cache, key), 50 SECONDS, TIMER_UNIQUE) + addtimer(CALLBACK(GLOBAL_PROC, PROC_REF(expire_bicon_cache), key), 50 SECONDS, TIMER_UNIQUE) // May add a class to the img tag created by bicon if(use_class) diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 02960e0a4b..669da3b101 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -55,6 +55,11 @@ var/next_emote = 0 // When we're supposed to print our next emote, as a world.time var/selective_preference = DM_DIGEST // Which type of selective bellymode do we default to? var/eating_privacy_local = "default" //Overrides eating_privacy_global if not "default". Determines if attempt/success messages are subtle/loud + var/silicon_belly_overlay_preference = "Sleeper" //Selects between placing belly overlay in sleeper or normal vore mode. Exclusive + var/visible_belly_minimum_prey = 1 //What LAZYLEN(vore_selected.contents) we require to show the belly. Customizable + var/overlay_min_prey_size = 0 //Minimum prey size for belly overlay to show. 0 to disable + var/override_min_prey_size = FALSE //If true, exceeding override prey number will override minimum size requirements + var/override_min_prey_num = 1 //We check belly contents against this to override min size // Generally just used by AI var/autotransferchance = 0 // % Chance of prey being autotransferred to transfer location @@ -162,8 +167,8 @@ var/disable_hud = FALSE var/colorization_enabled = FALSE var/belly_fullscreen_color = "#823232" - - + var/belly_fullscreen_color_secondary = "#428242" + var/belly_fullscreen_color_trinary = "#f0f0f0" //For serialization, keep this updated, required for bellies to save correctly. /obj/belly/vars_to_save() @@ -225,10 +230,17 @@ "belly_fullscreen", "disable_hud", "belly_fullscreen_color", + "belly_fullscreen_color_secondary", + "belly_fullscreen_color_trinary", "colorization_enabled", "egg_type", "save_digest_mode", - "eating_privacy_local" + "eating_privacy_local", + "silicon_belly_overlay_preference", + "visible_belly_minimum_prey", + "overlay_min_prey_size", + "override_min_prey_size", + "override_min_prey_num", ) if (save_digest_mode == 1) @@ -298,7 +310,7 @@ // Intended for simple mobs if(!owner.client && autotransferlocation && autotransferchance > 0) - addtimer(CALLBACK(src, /obj/belly/.proc/check_autotransfer, thing, autotransferlocation), autotransferwait) + addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/belly, check_autotransfer), thing, autotransferlocation), autotransferwait) // Called whenever an atom leaves this belly /obj/belly/Exited(atom/movable/thing, atom/OldLoc) @@ -306,6 +318,9 @@ if(isliving(thing) && !isbelly(thing.loc)) var/mob/living/L = thing L.clear_fullscreen("belly") + L.clear_fullscreen("belly2") + L.clear_fullscreen("belly3") + L.clear_fullscreen("belly4") if(L.hud_used) if(!L.hud_used.hud_shown) L.toggle_hud_vis() @@ -326,16 +341,25 @@ var/obj/screen/fullscreen/F = L.overlay_fullscreen("belly", /obj/screen/fullscreen/belly/colorized) F.icon_state = belly_fullscreen F.color = belly_fullscreen_color - /* //Allows for 'multilayered' stomachs. Currently not implemented. - if(b_multilayered) - var/obj/screen/fullscreen/F2 = L.overlay_fullscreen("belly2", /obj/screen/fullscreen/belly) - */ + if("[belly_fullscreen]_l1" in icon_states('icons/mob/screen_full_colorized_vore_overlays.dmi')) + var/obj/screen/fullscreen/F2 = L.overlay_fullscreen("belly2", /obj/screen/fullscreen/belly/colorized/overlay) + F2.icon_state = "[belly_fullscreen]_l1" + F2.color = belly_fullscreen_color_secondary + if("[belly_fullscreen]_l2" in icon_states('icons/mob/screen_full_colorized_vore_overlays.dmi')) + var/obj/screen/fullscreen/F3 = L.overlay_fullscreen("belly3", /obj/screen/fullscreen/belly/colorized/overlay) + F3.icon_state = "[belly_fullscreen]_l2" + F3.color = belly_fullscreen_color_trinary + if("[belly_fullscreen]_nc" in icon_states('icons/mob/screen_full_colorized_vore_overlays.dmi')) + var/obj/screen/fullscreen/F4 = L.overlay_fullscreen("belly4", /obj/screen/fullscreen/belly/colorized/overlay) + F4.icon_state = "[belly_fullscreen]_nc" else var/obj/screen/fullscreen/F = L.overlay_fullscreen("belly", /obj/screen/fullscreen/belly) F.icon_state = belly_fullscreen else L.clear_fullscreen("belly") - //L.clear_fullscreen("belly2") //Allows for 'multilayered' stomachs. Currently not implemented. + L.clear_fullscreen("belly2") + L.clear_fullscreen("belly3") + L.clear_fullscreen("belly4") if(disable_hud) if(L?.hud_used?.hud_shown) @@ -353,19 +377,31 @@ var/obj/screen/fullscreen/F = L.overlay_fullscreen("belly", /obj/screen/fullscreen/belly/colorized) F.icon_state = belly_fullscreen F.color = belly_fullscreen_color - /* //Allows for 'multilayered' stomachs. Currently not implemented. - if(b_multilayered) - var/obj/screen/fullscreen/F2 = L.overlay_fullscreen("belly2", /obj/screen/fullscreen/belly) - */ + if("[belly_fullscreen]_l1" in icon_states('icons/mob/screen_full_colorized_vore_overlays.dmi')) + var/obj/screen/fullscreen/F2 = L.overlay_fullscreen("belly2", /obj/screen/fullscreen/belly/colorized/overlay) + F2.icon_state = "[belly_fullscreen]_l1" + F2.color = belly_fullscreen_color_secondary + if("[belly_fullscreen]_l2" in icon_states('icons/mob/screen_full_colorized_vore_overlays.dmi')) + var/obj/screen/fullscreen/F3 = L.overlay_fullscreen("belly3", /obj/screen/fullscreen/belly/colorized/overlay) + F3.icon_state = "[belly_fullscreen]_l2" + F3.color = belly_fullscreen_color_trinary + if("[belly_fullscreen]_nc" in icon_states('icons/mob/screen_full_colorized_vore_overlays.dmi')) + var/obj/screen/fullscreen/F4 = L.overlay_fullscreen("belly4", /obj/screen/fullscreen/belly/colorized/overlay) + F4.icon_state = "[belly_fullscreen]_nc" else var/obj/screen/fullscreen/F = L.overlay_fullscreen("belly", /obj/screen/fullscreen/belly) F.icon_state = belly_fullscreen else L.clear_fullscreen("belly") - //L.clear_fullscreen("belly2") //Allows for 'multilayered' stomachs. Currently not implemented. + L.clear_fullscreen("belly2") + L.clear_fullscreen("belly3") + L.clear_fullscreen("belly4") /obj/belly/proc/clear_preview(mob/living/L) L.clear_fullscreen("belly") + L.clear_fullscreen("belly2") + L.clear_fullscreen("belly3") + L.clear_fullscreen("belly4") @@ -1144,6 +1180,7 @@ owner.update_icon() for(var/mob/living/M in contents) M.updateVRPanel() + owner.updateicon() //Autotransfer callback /obj/belly/proc/check_autotransfer(var/prey, var/autotransferlocation) @@ -1159,7 +1196,7 @@ else // Didn't transfer, so wait before retrying // I feel like there's a way to make this timer looping using the normal looping thing, but pass in the ID and cancel it if we aren't looping again - addtimer(CALLBACK(src, .proc/check_autotransfer, prey, autotransferlocation), autotransferwait) + addtimer(CALLBACK(src, PROC_REF(check_autotransfer), prey, autotransferlocation), autotransferwait) // Belly copies and then returns the copy // Needs to be updated for any var changes @@ -1207,6 +1244,8 @@ dupe.belly_fullscreen = belly_fullscreen dupe.disable_hud = disable_hud dupe.belly_fullscreen_color = belly_fullscreen_color + dupe.belly_fullscreen_color_secondary = belly_fullscreen_color_secondary + dupe.belly_fullscreen_color_trinary = belly_fullscreen_color_trinary dupe.colorization_enabled = colorization_enabled dupe.egg_type = egg_type dupe.emote_time = emote_time @@ -1214,6 +1253,11 @@ dupe.selective_preference = selective_preference dupe.save_digest_mode = save_digest_mode dupe.eating_privacy_local = eating_privacy_local + dupe.silicon_belly_overlay_preference = silicon_belly_overlay_preference + dupe.visible_belly_minimum_prey = visible_belly_minimum_prey + dupe.overlay_min_prey_size = overlay_min_prey_size + dupe.override_min_prey_size = override_min_prey_size + dupe.override_min_prey_num = override_min_prey_num //// Object-holding variables //struggle_messages_outside - strings diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 66739c747b..65c776e51b 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -279,8 +279,6 @@ P.can_be_drop_pred = src.can_be_drop_pred P.allow_inbelly_spawning = src.allow_inbelly_spawning P.allow_spontaneous_tf = src.allow_spontaneous_tf - P.appendage_color = src.appendage_color - P.appendage_alt_setting = src.appendage_alt_setting P.step_mechanics_pref = src.step_mechanics_pref P.pickup_pref = src.pickup_pref P.drop_vore = src.drop_vore @@ -329,8 +327,6 @@ can_be_drop_pred = P.can_be_drop_pred allow_inbelly_spawning = P.allow_inbelly_spawning allow_spontaneous_tf = P.allow_spontaneous_tf - appendage_color = P.appendage_color - appendage_alt_setting = P.appendage_alt_setting step_mechanics_pref = P.step_mechanics_pref pickup_pref = P.pickup_pref drop_vore = P.drop_vore @@ -665,6 +661,8 @@ else belly.nom_mob(prey, user) + user.updateicon() + // Inform Admins if(pred == user) add_attack_logs(pred, prey, "Eaten via [belly.name]") @@ -1110,6 +1108,9 @@ /obj/screen/fullscreen/belly/colorized icon = 'icons/mob/screen_full_colorized_vore.dmi' +/obj/screen/fullscreen/belly/colorized/overlay + icon = 'icons/mob/screen_full_colorized_vore_overlays.dmi' + /mob/living/proc/vorebelly_printout() //Spew the vorepanel belly messages into chat window for copypasting. set name = "X-Print Vorebelly Settings" set category = "Preferences" @@ -1193,7 +1194,7 @@ /datum/component/vore_panel/RegisterWithParent() . = ..() - RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, .proc/create_mob_button) + RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, PROC_REF(create_mob_button)) var/mob/living/owner = parent if(owner.client) create_mob_button(parent) @@ -1215,7 +1216,7 @@ var/datum/hud/HUD = user.hud_used if(!screen_icon) screen_icon = new() - RegisterSignal(screen_icon, COMSIG_CLICK, .proc/vore_panel_click) + RegisterSignal(screen_icon, COMSIG_CLICK, PROC_REF(vore_panel_click)) if(ispAI(user)) screen_icon.icon = 'icons/mob/pai_hud.dmi' screen_icon.screen_loc = ui_acti @@ -1229,7 +1230,7 @@ /datum/component/vore_panel/proc/vore_panel_click(source, location, control, params, user) var/mob/living/owner = user if(istype(owner) && owner.vorePanel) - INVOKE_ASYNC(owner.vorePanel, .proc/tgui_interact, user) + INVOKE_ASYNC(owner.vorePanel, PROC_REF(tgui_interact), user) /** * Screen object for vore panel diff --git a/code/modules/vore/eating/simple_animal_vr.dm b/code/modules/vore/eating/simple_animal_vr.dm index 2c3a2be26b..e18d93fe36 100644 --- a/code/modules/vore/eating/simple_animal_vr.dm +++ b/code/modules/vore/eating/simple_animal_vr.dm @@ -88,14 +88,14 @@ for(var/mob/living/L in living_mobs(0)) //add everyone on the tile to the do-not-eat list for a while if(!(LAZYFIND(prey_excludes, L))) // Unless they're already on it, just to avoid fuckery. LAZYSET(prey_excludes, L, world.time) - addtimer(CALLBACK(src, .proc/removeMobFromPreyExcludes, weakref(L)), 5 MINUTES) + addtimer(CALLBACK(src, PROC_REF(removeMobFromPreyExcludes), WEAKREF(L)), 5 MINUTES) else if(istype(O, /obj/item/device/healthanalyzer)) var/healthpercent = health/maxHealth*100 to_chat(user, "[src] seems to be [healthpercent]% healthy.") else ..() -/mob/living/simple_mob/proc/removeMobFromPreyExcludes(weakref/target) +/mob/living/simple_mob/proc/removeMobFromPreyExcludes(datum/weakref/target) if(isweakref(target)) var/mob/living/L = target.resolve() LAZYREMOVE(prey_excludes, L) // It's fine to remove a null from the list if we couldn't resolve L diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm index 7911fcc09f..fab0ccdede 100644 --- a/code/modules/vore/eating/vore_vr.dm +++ b/code/modules/vore/eating/vore_vr.dm @@ -71,8 +71,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE var/list/belly_prefs = list() var/vore_taste = "nothing in particular" var/vore_smell = "nothing in particular" - var/appendage_color = "#e03997" //Default pink. Used for the 'long_vore' trait. - var/appendage_alt_setting = 0 //Decides if appendage user is thrown at target or not. var/selective_preference = DM_DEFAULT @@ -174,8 +172,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE vore_smell = json_from_file["vore_smell"] permit_healbelly = json_from_file["permit_healbelly"] noisy = json_from_file["noisy"] - appendage_color = json_from_file["appendage_color"] - appendage_alt_setting = json_from_file["appendage_alt_setting"] selective_preference = json_from_file["selective_preference"] show_vore_fx = json_from_file["show_vore_fx"] can_be_drop_prey = json_from_file["can_be_drop_prey"] @@ -216,10 +212,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE selective_preference = DM_DEFAULT if (isnull(noisy)) noisy = FALSE - if (isnull(appendage_color)) - appendage_color = "#e03997" - if (isnull(appendage_alt_setting)) - appendage_alt_setting = 0 if(isnull(show_vore_fx)) show_vore_fx = TRUE if(isnull(can_be_drop_prey)) @@ -301,8 +293,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE "vore_smell" = vore_smell, "permit_healbelly" = permit_healbelly, "noisy" = noisy, - "appendage_color" = appendage_color, - "appendage_alt_setting" = appendage_alt_setting, "selective_preference" = selective_preference, "show_vore_fx" = show_vore_fx, "can_be_drop_prey" = can_be_drop_prey, diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 4a222d72ce..b73a448580 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -8,6 +8,12 @@ #define BELLIES_DESC_MAX 4096 #define FLAVOR_MAX 400 +//INSERT COLORIZE-ONLY STOMACHS HERE +var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", + "a_synth_flesh_mono_hole", + "a_anim_belly", + "multi_layer_test_tummy") + /mob/living var/datum/vore_look/vorePanel @@ -143,6 +149,18 @@ inside["contents"] = inside_contents data["inside"] = inside + var/is_dogborg = FALSE + var/is_vore_simple_mob = FALSE + if(isrobot(host)) + var/mob/living/silicon/robot/R = host + is_dogborg = R.dogborg + else if(istype(host, /mob/living/simple_mob/vore)) //So far, this does nothing. But, creating this for future belly work + is_vore_simple_mob = TRUE + data["host_mobtype"] = list( + "is_dogborg" = is_dogborg, + "is_vore_simple_mob" = is_vore_simple_mob + ) + var/list/our_bellies = list() for(var/obj/belly/B as anything in host.vore_organs) our_bellies.Add(list(list( @@ -190,8 +208,16 @@ "weight_ex" = host.weight_message_visible, "belly_fullscreen" = selected.belly_fullscreen, "belly_fullscreen_color" = selected.belly_fullscreen_color, + "belly_fullscreen_color_secondary" = selected.belly_fullscreen_color_secondary, + "belly_fullscreen_color_trinary" = selected.belly_fullscreen_color_trinary, "colorization_enabled" = selected.colorization_enabled, - "eating_privacy_local" = selected.eating_privacy_local + "eating_privacy_local" = selected.eating_privacy_local, + "silicon_belly_overlay_preference" = selected.silicon_belly_overlay_preference, + "visible_belly_minimum_prey" = selected.visible_belly_minimum_prey, + "overlay_min_prey_size" = selected.overlay_min_prey_size, + "override_min_prey_size" = selected.override_min_prey_size, + "override_min_prey_num" = selected.override_min_prey_num, + ) var/list/addons = list() @@ -223,6 +249,8 @@ selected_list["disable_hud"] = selected.disable_hud selected_list["colorization_enabled"] = selected.colorization_enabled selected_list["belly_fullscreen_color"] = selected.belly_fullscreen_color + selected_list["belly_fullscreen_color_secondary"] = selected.belly_fullscreen_color_secondary + selected_list["belly_fullscreen_color_trinary"] = selected.belly_fullscreen_color_trinary if(selected.colorization_enabled) selected_list["possible_fullscreens"] = icon_states('icons/mob/screen_full_colorized_vore.dmi') //Makes any icons inside of here selectable. @@ -234,10 +262,7 @@ //Why? I have no flipping clue. As you can see above, vore_colorized is included in the assets but isn't working. It makes no sense. //I can only imagine this is a BYOND/TGUI issue with the cache. If you can figure out how to fix this and make it so you only need to //include things in full_colorized_vore, that would be great. For now, this is the only workaround that I could get to work. - selected_list["possible_fullscreens"] -= "a_synth_flesh_mono" - selected_list["possible_fullscreens"] -= "a_synth_flesh_mono_hole" - selected_list["possible_fullscreens"] -= "a_anim_belly" - //INSERT COLORIZE-ONLY STOMACHS HERE + selected_list["possible_fullscreens"] -= belly_colorable_only_fullscreens var/list/selected_contents = list() for(var/O in selected) @@ -273,8 +298,6 @@ "can_be_drop_pred" = host.can_be_drop_pred, "allow_inbelly_spawning" = host.allow_inbelly_spawning, "allow_spontaneous_tf" = host.allow_spontaneous_tf, - "appendage_color" = host.appendage_color, - "appendage_alt_setting" = host.appendage_alt_setting, "step_mechanics_active" = host.step_mechanics_pref, "pickup_mechanics_active" = host.pickup_pref, "noisy" = host.noisy, @@ -286,7 +309,7 @@ "nutrition_messages" = host.nutrition_messages, "weight_message_visible" = host.weight_message_visible, "weight_messages" = host.weight_messages, - "eating_privacy_global" = host.eating_privacy_global + "eating_privacy_global" = host.eating_privacy_global, ) return data @@ -518,7 +541,9 @@ host.client.prefs_vr.show_vore_fx = host.show_vore_fx if(!host.show_vore_fx) host.clear_fullscreen("belly") - //host.clear_fullscreen("belly2") //For multilayered stomachs. Not currently implemented. + host.clear_fullscreen("belly2") + host.clear_fullscreen("belly3") + host.clear_fullscreen("belly4") if(!host.hud_used.hud_shown) host.toggle_hud_vis() unsaved_changes = TRUE @@ -1115,6 +1140,51 @@ return FALSE host.vore_selected.eating_privacy_local = privacy_choice . = TRUE + if("b_silicon_belly") + var/belly_choice = tgui_alert(usr, "Choose whether you'd like your belly overlay to show from sleepers \ + or from normal vore bellies. NOTE: This ONLY applies to silicons, not human mobs!", "Belly Overlay Preference", + list("Sleeper", "Vorebelly")) + if(belly_choice == null) + return FALSE + host.vore_selected.silicon_belly_overlay_preference = belly_choice + host.updateicon() + . = TRUE + if("b_min_belly_number_flat") + var/new_min_belly = tgui_input_number(user, "Choose the amount of prey your belly must contain \ + at absolute minimum (should be lower or equal to minimum prey override if prey override is ON)", + "Set minimum prey amount", host.vore_selected.visible_belly_minimum_prey, max_value = 100, min_value = 1) + if(new_min_belly == null) + return FALSE + var/new_new_min_belly = CLAMP(new_min_belly, 1, 100) //Clamping at 100 rather than infinity. Should be close to infinity tho. + host.vore_selected.visible_belly_minimum_prey = new_new_min_belly + host.updateicon() + . = TRUE + if("b_min_belly_prey_size") + var/new_belly_size = tgui_input_number(user, "Choose the required size prey must be to trigger belly overlay, \ + ranging from 25% to 200%. Set to 0 to disable size checks", "Set Belly Examine Size.", max_value = 200, min_value = 0) + if(new_belly_size == null) + return FALSE + else if(new_belly_size == 0) + host.vore_selected.overlay_min_prey_size = 0 + else + var/new_new_belly_size = CLAMP(new_belly_size, 25, 200) + host.vore_selected.overlay_min_prey_size = (new_new_belly_size/100) + host.updateicon() + . = TRUE + if("b_override_min_belly_prey_size") + host.vore_selected.override_min_prey_size = !host.vore_selected.override_min_prey_size + host.updateicon() + . = TRUE + if("b_min_belly_number_override") + var/new_min_prey = tgui_input_number(user, "Choose the amount of prey your belly must contain to override min prey size \ + to show belly overlay ignoring prey size requirement. Toggle Prey Override MUST be ON to work", + "Set minimum prey amount", host.vore_selected.override_min_prey_num, max_value = 100, min_value = 1) + if(new_min_prey == null) + return FALSE + var/new_new_min_prey = CLAMP(new_min_prey, 1, 100) //Clamping at 100 rather than infinity. Should be close to infinity tho. + host.vore_selected.override_min_prey_num = new_new_min_prey + host.updateicon() + . = TRUE if("b_fancy_sound") host.vore_selected.fancy_vore = !host.vore_selected.fancy_vore host.vore_selected.vore_sound = "Gulp" @@ -1339,6 +1409,16 @@ if(newcolor) host.vore_selected.belly_fullscreen_color = newcolor . = TRUE + if("b_fullscreen_color_secondary") + var/newcolor = input(usr, "Choose a color.", "", host.vore_selected.belly_fullscreen_color) as color|null + if(newcolor) + host.vore_selected.belly_fullscreen_color_secondary = newcolor + . = TRUE + if("b_fullscreen_color_trinary") + var/newcolor = input(usr, "Choose a color.", "", host.vore_selected.belly_fullscreen_color) as color|null + if(newcolor) + host.vore_selected.belly_fullscreen_color_trinary = newcolor + . = TRUE if("b_save_digest_mode") host.vore_selected.save_digest_mode = !host.vore_selected.save_digest_mode . = TRUE diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index f93f829553..d306a576ed 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -2635,3 +2635,45 @@ Departamental Swimsuits, for general use var/mob/M = loc M.update_inv_wear_mask() usr.update_action_buttons() + +/obj/item/clothing/suit/storage/toggle/labcoat/fluff/zeracloak + name = "Grand Purple Cloak" + desc = "Zera's custom-designed purple cloak. Nice and spooky, and the perfect length to hold up over your face with one hand like Count von Count." + + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "grand_purple_cloak" + + icon_override = 'icons/vore/custom_clothes_vr.dmi' + item_state = "grand_purple_cloak" + +/obj/item/clothing/suit/storage/toggle/labcoat/fluff/zeracloak/toggle() + set name = "Toggle Coat Buttons" + set category = "Object" + set src in usr + if(!usr.canmove || usr.stat || usr.restrained()) + return 0 + + if(open == 1) //Will check whether icon state is currently set to the "open" or "closed" state and switch it around with a message to the user + open = 0 + icon_state = initial(icon_state) + item_state = initial(item_state) + flags_inv = HIDETIE|HIDEHOLSTER + to_chat(usr, "You button up the coat.") + else if(open == 0) + open = 1 + icon_state = "[icon_state]_open" + item_state = "[item_state]_open" + flags_inv = HIDEHOLSTER + to_chat(usr, "You unbutton the coat.") + else //in case some goofy admin switches icon states around without switching the icon_open or icon_closed + to_chat(usr, "You attempt to button-up the velcro on your [src], before promptly realising how silly you are.") + return + update_clothing_icon() //so our overlays update + +/obj/item/clothing/head/fluff/zerahat + name = "Grand Purple Hat" + desc = "It's a pointy purple hat. Zera likes it because it matches her ominous purple cloak." + icon = 'icons/vore/custom_clothes_vr.dmi' + icon_override = 'icons/vore/custom_clothes_vr.dmi' + icon_state = "grand_purple_cloak_hat" + item_state = "grand_purple_cloak_hat_onmob" diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm index c0b7dbbfcf..d8fd0d8203 100644 --- a/code/modules/vore/resizing/resize_vr.dm +++ b/code/modules/vore/resizing/resize_vr.dm @@ -70,9 +70,14 @@ /** * Resizes the mob immediately to the desired mod, animating it growing/shrinking. * It can be used by anything that calls it. + * + * Arguments: + * * new_size - CHANGE_ME. + * * animate - CHANGE_ME. Default: TRUE + * * uncapped - CHANGE_ME. Default: FALSE + * * ignore_prefs - CHANGE_ME. Default: FALSE + * * aura_animation - CHANGE_ME. Default: TRUE */ - - /mob/living/proc/resize(var/new_size, var/animate = TRUE, var/uncapped = FALSE, var/ignore_prefs = FALSE, var/aura_animation = TRUE) if(!uncapped) new_size = clamp(new_size, RESIZE_MINIMUM, RESIZE_MAXIMUM) diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm index f09077ee4b..4088c22aed 100644 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -25,7 +25,7 @@ /obj/item/weapon/gun/energy/sizegun/New() ..() - verbs += .proc/select_size + verbs += PROC_REF(select_size) /obj/item/weapon/gun/energy/sizegun/attack_self(mob/user) . = ..() @@ -192,4 +192,4 @@ muzzle_type = /obj/effect/projectile/muzzle/darkmatter tracer_type = /obj/effect/projectile/tracer/darkmatter - impact_type = /obj/effect/projectile/impact/darkmatter \ No newline at end of file + impact_type = /obj/effect/projectile/impact/darkmatter diff --git a/code/modules/webhooks/_webhook.dm b/code/modules/webhooks/_webhook.dm index e7cfb646cd..f1cf4841c4 100644 --- a/code/modules/webhooks/_webhook.dm +++ b/code/modules/webhooks/_webhook.dm @@ -10,7 +10,7 @@ if (!target_url) return -1 - var/result = call(HTTP_POST_DLL_LOCATION, "send_post_request")(target_url, payload, json_encode(list("Content-Type" = "application/json"))) + var/result = LIBCALL(HTTP_POST_DLL_LOCATION, "send_post_request")(target_url, payload, json_encode(list("Content-Type" = "application/json"))) result = cached_json_decode(result) if (result["error_code"]) diff --git a/code/unit_tests/integrated_circuits/logic.dm b/code/unit_tests/integrated_circuits/logic.dm index a022078c07..786d981778 100644 --- a/code/unit_tests/integrated_circuits/logic.dm +++ b/code/unit_tests/integrated_circuits/logic.dm @@ -37,7 +37,7 @@ /datum/unit_test/integrated_circuits/equals_6/arrange() A = new(get_standard_turf()) - inputs_to_give = list(weakref(A), weakref(A)) + inputs_to_give = list(WEAKREF(A), WEAKREF(A)) ..() /datum/unit_test/integrated_circuits/equals_6/clean_up() @@ -55,7 +55,7 @@ /datum/unit_test/integrated_circuits/equals_7/arrange() A = new(get_standard_turf()) B = new(get_standard_turf()) - inputs_to_give = list(weakref(A), weakref(B)) + inputs_to_give = list(WEAKREF(A), WEAKREF(B)) ..() /datum/unit_test/integrated_circuits/equals_7/clean_up() @@ -209,4 +209,4 @@ name = "Logic Circuits: Not - Invert to True" circuit_type = /obj/item/integrated_circuit/logic/unary/not inputs_to_give = list(0) - expected_outputs = list(1) \ No newline at end of file + expected_outputs = list(1) diff --git a/code/world.dm b/code/world.dm index 8e76fd11d7..de9d4261c4 100644 --- a/code/world.dm +++ b/code/world.dm @@ -1,8 +1,21 @@ -//Global init and the rest of world's code have been moved to code/global_init.dm and code/game/world.dm respectively. +//This file is just for the necessary /world definition +//Try looking in /code/game/world.dm, where initialization order is defined + +/** + * # World + * + * Two possibilities exist: either we are alone in the Universe or we are not. Both are equally terrifying. ~ Arthur C. Clarke + * + * The byond world object stores some basic byond level config, and has a few hub specific procs for managing hub visiblity + */ /world mob = /mob/new_player turf = /turf/space area = /area/space view = "15x15" + hub = "Exadv1.spacestation13" + hub_password = "kMZy3U5jJHSiBQjr" + name = "VOREStation" //VOREStation Edit + visibility = 0 //VOREStation Edit cache_lifespan = 7 fps = 20 // If this isnt hard-defined, anything relying on this variable before world load will cry a lot diff --git a/config/jukebox.json b/config/jukebox.json index 05bc23ec30..662d315869 100644 --- a/config/jukebox.json +++ b/config/jukebox.json @@ -3533,6 +3533,7 @@ "url": "https://files.catbox.moe/8rn8uz.mp3", "title": "I Wupped Batman's Ass", "duration": 3270, +"genre": "Miscellaneous", "artist": "Wesley Willis Fiasco", "secret": true, "lobby": false, @@ -3973,6 +3974,7 @@ "url": "https://files.catbox.moe/3h38kn.mp3", "title": "Among Us", "duration": 720, +"artist": "Leonz", "genre": "Disco, Funk, Soul, and R&B", "secret": false, "lobby": false, @@ -3982,6 +3984,7 @@ "url": "https://files.catbox.moe/rqhxj1.mp3", "title": "Leggy Zone", "duration": 1470, +"artist": "Binox", "genre": "Electronic", "secret": true, "lobby": false, @@ -3991,6 +3994,7 @@ "url": "https://files.catbox.moe/e6l6mw.mp3", "title": "Shop Theme", "duration": 8910, +"artist": "Kazumi Totaka/Nintendo", "genre": "Electronic", "secret": false, "lobby": false, @@ -4700,6 +4704,7 @@ "url": "https://files.catbox.moe/8r5d7q.mp3", "title": "Take me to Snurch (Snail Church)", "duration": 2370, +"genre": "Pop", "artist": "fairyeiry", "secret": true, "lobby": false, diff --git a/icons/_nanomaps/tether_nanomap_z1.png b/icons/_nanomaps/tether_nanomap_z1.png index f6188b7881..cc281d1432 100644 Binary files a/icons/_nanomaps/tether_nanomap_z1.png and b/icons/_nanomaps/tether_nanomap_z1.png differ diff --git a/icons/_nanomaps/tether_nanomap_z2.png b/icons/_nanomaps/tether_nanomap_z2.png index 53492f77ee..5f1eacdb19 100644 Binary files a/icons/_nanomaps/tether_nanomap_z2.png and b/icons/_nanomaps/tether_nanomap_z2.png differ diff --git a/icons/_nanomaps/tether_nanomap_z3.png b/icons/_nanomaps/tether_nanomap_z3.png index 45438a40d9..09b99241f4 100644 Binary files a/icons/_nanomaps/tether_nanomap_z3.png and b/icons/_nanomaps/tether_nanomap_z3.png differ diff --git a/icons/_nanomaps/tether_nanomap_z4.png b/icons/_nanomaps/tether_nanomap_z4.png index 510d22b3d6..c2623219ee 100644 Binary files a/icons/_nanomaps/tether_nanomap_z4.png and b/icons/_nanomaps/tether_nanomap_z4.png differ diff --git a/icons/inventory/accessory/item.dmi b/icons/inventory/accessory/item.dmi index 568c866874..e758fe7d4d 100644 Binary files a/icons/inventory/accessory/item.dmi and b/icons/inventory/accessory/item.dmi differ diff --git a/icons/inventory/accessory/mob.dmi b/icons/inventory/accessory/mob.dmi index b5bb6eff55..298166f8bc 100644 Binary files a/icons/inventory/accessory/mob.dmi and b/icons/inventory/accessory/mob.dmi differ diff --git a/icons/inventory/accessory/mob_teshari.dmi b/icons/inventory/accessory/mob_teshari.dmi index 467d0ffa35..820e5b5f6d 100644 Binary files a/icons/inventory/accessory/mob_teshari.dmi and b/icons/inventory/accessory/mob_teshari.dmi differ diff --git a/icons/inventory/belt/item.dmi b/icons/inventory/belt/item.dmi index bde59b458b..8e08d8ea0e 100644 Binary files a/icons/inventory/belt/item.dmi and b/icons/inventory/belt/item.dmi differ diff --git a/icons/inventory/belt/item_vr.dmi b/icons/inventory/belt/item_vr.dmi index 679a4779fe..352f5e547b 100644 Binary files a/icons/inventory/belt/item_vr.dmi and b/icons/inventory/belt/item_vr.dmi differ diff --git a/icons/inventory/belt/mob.dmi b/icons/inventory/belt/mob.dmi index ccf3ffd5c9..f766fbc2d9 100644 Binary files a/icons/inventory/belt/mob.dmi and b/icons/inventory/belt/mob.dmi differ diff --git a/icons/inventory/belt/mob_vr.dmi b/icons/inventory/belt/mob_vr.dmi index 715a8855fb..e8770be8ee 100644 Binary files a/icons/inventory/belt/mob_vr.dmi and b/icons/inventory/belt/mob_vr.dmi differ diff --git a/icons/inventory/head/item.dmi b/icons/inventory/head/item.dmi index 47d3e4ef83..94e7e1b8f3 100644 Binary files a/icons/inventory/head/item.dmi and b/icons/inventory/head/item.dmi differ diff --git a/icons/inventory/head/mob.dmi b/icons/inventory/head/mob.dmi index 68d6262d98..7ee58a394a 100644 Binary files a/icons/inventory/head/mob.dmi and b/icons/inventory/head/mob.dmi differ diff --git a/icons/inventory/head/mob_tajaran.dmi b/icons/inventory/head/mob_tajaran.dmi index ff0332205c..b14ad2edd4 100644 Binary files a/icons/inventory/head/mob_tajaran.dmi and b/icons/inventory/head/mob_tajaran.dmi differ diff --git a/icons/inventory/head/mob_unathi.dmi b/icons/inventory/head/mob_unathi.dmi index 2030158624..8b1383dd98 100644 Binary files a/icons/inventory/head/mob_unathi.dmi and b/icons/inventory/head/mob_unathi.dmi differ diff --git a/icons/inventory/uniform/item.dmi b/icons/inventory/uniform/item.dmi index 0cc9ef154a..8c2c064012 100644 Binary files a/icons/inventory/uniform/item.dmi and b/icons/inventory/uniform/item.dmi differ diff --git a/icons/inventory/uniform/mob.dmi b/icons/inventory/uniform/mob.dmi index 5d36de239b..5d096791cc 100644 Binary files a/icons/inventory/uniform/mob.dmi and b/icons/inventory/uniform/mob.dmi differ diff --git a/icons/mob/human_races/markings_vr.dmi b/icons/mob/human_races/markings_vr.dmi index 755050fe4a..67f87812fe 100644 Binary files a/icons/mob/human_races/markings_vr.dmi and b/icons/mob/human_races/markings_vr.dmi differ diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index 31b4d11d36..43e821ddc4 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/lefthand_hats.dmi b/icons/mob/items/lefthand_hats.dmi index c564675447..d90e381dbe 100644 Binary files a/icons/mob/items/lefthand_hats.dmi and b/icons/mob/items/lefthand_hats.dmi differ diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi index 015ed8d24c..17dcfd7135 100644 Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ diff --git a/icons/mob/items/righthand_hats.dmi b/icons/mob/items/righthand_hats.dmi index aaaa0d80d9..6923eb9cce 100644 Binary files a/icons/mob/items/righthand_hats.dmi and b/icons/mob/items/righthand_hats.dmi differ diff --git a/icons/mob/light_overlays.dmi b/icons/mob/light_overlays.dmi index 2a0f5b153c..3a185e2a65 100644 Binary files a/icons/mob/light_overlays.dmi and b/icons/mob/light_overlays.dmi differ diff --git a/icons/mob/screen_full_colorized_vore.dmi b/icons/mob/screen_full_colorized_vore.dmi index 5926d216f6..b98efc9fc3 100644 Binary files a/icons/mob/screen_full_colorized_vore.dmi and b/icons/mob/screen_full_colorized_vore.dmi differ diff --git a/icons/mob/screen_full_colorized_vore_overlays.dmi b/icons/mob/screen_full_colorized_vore_overlays.dmi new file mode 100644 index 0000000000..d9678c3ff2 Binary files /dev/null and b/icons/mob/screen_full_colorized_vore_overlays.dmi differ diff --git a/icons/mob/screen_full_vore.dmi b/icons/mob/screen_full_vore.dmi index a89c272c84..cdce06618f 100644 Binary files a/icons/mob/screen_full_vore.dmi and b/icons/mob/screen_full_vore.dmi differ diff --git a/icons/mob/vore/ears_vr.dmi b/icons/mob/vore/ears_vr.dmi index a9a4980b58..bd621ffe2d 100644 Binary files a/icons/mob/vore/ears_vr.dmi and b/icons/mob/vore/ears_vr.dmi differ diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi index a842bfd6ce..456f7949b1 100644 Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi index 99c6e7debe..a1fba53c9d 100644 Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi index db935ef7d4..e5ffc375a3 100644 Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi index da355f3e97..3237f3ce07 100644 Binary files a/icons/obj/cigarettes.dmi and b/icons/obj/cigarettes.dmi differ diff --git a/icons/obj/closets/bases/crate.dmi b/icons/obj/closets/bases/crate.dmi index d83ac8da7b..0a4de75174 100644 Binary files a/icons/obj/closets/bases/crate.dmi and b/icons/obj/closets/bases/crate.dmi differ diff --git a/icons/obj/closets/decals/crate.dmi b/icons/obj/closets/decals/crate.dmi index 1fce07d882..a1e76faf32 100644 Binary files a/icons/obj/closets/decals/crate.dmi and b/icons/obj/closets/decals/crate.dmi differ diff --git a/icons/obj/light_overlays.dmi b/icons/obj/light_overlays.dmi index 470631d104..f9f01aba80 100644 Binary files a/icons/obj/light_overlays.dmi and b/icons/obj/light_overlays.dmi differ diff --git a/icons/obj/lighters.dmi b/icons/obj/lighters.dmi new file mode 100644 index 0000000000..8356af7b48 Binary files /dev/null and b/icons/obj/lighters.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index ebb5d33a61..0072af1bbd 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/power_cells.dmi b/icons/obj/power_cells.dmi index 96fa666da2..a9e0d6d816 100644 Binary files a/icons/obj/power_cells.dmi and b/icons/obj/power_cells.dmi differ diff --git a/icons/obj/robot_storage.dmi b/icons/obj/robot_storage.dmi index 24e0aa73a3..a515f76d2f 100644 Binary files a/icons/obj/robot_storage.dmi and b/icons/obj/robot_storage.dmi differ diff --git a/icons/obj/robotics_vr.dmi b/icons/obj/robotics_vr.dmi index 5334cf84cd..667fe231a2 100644 Binary files a/icons/obj/robotics_vr.dmi and b/icons/obj/robotics_vr.dmi differ diff --git a/icons/obj/suit_cooler.dmi b/icons/obj/suit_cooler.dmi new file mode 100644 index 0000000000..92f97ef8a6 Binary files /dev/null and b/icons/obj/suit_cooler.dmi differ diff --git a/icons/obj/suit_cycler.dmi b/icons/obj/suit_cycler.dmi new file mode 100644 index 0000000000..5bc9542484 Binary files /dev/null and b/icons/obj/suit_cycler.dmi differ diff --git a/icons/obj/suit_storage.dmi b/icons/obj/suit_storage.dmi new file mode 100644 index 0000000000..5c39c1364e Binary files /dev/null and b/icons/obj/suit_storage.dmi differ diff --git a/icons/obj/suitstorage.dmi b/icons/obj/suitstorage.dmi deleted file mode 100644 index a2f499f9fc..0000000000 Binary files a/icons/obj/suitstorage.dmi and /dev/null differ diff --git a/icons/obj/surgery_vr.dmi b/icons/obj/surgery_vr.dmi index 6b6b4dbbb8..1e3d7677db 100644 Binary files a/icons/obj/surgery_vr.dmi and b/icons/obj/surgery_vr.dmi differ diff --git a/icons/obj/vending.dmi b/icons/obj/vending.dmi index 44e4c618b3..f83ad770bd 100755 Binary files a/icons/obj/vending.dmi and b/icons/obj/vending.dmi differ diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi index 21ba4dd9a8..d54a4e1e41 100644 Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ diff --git a/icons/obj/zippo.dmi b/icons/obj/zippo.dmi deleted file mode 100644 index 17288a981a..0000000000 Binary files a/icons/obj/zippo.dmi and /dev/null differ diff --git a/icons/vore/custom_clothes_vr.dmi b/icons/vore/custom_clothes_vr.dmi index 545515dbb2..c7f14b8128 100644 Binary files a/icons/vore/custom_clothes_vr.dmi and b/icons/vore/custom_clothes_vr.dmi differ diff --git a/maps/atoll/atoll_objs.dm b/maps/atoll/atoll_objs.dm index 32ab2c07f9..3f04c540d3 100644 --- a/maps/atoll/atoll_objs.dm +++ b/maps/atoll/atoll_objs.dm @@ -255,7 +255,7 @@ name = "Falls Monolith - The Song" desc = "Her song cannot end. If her song ends, then we end. We cannot outlive a missing song. We cannot \ live with the mourning of our fell makers. We will die. But the life on this wanderstar will go on. \ - Who will it live for then? We primaries are the only ones with the lorehalldeals to acknowledge it's beauty." + Who will it live for then? We primaries are the only ones with the mindset to acknowledge it's beauty." value = CATALOGUER_REWARD_TRIVIAL /datum/category_item/catalogue/anomalous/mono5 diff --git a/maps/atoll/atoll_turfs.dm b/maps/atoll/atoll_turfs.dm index 26bdc3419f..c7aa914aa7 100644 --- a/maps/atoll/atoll_turfs.dm +++ b/maps/atoll/atoll_turfs.dm @@ -26,7 +26,7 @@ /turf/simulated/floor/water/atoll name = "shallow water" - desc = "This water looks pretty shallow and calm. You'd almost feel bad for hopping in and disturbing it's serene flatness." + desc = "This water looks pretty shallow and calm. You'd almost feel bad for hopping in and disturbing its serene flatness." icon = 'maps/atoll/icons/turfs/water.dmi' icon_state = "shallow" under_state = "shallow" diff --git a/maps/atoll/falls.dmm b/maps/atoll/falls.dmm index 81d4a63efd..12ffc41bc6 100644 --- a/maps/atoll/falls.dmm +++ b/maps/atoll/falls.dmm @@ -6,6 +6,7 @@ "aD" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang,/obj/structure/flora/tree/atoll/mangrove{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "aE" = (/obj/structure/canopy_corner{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "aJ" = (/obj/effect/floor_decal/atoll/border{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"aM" = (/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/border/invert{dir = 4},/obj/effect/floor_decal/atoll/border/invert{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "aN" = (/obj/structure/flora/tree/atoll/mangrove,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "aO" = (/obj/structure/canopy/edge/north,/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "aP" = (/obj/effect/floor_decal/atoll/bronze{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -33,7 +34,7 @@ "cz" = (/obj/structure/canopy,/obj/structure/aqueduct/corner{dir = 9},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "cA" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang,/obj/effect/decal/shadow/silhouette/support,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "cE" = (/obj/structure/waterfall,/obj/structure/canopy/edge,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) -"cG" = (/obj/structure/bed/chair/sofa/bench/marble{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"cG" = (/obj/structure/bed/chair/sofa/bench/marble{dir = 8},/obj/effect/floor_decal/atoll/border{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "cH" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "cS" = (/obj/structure/aqueduct/pillar,/obj/structure/canopy,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "cU" = (/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/obj/effect/floor_decal/atoll/bronze{dir = 9},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -60,11 +61,13 @@ "ev" = (/obj/machinery/gateway{dir = 8},/obj/effect/floor_decal/atoll/border/invert{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "ey" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "eA" = (/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/obj/effect/floor_decal/atoll/bronze{dir = 10},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"eC" = (/obj/effect/blocker,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "eG" = (/obj/structure/waterfall,/obj/structure/railing/overhang/waterless,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "eJ" = (/obj/effect/floor_decal/atoll/border{dir = 4},/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "eN" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "eX" = (/obj/structure/canopy/edge/south,/obj/structure/aqueduct{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "fj" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"fq" = (/obj/effect/floor_decal/atoll/bronze{dir = 5},/obj/structure/bed/chair/sofa/bench/marble,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "fu" = (/obj/structure/waterfall,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/waterfall/mist,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "fG" = (/obj/structure/railing/overhang,/obj/effect/decal/shadow/silhouette/support,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "fH" = (/obj/effect/floor_decal/atoll/power,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -75,6 +78,7 @@ "go" = (/obj/structure/canopy,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "gs" = (/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "gv" = (/obj/structure/canopy,/obj/effect/blocker,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"gw" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/obj/effect/decal/shadow/silhouette,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "gx" = (/obj/structure/canopy/edge,/obj/effect/decal/godray{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "gy" = (/obj/effect/floor_decal/atoll/border{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "gz" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 40; teleport_y = 50},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -96,7 +100,7 @@ "hz" = (/obj/structure/canopy,/obj/effect/decal/godray{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "hI" = (/obj/structure/canopy,/obj/structure/railing/overhang/waterless,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "hQ" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/border/invert{dir = 1},/obj/effect/floor_decal/atoll/border/invert{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) -"hV" = (/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"hV" = (/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/floor_decal/atoll/bronze{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "hW" = (/obj/structure/canopy/edge/south,/obj/structure/canopy/edge/north,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "hX" = (/obj/structure/flora/tree/atoll/mangrove{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "ic" = (/obj/structure/waterfall,/obj/effect/blocker,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -107,7 +111,9 @@ "il" = (/obj/structure/canopy/edge/north,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/effect/decal/shadow/silhouette/pillar{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "ir" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "it" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang,/obj/effect/decal/shadow/silhouette/pillar{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"iy" = (/obj/structure/aqueduct,/obj/structure/canopy_corner{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "iz" = (/obj/effect/floor_decal/atoll/border/invert{dir = 8},/obj/structure/aqueduct{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"iF" = (/obj/effect/blocker,/obj/effect/decal/shadow,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "iJ" = (/obj/structure/canopy,/obj/structure/aqueduct/pillar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "iN" = (/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "iS" = (/obj/effect/decal/shadow,/obj/effect/floor_decal/atoll/stairs,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -117,15 +123,18 @@ "jx" = (/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "jD" = (/obj/effect/floor_decal/atoll/border{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "jE" = (/obj/effect/decal/godray{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"jF" = (/obj/structure/aqueduct{dir = 1},/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "jK" = (/obj/structure/waterfall,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "jM" = (/obj/effect/decal/shadow/floor,/obj/structure/waterfall,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "jO" = (/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "jP" = (/obj/structure/canopy/edge/south,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) -"jW" = (/obj/structure/canopy/edge/south,/obj/vehicle/boat{icon_state = "boat"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"jT" = (/obj/structure/canopy/edge/north,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"jW" = (/obj/structure/canopy/edge/south,/obj/vehicle/boat{icon_state = "boat"; dir = 8},/obj/item/weapon/oar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "jX" = (/obj/structure/railing/overhang/waterless,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "jZ" = (/obj/structure/canopy/edge/north,/obj/structure/temple,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "ka" = (/obj/structure/waterfall,/obj/structure/canopy_corner,/obj/effect/blocker,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "kh" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/border{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"km" = (/obj/effect/blocker,/obj/structure/canopy,/obj/structure/railing/overhang/waterless,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "ko" = (/obj/effect/blocker,/obj/structure/canopy_corner{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "kO" = (/obj/effect/floor_decal/atoll/border/invert{dir = 4},/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/border/invert{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "kQ" = (/obj/structure/canopy/edge/north,/obj/effect/decal/godray{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -134,6 +143,8 @@ "ld" = (/obj/structure/canopy/edge/north,/obj/effect/decal/godray,/turf/simulated/floor/water/atoll/sunk,/area/gateway/atoll/falls) "lh" = (/obj/effect/floor_decal/atoll/border{dir = 4},/obj/structure/aqueduct,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "ll" = (/obj/structure/railing/overhang/waterless,/obj/structure/flora/tree/atoll/mangrove{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"lq" = (/obj/effect/floor_decal/atoll/bronze{dir = 9},/obj/structure/bed/chair/sofa/bench/marble,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"lu" = (/obj/structure/canopy/edge/north,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "lv" = (/obj/effect/blocker,/obj/structure/canopy,/obj/structure/aqueduct{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "lH" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/border{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "lI" = (/obj/structure/canopy/edge/north,/obj/effect/decal/godray,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -147,6 +158,7 @@ "lX" = (/obj/structure/waterfall/top,/obj/structure/canopy/edge,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "mh" = (/obj/effect/decal/shadow/silhouette/support,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "mo" = (/obj/structure/canopy/edge,/obj/effect/decal/godray,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"ms" = (/obj/effect/blocker,/obj/effect/floor_decal/atoll/bronze{dir = 9},/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "mv" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "mC" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/obj/structure/canopy/edge/right,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "mL" = (/obj/effect/blocker,/obj/structure/canopy/edge/north,/obj/structure/flora/tree/atoll/mangrove{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -166,6 +178,7 @@ "nX" = (/obj/structure/canopy,/obj/structure/aqueduct,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "nY" = (/obj/structure/canopy/edge/north,/obj/effect/decal/godray{dir = 8},/obj/structure/bed/chair/sofa/bench/marble{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "ob" = (/obj/structure/monolith/fifth,/obj/effect/decal/godray,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"of" = (/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/border/invert{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "oi" = (/obj/structure/railing/overhang/waterless/under{dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "or" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 44; teleport_y = 50},/obj/effect/floor_decal/atoll/border{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "ov" = (/obj/effect/decal/shadow/silhouette,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -175,7 +188,8 @@ "oF" = (/obj/effect/floor_decal/atoll/border{dir = 5},/obj/structure/bed/chair/sofa/bench/marble,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "oK" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "oR" = (/obj/effect/floor_decal/atoll/border/invert{dir = 1},/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) -"oV" = (/obj/effect/floor_decal/atoll/bronze{dir = 6},/obj/effect/floor_decal/atoll/border/invert{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"oV" = (/obj/effect/floor_decal/atoll/border/invert{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 6},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"oW" = (/obj/effect/floor_decal/atoll/bronze{dir = 10},/obj/effect/floor_decal/atoll/border/invert{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "pb" = (/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/structure/bed/chair/sofa/bench/marble{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "pj" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/obj/effect/decal/shadow,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "pl" = (/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -184,6 +198,7 @@ "pA" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 15; teleport_y = 116},/obj/effect/floor_decal/atoll/border{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "pV" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/canopy_corner{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "pX" = (/obj/effect/decal/shadow/silhouette,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"qa" = (/obj/structure/aqueduct{dir = 1},/obj/structure/canopy_corner{dir = 1},/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "qb" = (/obj/structure/monolith/fourth,/obj/effect/decal/godray,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "qk" = (/obj/effect/floor_decal/atoll/border{dir = 6},/obj/structure/aqueduct{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "ql" = (/obj/structure/canopy/edge,/turf/simulated/floor/water/atoll/sunk,/area/gateway/atoll/falls) @@ -195,8 +210,9 @@ "qK" = (/obj/effect/floor_decal/atoll/border{dir = 6},/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/step_trigger/teleporter/atoll{teleport_x = 32; teleport_y = 117},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "qS" = (/obj/structure/aqueduct/pillar{dir = 4},/obj/structure/canopy_corner{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "qW" = (/obj/structure/canopy_corner,/obj/structure/flora/tree/atoll/mangrove,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) -"qY" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"qY" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "rb" = (/obj/structure/canopy,/obj/effect/decal/godray{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"rc" = (/obj/structure/aqueduct,/obj/structure/aqueduct/pillar{dir = 1},/obj/effect/decal/shadow/silhouette,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "rg" = (/obj/effect/decal/shadow/floor,/obj/effect/decal/shadow/silhouette,/obj/structure/waterfall,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "ri" = (/obj/structure/canopy,/obj/effect/decal/godray{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "rj" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/effect/decal/shadow/silhouette/pillar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -204,6 +220,7 @@ "rs" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "ru" = (/obj/effect/blocker,/obj/structure/canopy,/obj/structure/temple,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "ry" = (/obj/structure/canopy/edge/south,/obj/structure/railing/overhang,/obj/effect/decal/godray{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"rB" = (/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/border/invert{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "rE" = (/obj/structure/waterfall,/obj/structure/waterfall/mist,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "rH" = (/obj/effect/decal/shadow/silhouette,/obj/structure/railing/overhang/waterless,/obj/structure/flora/tree/atoll/mangrove{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "rK" = (/obj/effect/floor_decal/atoll{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -213,28 +230,36 @@ "so" = (/obj/structure/railing/overhang/waterless,/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "sr" = (/obj/effect/decal/godray{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "sE" = (/obj/effect/decal/shadow/floor,/turf/simulated/floor/water/atoll/sunk,/area/gateway/atoll/falls) +"sH" = (/obj/vehicle/boat{icon_state = "boat"; dir = 4},/obj/item/weapon/oar,/turf/simulated/floor/water/atoll/sunk,/area/gateway/atoll/falls) "sI" = (/obj/structure/aqueduct,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "sN" = (/obj/structure/waterfall,/obj/structure/railing/overhang/waterless,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "sU" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang,/obj/effect/decal/shadow/silhouette/pillar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"sV" = (/obj/structure/canopy,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "sX" = (/obj/structure/aqueduct,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "sY" = (/obj/structure/waterfall/top,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "sZ" = (/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "tf" = (/obj/structure/canopy_corner{dir = 1},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"tl" = (/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/border{dir = 5},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "to" = (/obj/structure/canopy/edge/south,/obj/structure/aqueduct/pillar{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "tr" = (/obj/structure/waterfall/mist,/obj/structure/waterfall,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "tt" = (/obj/effect/floor_decal/atoll/bronze{dir = 10},/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "tu" = (/obj/effect/decal/shadow/floor,/obj/structure/waterfall,/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/floor_decal/atoll/bronze{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"tz" = (/obj/structure/aqueduct{dir = 1},/obj/structure/canopy_corner,/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "tB" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/bronze{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "tD" = (/obj/effect/decal/shadow/silhouette/pillar,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"tJ" = (/obj/structure/canopy_corner{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "tM" = (/obj/structure/canopy/edge/right,/obj/structure/canopy/edge,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "tP" = (/obj/structure/canopy/edge/north,/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"tS" = (/obj/structure/canopy/edge/right,/obj/effect/decal/shadow/silhouette,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "tT" = (/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"tV" = (/obj/structure/aqueduct,/obj/effect/decal/shadow/silhouette,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "tX" = (/turf/simulated/floor/water/atoll/sunk,/area/gateway/atoll/falls) "tY" = (/obj/effect/floor_decal/atoll,/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "ub" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "ud" = (/obj/structure/canopy_corner{dir = 4},/obj/structure/aqueduct,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "ug" = (/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "ui" = (/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/floor_decal/atoll/border{dir = 1},/obj/effect/landmark,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"uj" = (/obj/effect/blocker,/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "uo" = (/obj/structure/waterfall,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "uv" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/effect/decal/shadow/silhouette/pillar{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "uA" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll/sunk,/area/gateway/atoll/falls) @@ -246,9 +271,11 @@ "vl" = (/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/floor_decal/atoll/bronze{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "vm" = (/obj/effect/floor_decal/atoll/border/invert{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "vn" = (/obj/effect/floor_decal/atoll/border/invert{dir = 1},/obj/effect/floor_decal/atoll/border{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"vp" = (/obj/effect/blocker,/obj/structure/aqueduct,/obj/structure/canopy,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "vy" = (/obj/structure/waterfall/top,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "vI" = (/obj/structure/waterfall/top,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/obj/structure/canopy/edge,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "vK" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) +"vM" = (/obj/structure/aqueduct/pillar{dir = 4},/obj/structure/canopy,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "vQ" = (/obj/structure/canopy,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "vT" = (/obj/effect/decal/shadow/silhouette,/obj/structure/canopy/edge/right,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "vW" = (/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/floor_decal/atoll/border/invert{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -286,12 +313,14 @@ "yz" = (/obj/structure/waterfall/top,/obj/structure/aqueduct{dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "yD" = (/obj/structure/waterfall,/obj/structure/waterfall/mist,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "yE" = (/obj/effect/floor_decal/atoll/border/invert{dir = 1},/obj/effect/floor_decal/atoll/border/invert{dir = 8},/obj/effect/landmark,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"yF" = (/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/obj/effect/floor_decal/atoll/border{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "yI" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/border{dir = 9},/obj/effect/step_trigger/teleporter/atoll{teleport_x = 17; teleport_y = 124},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "yJ" = (/obj/effect/floor_decal/atoll/border{dir = 8},/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "yM" = (/obj/structure/canopy,/obj/effect/blocker,/obj/structure/aqueduct{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "yW" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 73; teleport_y = 50},/obj/effect/floor_decal/atoll/border{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "zb" = (/obj/structure/waterfall/top,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "zc" = (/obj/machinery/gateway{dir = 5},/obj/effect/floor_decal/atoll/border{dir = 5},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"zd" = (/obj/effect/floor_decal/atoll/bronze{dir = 10},/obj/effect/floor_decal/atoll/bronze{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "zh" = (/obj/structure/canopy/edge,/obj/structure/canopy/edge/right,/obj/structure/aqueduct{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "zk" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "zt" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -301,6 +330,7 @@ "zE" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/aqueduct,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "zN" = (/obj/structure/aqueduct/pillar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "zO" = (/obj/structure/aqueduct/pillar,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"zR" = (/obj/effect/floor_decal/atoll/border/invert{dir = 1},/obj/effect/floor_decal/atoll/border/invert{dir = 8},/obj/effect/floor_decal/atoll/border/invert{dir = 4},/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "zU" = (/obj/effect/blocker,/obj/structure/canopy/edge/north,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "zY" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Ae" = (/obj/effect/floor_decal/atoll/border,/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/bronze{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -322,10 +352,11 @@ "Bh" = (/obj/structure/railing/overhang,/obj/structure/flora/tree/atoll/mangrove,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Bo" = (/obj/structure/canopy/edge/south,/obj/effect/decal/godray{dir = 1},/turf/simulated/floor/water/atoll/sunk,/area/gateway/atoll/falls) "Bq" = (/obj/structure/waterfall,/obj/structure/canopy/edge,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) +"BA" = (/obj/structure/aqueduct,/obj/structure/canopy,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "BB" = (/obj/effect/floor_decal/atoll/stairs,/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "BF" = (/obj/effect/floor_decal/atoll/border,/obj/effect/floor_decal/atoll/border/invert{dir = 8},/obj/effect/floor_decal/atoll/border/invert,/obj/effect/landmark,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "BH" = (/obj/structure/canopy,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) -"BL" = (/obj/structure/bed/chair/sofa/bench/marble,/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"BL" = (/obj/structure/bed/chair/sofa/bench/marble,/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Cb" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/bronze{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Cd" = (/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/border/invert{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Ce" = (/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/floor_decal/atoll/bronze{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -335,6 +366,7 @@ "Cr" = (/obj/structure/railing/overhang/waterless/under{dir = 1},/obj/structure/railing/overhang/waterless/under{dir = 4},/obj/structure/waterfall,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "Cs" = (/obj/structure/railing/overhang/waterless/under{dir = 1},/obj/structure/waterfall,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "Cw" = (/obj/effect/landmark,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"Cz" = (/obj/structure/aqueduct,/obj/structure/aqueduct/pillar{dir = 1},/obj/structure/canopy,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "CH" = (/obj/effect/floor_decal/atoll/bronze{dir = 10},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "CL" = (/obj/structure/canopy_corner,/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "CM" = (/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) @@ -346,6 +378,7 @@ "Dl" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Do" = (/obj/effect/floor_decal/atoll/border/invert{dir = 1},/obj/effect/floor_decal/atoll/border{dir = 6},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Dp" = (/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/obj/structure/canopy,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"Dq" = (/obj/effect/floor_decal/atoll/border/invert{dir = 4},/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/border/invert{dir = 8},/obj/effect/floor_decal/atoll/border/invert{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Du" = (/obj/effect/floor_decal/atoll/border,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Dw" = (/obj/structure/canopy_corner,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Dy" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 12; teleport_y = 50},/obj/effect/floor_decal/atoll/border{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -354,12 +387,13 @@ "DI" = (/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/structure/bed/chair/sofa/bench/marble{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "DJ" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/border{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "DM" = (/obj/structure/lightpost/atoll,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"DO" = (/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/border/invert{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "DV" = (/obj/structure/railing/overhang/waterless/under{dir = 1},/obj/structure/railing/overhang/waterless/under{dir = 8},/obj/structure/waterfall,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "Eb" = (/obj/effect/blocker,/obj/structure/canopy/edge,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Ej" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/obj/structure/canopy/edge/north,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Em" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Ep" = (/obj/structure/canopy_corner{dir = 1},/obj/structure/flora/tree/atoll/mangrove,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) -"Eq" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/vehicle/boat{icon_state = "boat"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"Eq" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/vehicle/boat{icon_state = "boat"; dir = 8},/obj/item/weapon/oar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Er" = (/obj/structure/bed/chair/sofa/bench/marble,/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/effect/floor_decal/atoll/bronze{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Et" = (/obj/structure/railing/overhang,/obj/structure/flora/tree/atoll/mangrove{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Ev" = (/obj/effect/floor_decal/atoll/border{dir = 8},/obj/structure/aqueduct,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -372,6 +406,7 @@ "EW" = (/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/bronze,/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "EY" = (/obj/effect/blocker,/obj/structure/canopy,/obj/structure/aqueduct,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Fb" = (/obj/structure/canopy/edge/north,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"Ff" = (/obj/vehicle/boat{icon_state = "boat"; dir = 8},/obj/item/weapon/oar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Fg" = (/obj/effect/floor_decal/atoll{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Fr" = (/obj/structure/canopy,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Fw" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/effect/decal/shadow/silhouette/pillar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -399,6 +434,7 @@ "GG" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/aqueduct,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "GL" = (/obj/effect/floor_decal/atoll,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "GO" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) +"GP" = (/obj/structure/canopy,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Ha" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/flora/tree/atoll/mangrove{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Hb" = (/obj/structure/canopy_corner{dir = 4},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Hi" = (/obj/structure/waterfall,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) @@ -440,6 +476,7 @@ "Kx" = (/obj/structure/canopy/edge/south,/obj/structure/aqueduct{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "KD" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 71; teleport_y = 82},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "KG" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar{dir = 1},/obj/effect/decal/godray{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"KL" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar{dir = 4},/obj/structure/canopy_corner{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "KM" = (/obj/structure/temple,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "KN" = (/obj/structure/monolith/first,/obj/effect/decal/godray,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "KT" = (/obj/effect/blocker,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/waterfall,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -447,6 +484,7 @@ "KZ" = (/obj/structure/aqueduct{dir = 8},/obj/structure/canopy/edge,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Lb" = (/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/obj/effect/blocker,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "Lc" = (/obj/structure/waterfall,/obj/effect/decal/shadow/floor,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"Lg" = (/obj/effect/floor_decal/atoll/bronze{dir = 6},/obj/effect/floor_decal/atoll/bronze{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Lj" = (/obj/structure/canopy,/obj/structure/aqueduct{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Lr" = (/obj/structure/canopy/edge/south,/obj/structure/canopy_corner{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Ls" = (/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -472,7 +510,9 @@ "My" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "MD" = (/obj/effect/decal/godray{dir = 4},/turf/simulated/floor/water/atoll/sunk,/area/gateway/atoll/falls) "MM" = (/obj/effect/floor_decal/atoll/border{dir = 5},/obj/effect/floor_decal/atoll/bronze{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"MR" = (/obj/effect/blocker,/obj/structure/canopy_corner,/obj/effect/decal/shadow/silhouette,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Nf" = (/obj/effect/decal/shadow,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/obj/structure/railing/overhang/waterless,/obj/effect/decal/godray{dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) +"Nh" = (/obj/effect/blocker,/obj/effect/floor_decal/atoll/bronze{dir = 10},/obj/effect/floor_decal/atoll/border/invert{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Nn" = (/obj/effect/floor_decal/atoll/stairs,/obj/effect/decal/shadow,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "No" = (/obj/effect/decal/shadow/silhouette,/obj/structure/canopy,/obj/structure/railing/overhang/waterless,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Ns" = (/obj/structure/canopy/edge/north,/obj/structure/canopy/edge/south,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -492,6 +532,7 @@ "OH" = (/obj/structure/canopy_corner{dir = 4},/obj/structure/aqueduct{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "OI" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Pd" = (/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"Pe" = (/obj/structure/canopy_corner,/obj/structure/railing/overhang/waterless,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Pk" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 100; teleport_y = 50},/obj/effect/floor_decal/atoll/border/invert{dir = 4},/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/border/invert{dir = 1},/obj/effect/floor_decal/atoll/border/invert{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Pm" = (/obj/effect/floor_decal/atoll/bronze{dir = 6},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Pn" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -520,14 +561,16 @@ "Rd" = (/obj/effect/decal/shadow,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/obj/structure/railing/overhang/waterless,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/obj/effect/blocker,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "Rf" = (/obj/structure/aqueduct/pillar{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Rg" = (/obj/effect/floor_decal/atoll/border/invert{dir = 4},/obj/effect/floor_decal/atoll/border/invert,/obj/effect/landmark,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"Rl" = (/obj/structure/aqueduct{dir = 1},/obj/structure/canopy/edge/right,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Rn" = (/obj/structure/canopy_corner{dir = 4},/obj/structure/aqueduct{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Rw" = (/obj/structure/waterfall/top,/obj/structure/aqueduct{dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "RE" = (/obj/effect/decal/shadow,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 1},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) -"RF" = (/obj/effect/floor_decal/atoll/border/invert{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"RF" = (/obj/effect/floor_decal/atoll/border/invert{dir = 8},/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "RG" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/effect/decal/godray{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "RR" = (/obj/effect/floor_decal/atoll/bronze{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "RS" = (/obj/structure/canopy_corner,/turf/simulated/floor/water/atoll/sunk,/area/gateway/atoll/falls) "RV" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/obj/effect/blocker,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"RW" = (/obj/structure/aqueduct/pillar{dir = 1},/obj/structure/canopy_corner{dir = 8},/obj/structure/aqueduct,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Si" = (/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/obj/structure/canopy/edge/north,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Sk" = (/obj/effect/floor_decal/atoll/border/invert,/obj/structure/aqueduct{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Sn" = (/obj/structure/canopy/edge/north,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -540,6 +583,7 @@ "SN" = (/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/border/invert{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "SO" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/obj/effect/decal/shadow/silhouette,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "SR" = (/obj/effect/floor_decal/atoll/border/invert{dir = 4},/obj/effect/floor_decal/atoll/border/invert{dir = 1},/obj/effect/decal/godray,/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"Tb" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/border{dir = 9},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Td" = (/obj/structure/waterfall,/obj/structure/waterfall/mist,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Tg" = (/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/obj/structure/flora/tree/atoll/mangrove{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Ti" = (/obj/structure/waterfall/top,/obj/structure/canopy/edge/south,/obj/structure/aqueduct{dir = 8},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) @@ -549,6 +593,7 @@ "TA" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "TD" = (/obj/structure/temple,/obj/structure/flora/tree/atoll/mangrove{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "TF" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/canopy/edge/north,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"TH" = (/obj/structure/aqueduct{dir = 1},/obj/structure/canopy,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "TI" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/border/invert{dir = 4},/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "TM" = (/obj/structure/waterfall,/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "TR" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 83; teleport_y = 50},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -565,28 +610,31 @@ "Vb" = (/obj/machinery/gateway,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Vc" = (/obj/effect/floor_decal/atoll/bronze{dir = 6},/obj/effect/floor_decal/atoll/border/invert{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Vd" = (/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/border{dir = 10},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) -"Ve" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/vehicle/boat{icon_state = "boat"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"Ve" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/vehicle/boat{icon_state = "boat"; dir = 4},/obj/item/weapon/oar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Vg" = (/obj/effect/blocker,/obj/structure/canopy/edge/south,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Vk" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll{dir = 8},/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"Vn" = (/obj/structure/aqueduct/pillar{dir = 4},/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Vp" = (/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/border{dir = 9},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Vs" = (/obj/effect/decal/shadow/silhouette,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Vx" = (/obj/effect/blocker,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "VM" = (/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "VQ" = (/obj/structure/canopy/edge,/obj/structure/canopy/edge/right,/obj/effect/decal/godray{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) -"VT" = (/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"VT" = (/obj/structure/railing/overhang,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "VZ" = (/obj/structure/canopy_corner{dir = 1},/obj/structure/aqueduct,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Wc" = (/obj/effect/decal/shadow/silhouette,/obj/structure/flora/tree/atoll/mangrove{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Wj" = (/obj/structure/canopy,/obj/structure/aqueduct{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Wk" = (/obj/structure/waterfall/top,/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) +"Wm" = (/obj/effect/blocker,/obj/structure/aqueduct{dir = 1},/obj/structure/canopy,/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Wp" = (/obj/effect/floor_decal/atoll/bronze{dir = 4},/obj/effect/floor_decal/atoll/bronze,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Ww" = (/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/border{dir = 1},/obj/effect/decal/godray{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "WA" = (/obj/effect/floor_decal/atoll{dir = 4},/obj/structure/bed/chair/sofa/bench/marble{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "WK" = (/obj/effect/floor_decal/atoll/stairs,/obj/effect/decal/shadow,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "WM" = (/obj/effect/decal/shadow/floor,/obj/effect/floor_decal/atoll/border{dir = 4},/obj/effect/floor_decal/atoll/bronze{dir = 1},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) -"WP" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/vehicle/boat{icon_state = "boat"; dir = 4},/obj/effect/decal/godray{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"WO" = (/obj/structure/canopy_corner{dir = 8},/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"WP" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/vehicle/boat{icon_state = "boat"; dir = 4},/obj/effect/decal/godray{dir = 1},/obj/item/weapon/oar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "WQ" = (/obj/structure/canopy_corner,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "WS" = (/obj/effect/floor_decal/atoll/border{dir = 6},/obj/structure/bed/chair/sofa/bench/marble{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) -"WV" = (/obj/vehicle/boat{icon_state = "boat"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"WV" = (/obj/vehicle/boat{icon_state = "boat"; dir = 4},/obj/item/weapon/oar,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "WW" = (/obj/effect/floor_decal/atoll/border{dir = 4},/obj/effect/floor_decal/atoll/border{dir = 8},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "WX" = (/obj/effect/floor_decal/atoll/bronze{dir = 8},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/bronze{dir = 1},/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Xa" = (/obj/effect/floor_decal/atoll/border{dir = 10},/obj/structure/bed/chair/sofa/bench/marble{dir = 4},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) @@ -603,14 +651,18 @@ "XR" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 14; teleport_y = 117},/obj/effect/floor_decal/atoll/border/invert{dir = 1},/obj/effect/floor_decal/atoll/bronze,/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "XX" = (/obj/structure/railing/overhang/waterless{icon_state = "wbronze_railing0"; dir = 4},/obj/structure/canopy/edge,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Ya" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/canopy/edge/north,/obj/effect/decal/shadow/silhouette/pillar{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"Yb" = (/obj/structure/canopy_corner{dir = 8},/obj/structure/railing/overhang/waterless,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Ym" = (/obj/effect/floor_decal/atoll/border/invert{dir = 8},/obj/effect/floor_decal/atoll/border{dir = 5},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Yn" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/effect/decal/shadow/silhouette/support,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Yv" = (/obj/effect/step_trigger/teleporter/atoll{teleport_x = 57; teleport_y = 50},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) "Yw" = (/obj/structure/waterfall,/obj/structure/aqueduct{dir = 4},/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) +"Yy" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/effect/decal/shadow/silhouette/pillar{dir = 4},/obj/structure/canopy/edge/right,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "YC" = (/obj/structure/waterfall,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) +"YE" = (/obj/effect/decal/shadow/silhouette/support,/obj/structure/canopy,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "YG" = (/obj/structure/flora/tree/atoll/mangrove{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "YH" = (/obj/structure/canopy/edge/north,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 4},/obj/effect/decal/shadow/silhouette/support,/obj/effect/decal/godray{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "YK" = (/obj/machinery/gateway{dir = 9},/obj/effect/floor_decal/atoll/border{dir = 9},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"YL" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/canopy_corner{dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Za" = (/obj/structure/waterfall,/obj/structure/waterfall/mist,/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Zb" = (/obj/structure/flora/tree/atoll/mangrove{dir = 4},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "Zf" = (/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 8},/obj/structure/railing/overhang{icon_state = "bronze_railing0"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) @@ -625,7 +677,8 @@ "ZM" = (/obj/effect/decal/shadow{icon_state = "wall_shadow"; dir = 1},/obj/structure/railing/overhang/waterless,/obj/effect/blocker,/turf/simulated/floor/atoll/vertical,/area/gateway/atoll/falls) "ZN" = (/obj/structure/aqueduct/pillar{dir = 4},/obj/structure/canopy_corner{dir = 8},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) "ZP" = (/obj/structure/waterfall,/obj/structure/aqueduct{dir = 8},/obj/structure/waterfall/mist,/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) -"ZQ" = (/obj/effect/floor_decal/atoll/bronze{dir = 10},/obj/effect/floor_decal/atoll/border/invert,/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"ZQ" = (/obj/effect/floor_decal/atoll/border/invert,/obj/effect/floor_decal/atoll/bronze{dir = 10},/turf/simulated/floor/atoll,/area/gateway/atoll/falls) +"ZX" = (/obj/structure/canopy_corner{dir = 1},/obj/effect/decal/shadow/silhouette{icon_state = "silhouette"; dir = 1},/turf/simulated/floor/water/atoll,/area/gateway/atoll/falls) (1,1,1) = {" FrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrLjhhFrFrWQqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnlaVMPnqnqnqnqn @@ -641,56 +694,56 @@ FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrLjhhFrFrFrFrFrBqHiHiHiHiHiHiHiHiHiGoHiHiHiHiHi FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrLjhhFrFrFrFrFrvcHiHiHiHiHiHiHiHiHiGoHiHiHiHiHiHiHiHiHiGoHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiGoZoqyhjVMVMVMGhhpsNGoHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiGoHiHiHiHiHiHiHiHiHiGoHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiGoHiHiHiHiHiHiHiHiKcGoHiHiHiHiHi WjWjWjWjWjWjNuWjWjWjWjWjWjWjWjWjWjFrFrFrFrFrFrFrFrcEjKjKjKjKjKjKjKjKGoHiHiHiHiHiHiHiHiHiGojKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKGOqyFgciGqGqGqFgcihpxsjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKGoHiHiHiHiHiHiHiHiHiGojKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKjKGoHiHiHiHiHiHiHiHiKcGojKjKjKjKjK nXnXnXnXnXnXEYnXGvnXnXnXGvnXnXnXGvczFrFrFrFrFrFrFrAhwrwrwrwrwrwrwrwrGoHiHiHiHiHiHiHiHiHiGowrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrGOaWGLxogditgdgSrKaJxstrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrGoHiHiHiHiHiHiHiHiHiGowrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrGoHiHiHiHiHiHiHiHiKcGowrwrwrwrwr -FrFrFrFrFrFrlPFriJFrFrFriJFrFrFriJFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiHiGoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGOaWWWPnlaKNPnHaWWaJxsqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiHiGoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiKcGoqnqnqnqnqn -FrFrFrFrFrFrlPFriJFrLTaEiJFrFrFrHshIhIFrFrFrFrFrFrzCtXtXqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiHiGoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGOaWFgaDgIsUgIPHciaJxsqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiHiGoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiKcGoqnqnqnqnqn -FrFrFrFrFrFrlPLTQoLrWQqntoaEFrBHXRWwkOaRFrFrFrFrFrzCjxjxqnqnqnqnqnqnUZHiHiHiHiHiHiHiHiHiUZqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnHDaWGLrKGqGqGqGLrKaJpjqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnUZHiHiHiHiHiHiHiHiHiUZqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnUZHiHiHiHiHiHiHiHiKcUZqnqnqnqnqn -FrFrFrFrFrFrlPzCmhFrFrWQFVhuFrBHSKLMHQaRFrFrFrFrLTqnqnqnqnqnqnqnqnqnCMjKjKjKjKjKjKjKjKjKCMqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnubaWiNjDjDjDjDjDvmaJnDqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnCMjKjKjKjKjKjKjKjKjKCMqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnCMjKjKjKjKjKjKjKjKicCMqnqnqnqnqn -FrFrFrFrFrFrlPWQhuFrFrFrFrFrFrBHHMAuvWaRFxLyaEFrzCqnqntXtXqnqnqnqnqnVswrwrwrwrwrwrwrwrwrVsqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnpXGfDbaAdGVMaAdGGfDbovqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnVswrwrwrwrwrwrwrwrwrVsqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnVswrwrwrwrwrwrwrwrGEVsqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrLTUrUrUraEBHpmtfFrzCqnqnjxsoqnqnqnqnqnjxqnqnqnqnqnqnqnqnqnjxqnqnqnqnqngIgIgIgIgIqnqnqnqnqnqnqnqnqnjxREREWKiSREiSWKREREjxqnqnqnqnqnqnqnqnqngIgIgIgIgIqnqnqnqnqnjxqnqnqnqnqnqnqnqnqnjxqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnjxqnqnqnqnqnqnqnqnozjxqnqnqnqnqn -FrFrFrFrFrFrlPFrFrhIhIFrFrFrFrzCGoGoGohuFrQmFrFrzCqnqngActMtqnqnqnqnqnqnTvqntXqnqnqnqnqnqnqnqnqnqnladjDuDuDuoFmvgIgIgIgIgIgIgIgIgICMCMBBxHCMxHBBCMCMgIgIgIgIgIgIgIgIgIPddjDuDuDuoFPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrBHFgciaRFrFrFrzCUZUZUZFrFrCMaEFrzCqnYGqnREqnqnZbqnqnqnlRfHEjjxqnqnqnqnqnqnqnqnqnqnlaaWZEQqIJGhDuhjRRvlvlvlvlErLDVMhchctBWMXqkhCbhchcVMRRErvlvlvlvlLDGhDuhjZEQqIJaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrBHGLrKaRFrFrFrWQCMCMCMaEFrbJhuFrzCqnTvTvVsqnTvTvTvTvhuFrUrFrzCqnqnqnqnqnqnqnqnqnqnlaaWCexIWpVMVMVMVMVMVMVMVMVMVMVMVMVMVMaJxzaWVMVMVMVMVMVMVMVMVMVMVMVMVMVMCeQeWpaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqntXqnqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrREREFrhIhIhIhINTNTbJhuFrUcFrLTqngAFgcismgAdRgsxvMjaRFrUZFrWQqnqnqntXqnqnqnqnqnqnlaaWCHJkPmiNjDvmtTJkJkJkJkJkaPVMVMVMVMGhDuhjVMVMVMVMtTeNeNeNeNeNaPiNjDvmCHJkPmaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnKMqnqnYGqnqnaNqnqnqnjxqnqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrLTCMCMBHyIESGDMMUQUcUcFrFrFrFrzCqngAGLrKMtgApARgyEgUaRFrCMFrFrzCqnqnjxqnqnqnqnqnqnlaGfvmVMiNDbZfPCPCPCPCPCPCPCPCPCwFCHVMVMVMVMVMPmnAPCPCPCPCPCPCPCPCPCOIGfvmVMiNDbPnqnqnqnqnqnqnqnqnqnqnqnqnhXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrWQOuagBHVdBauiqKaRhIFrFrFrFrFrzCqnqnREREqngAXadwvnWSxFFrNohIFrzCqnqnqnqnqnqnqnqnqngIVTaWVMaJZfqnqnqnqnqnqnqnqnqnqnqnPCwFVMVMVMnAPCqnqnqnqnqnqnqnqnqnqnqnOIaWVMaJqYgIqnqnqnqnZbqnqnqnqnKMqnqnqnqnqnqnqnqnqntXtXqnqnqnqnqntXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrUcUcFrREREREREBHfHaRFrFrFrLTqnqnqnVsFUllqnUrUrUrUrrbHbNCXuaRzCqnqnqnqnqnqnqnqntXVMGhhjVMGhPnqnqnqnqnqnqnRfqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnRfqnqnqnqnqnqnlahjVMGhhjVMtXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnjxjxqnqnqnqnqnjxqnqnKMqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrNTNTniagFrQmaEFrFxFrzCqnqnqnzkDIEWMtUZUZUZUZFrDwZIVcaRzCqnqnqnqnqntXtXtXEyCwVMVMVMVMPnqnqnqnqnqnqnzNqnqnqnqnqnqnsEVMVMPnqnqnqnqnqnzNqnqnqnqnqnqnlaVMVMVMVMVMVMtXtXtXtXtXtXtXtXtXtXtXqntXqnqntXqntXqnqnqnqnqnqnhXqnqnqntXqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrUcUcUcUcFrwfhuFxFxFrzCqnqnqnqnUrUrqwCMCMCMCMFrFrREREFrzCKMqnqnqnqntXtXtXsEVMVMVMVMVMPnqnqnqnqnqnqnzNqnqnqnqnqnqntXsEVMPnqnqnqnqnqnzNqnqnqnqnqnqnlaVMVMVMVMVMsEtXjxtXtXtXtXtXtXtXtXjxqnjxtXqnjxqnjxtXqnqnqnqnqnqnqnqnqnjxqnqntXqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrLTjxFrFxFxLTqnqnaNqnqnUZUZFrnbniWcagFrFrCMCMFrzCqnqnqntXqnjxjxjxjxPCOIvmVMiNPnqnqnqnqnqnqnKuqnqnqnqnqnlaVMtXsEqnqnqnqnqnqnKuqnqnqnqnqnqnlavmVMiNZfPCjxjxhXjxjxjxjxjxjxjxjxqnqnqnjxqnqnqnZbjxqnqnqnqnqnqnqnqnqnqnqnqnjxqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrWQhuFrFrLTqnqnqnqnqnqnCMCMFrDpDpDpDpFrFrniagFrzCYGqnqnjxqnqnqnqnqngIPHaWVMaJmvgIqnqnqnqnqnmhqnqnqnqnqnqnsETgtXhXqnqnqnqnqnmhqnqnqnqnqngIPHaWVMaJmvgIqnqnqnqnqnqnqnqnqnqnqnqnqnqnqntXqnqnqnqnaNKMqnqnqnqnqnXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXLXFXFXFXFXFXF -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFrFrLTqnqnqnqnqnqnqnVsvTFrFrFrFrFrFrFrDpDpFrzCqntXtXqnqnqnqnqnladRDuhjVMGhDumNPnqnqnqnqnqnqnKMqnZbqnqntXtXtXqnKMqnqnqnqnqnqnqnqnqnladRDuhjVMGhDumNPnqnqnqnqnqnqnqnqnqnqnqnqnqnqntXqnqnqnqnqnqnqnqnYGMrqnsXJSsXsXsXsXsXsXJSsXsXsXsXsXsXJSQSsXsXsXsXsXJS -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFxLTqnqnqnqnqnqntXqnjxjxjPaEFrFrFrFrFrFrFrLTqnqntXtXqnqnqnqnqnlaaWtTeNeNeNaPaJPnqnqnqnqnqnqnqnqnqnqnlaVMtXjxqnqnqnqnqnqnqnqnqnqnqnlaaWtTeNeNeNaPaJPnqnqnqnZbqnqnqnqnqnqnqnqnqnqnjxtXqnqnqnqntXqnqntXxOeeKMKuqnqnqnqnqnqnKuqnqnqnqnqnqnKuozqnqnqnqnqnKu -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrLTjPqnqnqnqnqnqnqnjxqntXqnqnqnjPjPjPjPjPjPjPqnqnqnjxjxqnqnqnqnqnlaaWQzxogdgSbVaJPnqnqnqnqnqnqnqntXtXtXtXsEVMtXqnqntXtXtXqnqnqnqnqnqnlaaWQzxogdgSbVaJPnqnqnqnqnqnqnqnqnqnKMqnqnqnaNqntXqnqnqnqnjxqntXjxxOeeqnmhqnqnqnqnqnqnmhqnqnqnqnqnqnmhozqnqnqnqnqnmh -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnjxqnqnqnqnqnqnqnqnqntXqnqnqntXqnqnqnqnqnqnlaaWQzPnhXlabVaJPnqnqnqnqnqnqnqnjxtXtXtXjxsEVMtXtXVMtXjxqnYGqnqnqnqnlaaWQzPnZblabVaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnjxqnqnqnqnqntXjxqnxOeeqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFruKqnqnqnqnqnqnqnqnqnqnqnqnaNqngIqnqntXqnqnjxqnqnqnjxqnqnqnqnqnqnlaaWQzmvgIPHbVaJPnqnqnqnqngIqnqnqnjxjxgPqnZHgdjxjxgdjxqnqngIqnqnqnqnlaaWQzmvgIPHbVaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqngIqnqnqnqnqnjxqnqnxOeeqnqnqnqngIqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrpVVMPnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnjxqnqnqnqnqnqnqntXqnqnqnqnqnlaaWRRvlvlvlLDaJPnqnqnqnlaVMPnqnqnqnqnqnlaVMPnqnqnqnqnqnlaVMPnqnqnqnlaaWRRvlvlvlLDaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnxOeeqnqnqnlaVMPnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrFrFrLTlaVMPnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnaNqnqnqnjxqnqnqnqnqnlaXajDvmVMiNjDWSPnqnqnqnlaVMPnqnqnqnqnqnlaVMPnqnqnqnqnqnlaVMPnqnqnqnlaXajDvmVMiNjDWSvYqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnxOeeqnqnqnlaVMPnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrFrFrWQlaVMsYwMwMwMwMwMwMwMwMwMwMwMwMWkVMPnqnqnqnqnqnqnqnqnqnqnqnZbqnqnqnqnTzJOaWVMaJvywuwMwMwMwMWkVMPnqnqnqnqnqnlaVMPnqnqnqnqnqnlaVMsYwMwMwMwMwuzbaWVMaJaUzYqnqnqnqnqnqnqnqnqnqnZbqnqnqnqnlaVMsYwMwMwMwMwMwMwMyzRwwMwMwMWkVMPnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrPUVMbwHiHiHiHiHiHiHiHiHiHiHiHimYVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlahjVMGhbwHiHiHiHiHimYVMsYwMwMwMwMwMWkVMsYwMwMwMwMwMWkVMbwHiHiHiHiHimYhjVMGhPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMbwHiHiHiHiHiHiHixpYwHiHiHimYVMPnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrPUVMyDwrwrwrwrwrwrwrwrwrwrwrwrrEVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMVMyDwrwrwrwrwrrEVMbwHiHiHiHiHimYVMbwHiHiHiHiHimYVMyDwrwrwrwrwrrEVMVMVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMyDwrwrwrwrwrwrwrZPblwrwrwrrEVMPnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn +FrFrFrFrFrFrlPFriJFrFrFriJFrFrFriJFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiHiGoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGOaWWWPnlaKNPnHaWWaJxsqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiHiGoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiKcGoqnqnqnqnqw +FrFrFrFrFrFrlPFriJFrLTaEiJFrFrFrHshIhIFrFrFrFrFrFrzCtXtXqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiHiGoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGOaWFgaDgIsUgIPHciaJxsqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnGoHiHiHiHiHiHiHiHiHiGoqnqnqnqnqnqnqnqnqnqnqnqnqnZbqnqnqnqnqnGoHiHiHiHiHiHiHiHiKcGoqnqnqnhuFr +FrFrFrFrFrFrlPLTQoLrWQqntoaEFrBHXRWwkOaRFrFrFrFrFrzCjxjxqnqnqnqnqnqnUZHiHiHiHiHiHiHiHiHiUZqnqnqnqnqnqnqnZbqnqnqnqnqnqnqnqnqnqnqnHDaWGLrKGqGqGqGLrKaJpjqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnUZHiHiHiHiHiHiHiHiHiUZqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnUZHiHiHiHiHiHiHiHiKcUZqnqnhuFrFr +FrFrFrFrFrFrlPzCmhFrFrWQFVhuFrBHSKLMHQaRFrFrFrFrLTqnqnqnqnqnqnqnqnqnCMjKjKjKjKjKjKjKjKjKCMqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnubaWiNjDjDjDjDjDvmaJnDqnZbqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnCMjKjKjKjKjKjKjKjKjKCMqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnCMjKjKjKjKjKjKjKjKicCMqndsFrFrFr +FrFrFrFrFrFrlPWQhuFrFrFrFrFrFrBHHMAuvWaRFrLyaEFrzCqnqntXtXqnqnqnqnqnVswrwrwrwrwrwrwrwrwrVsqnqnqnqnqnqnqnFfqnqnqnqnqnqnZbqnqnqnqnpXGfDbaAdGVMaAdGGfDbovqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnVswrwrwrwrwrwrwrwrwrVsqnqnqnqnqnqnhXqnqnqnqnqnqnqnqnqnqnqnqnVswrwrwrwrwrwrwrwrGEVsqndsFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrLTUrUrUraEBHpmtfFrzCqnqnjxsoqnqnqnqnqnjxqnqnqnqnqnqnqnqnqnjxqnqnqnaNqngIgIgIgIgIqnqnqnqnqnqnqnqnqnjxREREWKiSREiSWKREREjxqnqnhXqnqnqnqnqnqngIgIgIgIgIqnqnqnqnqnjxqnqnqnqnqnqnqnqnqnjxqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnjxqwqwqwqnqnqnqnqnozSiqwhuFrFrFr +FrFrFrFrFrFrlPFrFrhIhIFrFrFrFrzCGoGoGohuFrQmFrFrzCqnqngActMtqnqnqnqnqnqnTvqntXqnqnqnqnqnqnqnqnqnqnladjDuDuDuoFmvgIgIgIgIgIgIgIgIgICMCMBBxHCMxHBBCMCMgIgIgIgIgIgIgIgIgIPddjDuDuDuoFPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnhuFrFrFrWQqnqnqnqwiiFrFrFrFrFrFr +FrFrFrFrFrFrlPFrBHFgciaRFrFrFrzCUZUZUZFrFrCMaEFrzCqnYGqnREqnqnZbqnqnqnlRfHEjjxqnqnqnqnqnqnqnqnqnqnlaaWZEQqIJGhDuhjRRvlvlvlvlErLDVMhchctBWMXqkhCbhchcVMRRErvlvlvlvlLDGhDuhjZEQqIJaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnhuFrFrFrFrFrPeqwhuFrlPFrFrFrFrFrFr +FrFrFrFrFrFrlPFrBHGLrKaRFrFrFrWQCMCMCMaEFrbJhuFrzCqnTvTvVsqnTvTvTvTvhuFrUrFrzCqnqnqnqnqnqnqnqnqnqnlaaWCexIWpVMVMVMVMVMVMVMVMVMVMVMVMVMVMaJxzaWVMVMVMVMVMVMVMVMVMVMVMVMVMVMCeQeWpaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqntXqnqnqndsFrLTaEFrFrBHLgaRFrFrkmhIhIFrFrFrFr +FrFrFrFrFrFrlPFrFrREREFrhIhIhIhINTNTbJhuFrUcFrLTqngAFgcismgAdRgsxvMjaRFrUZFrWQqnqnqntXqnqnqnqnqnqnlaaWCHJkPmiNjDvmtTJkJkJkJkJkaPVMVMVMVMGhDuhjVMVMVMVMtTeNeNeNeNeNaPiNjDvmCHJkPmaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnKMqnqnYGqnqnaNqnqnqnjxqnqnqndsFrWQqnjPaELTQmhIhIBHmsrBXuaRFrFrFr +FrFrFrFrFrFrlPFrLTCMCMBHyIESGDMMUQUcUcFrFrFrFrzCqngAGLrKMtgApARgyEgUaRFrCMFrFrzCqnqnjxhXqnqnqnqnqnlaGfvmVMiNDbZfPCTzgdgdgdgdgdzYPCwFCHVMVMVMVMVMPmnAPCTzgdgdgdgdgdzYPCOIGfvmVMiNDbPnqnqnqnqnqnqnqnqnqnqnqnqnhXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrWQqndsWQgwDqzRGPNhaMVcaRFrFrFr +FrFrFrFrFrFrlPFrWQOuagBHVdBauiqKaRhIFrFrFrFrFrzCqnqnREREqngAXadwvnWSxFFrNohIFrzCqnqnqnqnqnqnqnqnqngIVTaWVMaJztqnqnqnqnqnqnqnqnqnqnqnPCwFVMVMVMnAPCqnqnqnqnqnqnqnqnqnqnqnSJaWVMaJqYgIqnqnqnqnZbqnqnqnqnKMqnqnqnqnqnqnqnqnqntXtXqnqnqnqnqntXqnqnqnqnqnqnaEFrFrWQqnaEUcQmQmFrwBUrUrFrFrFrFr +FrFrFrFrFrFrlPFrFrUcUcFrREREREREBHfHaRFrFrFrLTqnqnqnVsFUllqnUrUrUrUrrbHbNCXuaRzCqnqnqnqnqnqnqnqntXVMGhhjVMGhPnqnqnqnqnqnqnRfqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnRfqnqnqnqnqnqnlahjVMGhhjVMtXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnjxjxqnqnqnqnqnjxqnqnKMqnqnqnqnaEFrFrWQhuFrCMCMFreCGoGoFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrNTNTniagFrQmaEFrFxFrzCqnqnqnzkDIEWMtUZUZUZUZFrDwZIVcaRzCqnqnqnqnqntXtXtXEyCwVMVMVMVMPnqnqnqnqnqnqnzNqnqnqnqnqnqnsEVMVMPnqnqnqnqnqnzNqnqnqnqnqnqnlaVMVMVMVMVMVMtXtXtXtXtXtXtXtXtXtXtXqntXqnqntXqntXqnqnqnqnqnqnhXqnqnqntXqnqnqnqnTvYbFrFrFrLTVstSFriFUZUZFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrUcUcUcUcFrwfhuFxFxFrzCqnqnqnqnUrUrqwCMCMCMCMFrFrREREFrzCKMqnqnqnqntXtXtXsEVMVMVMVMVMPnqnqnqnqnqnqnzNqnqnqnqnqnqntXsEVMPnqnqnqnqnqnzNqnqnqnqnqnqnlaVMVMVMVMVMsEtXjxtXtXtXtXtXtXsHtXjxqnjxtXqnjxqnjxtXqnqnqnqnqnqnqnqnqnjxqnqntXgAzdLgWOFrFrWQaOZXFrujCMCMFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrLTjxFrFxFxLTqnqnaNqnqnUZUZFrnbniWcagFrFrCMCMFrzCqnqnqntXqnjxjxjxjxPCOIvmVMiNPnqnqnqnqnqnqnKuqnqnqnqnqnlaVMtXsEqnqnqnqnqnqnKuqnqnqnqnqnqnlavmVMiNZfPCjxjxhXjxjxjxjxjxjxjxjxqnqnqnjxqnqnqnZbjxqnqnqnqnqnqnqnqnqnqnqnqnjxqnQmQmqnjPaEFrFrFrFrMRVstSFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrWQhuFrFrLTqnqnqnqnqnqnCMCMFrDpDpDpDpFrFrniagFrzCYGqnqnjxqnqnqnqnqngIPHaWVMaJmvgIqnqnqnqnqnmhqnqnqnqnqnqnsETgtXhXqnqnqnqnqnmhqnqnqnqnqngIPHaWVMaJmvgIqnqnqnqnqnqnqnqnqnqnqnqnqnqnqntXqnqnqnqnaNKMqnqnqnqnqnXFXFXFXFXFXFXFjFjFXFXFRlTHOHIRWjWmtzqaTHTHTHTH +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFrFrLTqnqnqnqnqnqnqnVsvTFrFrFrFrFrFrFrDpDpFrzCqntXtXqnqnqnqnqnladRDuhjVMGhDumNPnqnqnqnqnqnqnKMqnZbqnqntXtXtXqnKMqnqnqnqnqnqnqnqnqnladRDuhjVMGhDumNPnqnqnqnqnqnqnqnqnqnqnqnqnqnqntXqnqnqnqnqnqnqnqnYGMrqnsXJSsXsXsXsXsXtVrcsXsXiyBAycsXRWvpBABABABABACz +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFxLTqnqnqnqnqnqntXqnjxjxjPaEFrFrFrFrFrFrFrLTqnqntXtXqnqnqnqnqnlaaWtTeNeNeNaPaJPnqnqnqnqnqnqnqnqnqnqnlajaVMjxqnqnqnqnqnqnqnqnqnqnqnlaaWtTeNeNeNaPaJPnqnqnqnZbqnqnqnqnqnqnqnqnqnqnjxtXqnqnqnqntXqnqntXxOeeKMKuqnqnqnqnqnjxVnqndsFrFrzCqnKuPAFrFrFrFrFrvM +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrLTjPqnqnqnqnqnqnqnjxqntXqnqnqnjPjPjPjPjPjPjPqnqnqnjxjxqnqnqnqnqnlaaWQzxogdgSbVaJPnqnqnqnqnqnqnqntXtXtXtXsEVMtXqnqntXtXtXqnqnqnqnqnqnlaaWQzxogdgSbVaJPnqnqnqnqnqnqnqnqnqnKMqnqnqnaNqntXqnqnqnqnjxqntXjxxOeeqnmhqnqnqnqnqnqnmhqndsFrFrWQqnmhiiFrFrFrFrFrYE +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnjxqnqnqnqnqnqnqnqnqntXqnqnqntXqnqnqnqnqnqnlaaWQzPnhXlabVaJPnqnqnqnqnqnqnqnjxtXtXtXjxsEVMtXtXVMtXjxqnYGqnqnqnqnlaaWQzPnZblabVaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnjxqnqnqnqnqntXjxqnxOeeqnqnqnqnqnqnqnqnqnqndsFrFrFrWQhulPFrFrFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFruKqnqnqnqnqnqnqnqnqnqnqnqnaNqngIqnqntXqnqnjxqnqnqnjxqnqnqnqnqnqnlaaWQzmvgIPHbVaJPnqnqnqnqngIqnqnqnjxjxgPqnZHgdjxjxgdjxqnqngIqnqnqnqnlaaWQzmvgIPHbVaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqngIqnqnqnqnqnjxqnqnxOeeqnqnqnqngIqnqnqnqnqnqnaEFrFrFrFrlPFrFrFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrpVVMPnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnjxqnqnqnqnqnqnqntXqnqnqnqnqnlaaWRRvlvlvlLDaJPnqnqnqnlaVMPnqnqnqnqnqnlaVMPnqnqnqnqnqnlaVMPnqnqnqnlaaWRRvlvlvlLDaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnxOeeqnqnqnlaVMPnqnqnqnqnqndsFrFrFrFrlPFrFrFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrLTlaVMPnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnaNqnqnqnjxqnqnqnqnqnlaXajDvmVMiNjDWSPnqnqnqnlaVMPnqnqnqnqnqnlaVMPnqnqnqnqnqnlaVMPnqnqnqnlaXajDvmVMiNjDWSvYqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMPnqnqnqnqnqnqnqnxOeeqnqnqnlaVMPnqnqnqnqnqnqnaEFrFrFrlPFrFrFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrWQlaVMsYwMwMwMwMwMwMwMwMwMwMwMwMWkVMPnqnqnqnqnqnqnqnqnqnqnqnZbqnqnqnqnTzJOaWVMaJvywuwMwMwMwMWkVMPnqnqnqnqnqnlaVMPnqnqnqnqnqnlaVMsYwMwMwMwMwuzbaWVMaJaUzYqnqnqnqnqnqnqnqnqnqnZbqnqnqnqnlaVMsYwMwMwMwMwMwMwMyzRwwMwMwMWkVMPnqnqnqnqnqnqnqnjPjPaElPFrFrFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrPUVMbwHiHiHiHiHiHiHiHiHiHiHiHimYVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlahjVMGhbwHiHiHiHiHimYVMsYwMwMwMwMwMWkVMsYwMwMwMwMwMWkVMbwHiHiHiHiHimYhjVMGhPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMbwHiHiHiHiHiHiHixpYwHiHiHimYVMPnqnqnqnqnqnqnqnqnqndslPFrFrFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrPUVMyDwrwrwrwrwrwrwrwrwrwrwrwrrEVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMVMyDwrwrwrwrwrrEVMbwHiHiHiHiHimYVMbwHiHiHiHiHimYVMyDwrwrwrwrwrrEVMVMVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMyDwrwrwrwrwrwrwrZPblwrwrwrrEVMPnqnqnqnqnqnqnqnqnqnqnVgjPjPjPjPjPjP FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrvIVMMtqnqnqnqnqnqnqnqnqnqnqnqngAVMsYwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMdGVMaAqnqnqnqnqnqngAVMyDwrwrwrwrwrrEVMyDwrwrwrwrwrrEVMMtqnqnqnqnqnqndGVMaAwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMWkVMMtqnqnqnqnqnqnqnxOeeqnqnqngAVMsYwMwMwMwMwMwMwMwMwMwMGawMwMwMwMwMwM FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrBqREqnqnqnqnqnqnqnqnqnqnqnqnqnqnREHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiuWQmuWqnqnqnqnqnqnqnQmqnqnqnqnqnqnqnQmqnqnqnqnqnqnqnQmqnqnqnqnZbqnqnuWQmuWHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiREqnqnqnqnqnqnqnqnxOeeqnqnqnqnREHiHiHiHiHiHiHiHiHiHiHiPNHiHiHiHiHiHi FrFrFrFrFrFrlPFrFrFrFrFxFxFrFrAhCMqnqwqwqnqnqnqnqnqnqnqnqnqnqnCMwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrZFuWCMuWPnqnhXqnqnqnqnCMqnqnqnqnZbqnqnCMqnqnqnqnqnqnqnCMqnqnqnqnqnqnlauWCMuWTdwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrCMqnqnqnqnqnqnqnqnxOeeqnqnqnqnCMwrwrwrwrwrwrwrwrwrwrwrGEwrwrwrwrwrwr FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrzCVshuFrFrWQqwqnqnqnqnqnqnqnqnqnVsqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMXqVMPnqnqnqnqnqnqnVsqnqnqnqnqnqnqnVsqnqnqnqnhXqnqnVsqnqnqnqnqnqnlaVMXqVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnVsqnqnqnqnqnqnqnqnxOeeqnqnqnqnVsqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn FrFrFrFrFrFrlPFrFrFrFrFrFrFrLTqnAXFrFrFrFrFrWQqwqnqnqnqnqnqnqnjxqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMlNVMPnqnqnqnqnqnqnjxqnqnqnqnqnqnqnjxqnqnqnqnqnqnqnjxqnqnqnqnqnqnlaVMlNVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnjxqnqnqnqnqnqnqnqnxOeeqnqnqnqnjxqnqnqnqnqnqnqnqnqnqnqnzUqnqnqnqnqwhu FrFrFrFrFrFrlPFrFrFrFrFrFrLTqndsFrFrLTaEFrFrFrFrWQqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMLsVMPnqnZbqnqnqnqnqnqnqnqnqnqnqngIgIgIhXqnqnqnqnqnqnqnqnqnqnqnqnlaVMfjVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnxOeeqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnhulPWQqnqnhuFrFr -FrFrFrFrFrFrlPFrFrFrFrFrFrzCqndsFrFrWQqwjPaEFrFrFrzCqnqnqnqnqnqnqntXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnqnqnqnqnqnqnqnPdtTBLaPieqnqnqnqnqnaNqnqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnaNqnqnqnqnqnqnqnhXqnqnqnqnxOeeqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrlPFrWQhuFrFrFr -FrFrFrFrFrFrgvFrFrFrFrFrLTqnqndsFrFrFrFrWQhuFrFrFrzCqnqnqnqnqnqntXjxtXqnYGqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnqnqnqnqnqnYGPdtTPmxaCHaPieqnqnqnqnqnqnqnqnqnqnqnlaVMVMVMPnqnqnZbqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnxOeeqnqnqnqnqnqnqnqnqnqnqnqnqnqnhuFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrFrFrLTqnqnqnqnaEFrFrFrFrFrFrFrLTqnqnKMqnqnqnqwaOqwaOqwqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnqnqnhXqnqnlaVMWpwPqnQtCeVMPnqnqnqnqnqnqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnKMqnqnxOeeqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrFrFrzCqnqnqnqnqnaEFrFrFrLTjPjPqnqnqnqnqnqnhuFrFxFrFrFrWQqnqnqnqnqnhXqnqnqnqnqnqnqnlaVMVMtTPnqnYGqnqnqnqnqnqnqnqnlaVMWpPnqnlaCeVMPnqnZbqnqnqnqnqnqnqnqnlaaPVMVMPnqnaNqnqnqnqnqnqnqnhXqnqnqnqnqwqwqwqnqnqnqnqnaNqnqnqnxOeeqnhXqnqnqnqnqnqnqnqnqnqnqnhuFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrFrFrzCqnqnqnqnqnqnjPjPjPqnqnqnqnYGqnqnqnhuFrFxFxFrFrFrFrWQqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMWpieqnqnqnqnqnqnqnqnqnqnlaVMWpPnyvlaCeVMPnqnqnqnqnqnqnqnqnqnqnPdCeVMVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnhuFrFrFrWQqnqnqnqnqnqnqnqnxOeeqnqnqnqnqntXtXqnqnqnqnqndsFrFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnqnlaaPVMRRIJiegIgIgIgIgIgIgIgIEtPdjaWpmvqnPHCecGiegIgIgIgIgIgIgIAKgIPdZELDVMtTPnqnqnqnqnqnqnqnqnqwqwqwqwhuFrFrFrFrFrWQqwqwqnqnqnqnqnxOeeqnqnqnqnqntXtXqnqnqnqnqnhuFrFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrFrLTqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnqnlabVVMVMRRvlLDVMVMiNjDvmVMVMVMVMVMRRIJfjZELDVMVMVMVMVMiNjDvmVMVMRRvlLDVMVMWpPnqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqnqnxOeeqnqnqnqnqntXjxqnhXqnqndsFrFrFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrFrzCqnqnqnqnqnqnqnqnaNqnqnqwqwqnqnqwqwqnaEFrFrFrFrFrFrFrLTqnqnqnqnqnqnqnqnqnqnqnqnlaWXaPVMVMVMVMVMVMaJfHaWVMVMVMVMVMVMRRQqLDVMVMVMVMVMVMaJfHaWVMVMVMVMVMVMVMdKPnqnqnqnqnhXqnqnhuFrFrFrFrFrFrLTaEFrFrFrFrFrWQqnqnqnqnxOeeqnZbqnqnqntXqnqnqnqnqndsFrFrFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrLTqnqnqnqnqnqnqnqnqnqwqwhuFrFrWQhuFrFrWQqnjPaEFrFrFrLTjPqnqnqnqnqnqnqnqnqnqnqnqnqnqnwFNxeNaPVMVMVMVMGhDuhjVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMGhDuhjVMVMVMVMtTJkdKZfqnqnqnqnqnqnqndsFrFrFrFrLTjPjPqnqnaEFrFrFrFrFrzCqnqnqnxOeeqnqnqnqnqnjxqnqnqnqnqndsFrFrFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrzCqnqnqnqnqnqnqnqnhuFrFrFrFrFrFrFrFrFrFrWQqnqnjPjPjPqnqnqnqnqnqnqnqntXqnqnqnqnqnqnqnqnPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCwFVMVMVMnAPCPCPCPCPCPCPCPCPCPCPCPCPCPCPCqnqnqnqnqnqnqnqnhuFrFrFrFrWQqnqnYGqndsFrFrFrFrFrzCYGqnqnxOeeqnqnqnqnqntXtXqnqnqnqndsFrFrFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrzCqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnqntXjxqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnPHVMVMVMmvqnqnqnqnqnqnZbqnqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrFrFrFrFrWQaNqnqndsFrFrFrFrFrzCqnqnqnxOeeqnqnaNqnqntXtXqnqnqnqndsFrFrFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrzCqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnqntXtXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnYGqnqnqnqnqnqnPHVMVMVMVMVMmvqnqnqnqnqnqnqnqnqnqnqnqnqnhXqnqnqnZbqnqnqndsFrFrFrFrFrFrFrmMqwqwhuFrFrFrFrFrzCqnqnqnxOeeqnqnqnqnqntXjxqnqnqnqndsFrFrFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrFrzCqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnaNqnqnqnjxjxqnKMqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMMhEmCwVMVMPnqnqnqnqnqnqnqnqnqwqwqwqnqnqnqnqnqnqnqnqnqnaEFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqnxOeeqnqnqnqnqntXtXqnqnqnqnqnaEFrFrFrlPFrFrFrFrFrFr -FrFrFrFrFrFrgvFrLTqnqnqnqnqnqnqnqnqnaEFrFrFrFrFrFrFrFrFrFrLTqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqwqwqwqnqnqwqwqnqnqngIlaFgxozYgITzgSciPngIaNqnqnqnqnqndsFrFrFrWQqnqnqnqnqnqnqnZbqnqnaEFrFrFrFrFrFrFrFrFrFrFrFrFrLTqnqnqnqnxOeeqnqnqnqnqntXtXqnqnqnqnqndsFrFrFrlPFrFrFrFrFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrzCqndsFrFrWQqwjPaEFrFrFrzCqnqnqnqnqnqnqntXqnqnqnqnqnqnqnqnqnqnqnqnqnFfqnqnlaVMVMVMPnqnqnqnqnqnqnqnqnqnqnqnqnPdTbBLtlieqnqnqnqnqnaNqnqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnaNqnqnqnqnqnqnqnhXqnqnqnqnxOeeqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrlPFrWQhuFrFrFr +FrFrFrFrFrFrgvFrFrFrFrFrLTqnqndsFrFrFrFrWQhuFrFrFrzCqnqnqnqnqnqntXjxtXqnYGqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnqnqnqnqnqnYGPdTbVcxaoWtlieqnqnqnqnqnqnqnqnqnqnqnlaVMVMVMPnqnqnZbqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnxOeeqnqnqnqnqnqnqnqnqnqnqnqnqnqnhuFrlPFrFrFrFrFrFr +FrFrFrFrFrFrgvFrFrFrFrLTqnqnqnqnaEFrFrFrFrFrFrFrLTqnqnKMqnqnqnqwaOqwaOqwqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnqnqnhXqnqnlaqyDOwPqnQtofhpPnqnqnqnqnqnqnqnqnqnqnlaVMVMVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnKMqnqnxOeeqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrlPFrFrFrFrFrFr +FrFrFrFrFrFrgvFrFrFrFrzCqnqnqnqnqnaEFrFrFrLTjPjPqnqnqnqnqnqnhuFrFxFrFrFrWQqnqnqnqnqnhXqnqnqnqnqnqnqnlaVMVMtTPnqnYGqnqnqnqnqnqnqnqnlaaWWpPnqnlaCeaJPnqnZbqnqnqnqnqnqnqnqnlaaPVMVMPnqnaNqnqnqnqnqnqnqnhXqnqnqnqnqwqwqwqnqnqnqnqnaNqnqnqnxOeeqnhXqnqnqnqnqnqnqnqnqnqnqnhuFrFrlPFrFrFrFrFrFr +FrFrFrFrFrFrgvFrFrFrFrzCqnqnqnqnqnqnjPjPjPqnqnqnqnYGqnqnqnhuFrFxFxFrFrFrFrWQqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMWpieqnqnqnqnqnqnqnqnqnqnlaaWWpPnyvlaCeaJPnqnqnqnqnqnqnqnqnqnqnPdCeVMVMPnqnqnqnqnqnqnqnqnqnqnqnqnqnhuFrFrFrWQqnqnqnqnqnqnqnqnxOeeqnqnqnqnqntXtXqnqnqnqnqndsFrFrFrlPFrFrFrFrFrFr +FrFrFrFrFrFrgvFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnqnlaaPVMRRfqiegIgIgIgIgIgIgIgIEtPdyFWpmvqnPHCecGiegIgIgIgIgIgIgIAKgIPdlqLDVMtTPnqnWVqnqnqnqnqnqnqwqwqwqwhuFrFrFrFrFrWQqwqwqnqnqnqnqnxOeeqnqnqnqnqntXtXqnqnqnqnqnhuFrFrFrlPFrFrFrFrFrFr +FrFrFrFrFrFrgvFrFrFrLTqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnqngIqnlabVVMVMRRvlLDVMVMVpdyYmVMVMVMGhhjRRIJfjZELDGhhjVMVMVMVpdyYmVMVMRRvlLDVMVMWpPnqngIqnqnqnqnqndsFrFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqnqnxOeeqnqnqnqnqntXjxqnhXqnqndsFrFrFrFrlPFrFrLTaEFrFr +FrFrFrFrFrFrgvFrFrFrzCqnqnqnqnqnqnqnqnaNqnqnqwqwqnqnqwqwqnaEFrFrFrFrFrFrFrLTqnqnqnqnqnqnqnqnqnlaDMPnlaWXaPVMVMVMVMVMVMWWfHXmVMVMVMVMVMVMRRQqLDVMVMVMVMVMVMWWfHXmVMVMVMVMVMVMVMdKPnlaDMPnqnhXqnqnhuFrFrFrFrFrFrLTaEFrFrFrFrFrWQqnqnqnqnxOeeqnZbqnqnqntXqnqnqnqnqndsFrFrFrFrlPFrLTqndsFrFr +FrFrFrFrFrFrgvFrFrLTqnqnqnqnqnqnqnqnqnqwqwhuFrFrWQhuFrFrWQqnjPaEFrFrFrLTjPqnqnqnqnqnqnqnqnqnqnqnirqnqnQtNxeNaPVMVMVMVMJiGqDoVMVMVMVMVMVMVMVMVMVMVMVMVMVMVMJiGqDoVMVMVMVMtTJkdKztqnqnirqnqnqnqndsFrFrFrFrLTjPjPqnqnaEFrFrFrFrFrzCqnqnqnxOeeqnqnqnqnqnjxqnqnqnqnqndsFrFrLTaElPFrzCqnhuFrFr +FrFrFrFrFrFrgvFrFrzCqnqnqnhXqnqnqnqnhuFrFrFrFrFrFrFrFrFrFrWQqnqnjPjPjPqnqnqnqnqnqnqnqntXqnqnqnqnqnqnqnqnPCPCPCPCPCTzgdgdgdgdgdzYPCPCPCwFVMVMVMnAPCPCPCTzgdgdgdgdgdzYPCPCPCPCPCqnqnqnqnqnqnqnqnhuFrFrFrFrWQqnqnYGqndsFrFrFrFrFrzCYGqnqnxOeeqnqnqnqnqntXtXqnqnqnqndsFrFrWQdslPLTqndsFrFrFr +FrFrFrFrFrFrgvFrFrzCqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnqntXjxqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnPHVMVMVMmvqnqnqnqnqnqnZbqnqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrFrFrFrFrWQaNqnqndsFrFrFrFrFrzCqnqnqnxOeeqnqnaNqnqntXtXqnqnqnqndsFrFrFrzCVgqnqndsFrFrFr +FrFrFrFrFrFrgvFrFrzCqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnqnqnqnqntXtXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnYGqnqnqnqnqnqnPHVMVMVMVMVMmvqnqnqnqnqnqnqnqnqnqnqnqnqnhXqnqnqnZbqnqnqndsFrFrFrFrFrFrFrmMqwqwhuFrFrFrFrFrzCqnqnqnxOeeqnqnqnqnqntXjxqnqnqnqndsFrFrFrWQzUqwqwhuFrFrFr +FrFrFrFrFrFrgvFrFrzCqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqnqnqnqnqnaNqnqnqnjxjxFfKMqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaVMVMMhEmCwVMVMPnqnqnqnqnqnqnqnqnqwqwqwqnqnqnqnqnqnqnqnqnqnaEFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqnxOeeqnqnqnqnqntXtXqnqnqnqnqnaEFrFrFrlPFrFrFrFrFrFr +FrFrFrFrFrFrgvFrLTqnqnqnqnqnZbqnqnqnaEFrFrFrFrFrFrFrFrFrFrLTqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqwqwqwqnqnqwqwqnqnqngIlaFgxozYgITzgSciPngIaNqnqnqnqnqndsFrFrFrWQqnqnqnqnqnqnqnZbqnqnaEFrFrFrFrFrFrFrFrFrFrFrFrFrLTqnqnqnqnxOeeqnqnqnqnqntXtXqnqnqnqnqndsFrFrFrlPFrFrFrFrFrFr FrFrFrFrFrFrgvFrzCqnqnqnqnqnqnqnqnqnqnjPaEFrFrFrFrFrFrLTjPqnqntXqnqnqntXtXqnqnqnqnqnqnqnqnqnqnZbqnqnqnqnqnhuFrFrFrWQhuFrFrWQqnlaDMPndWqnlafHPnqndWlaDMPnqnqnqnqnqwhuFrFrFrFrzCqnqnqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrFrFrFrFrzCqnZbqnqnxOeeqnqnqnqnqnjxtXqnqnZbqnqnqnaEFrFrlPFrFrFrFrFrFr -FrFxFrFrFrFrlPLTqnqnqnqnqnqnqnqnqnqnqnqnqnaEFrFrFrFrLTqnqnqntXjxtXtXtXtXtXtXqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrzCqnirlaGLmvgIirgIPHrKPnirqnqnqnighuFrFrFrFrFrFrzCYGqnqnqnqnqnqnqnqnqnjPjPjPaEFrFrFrFrFrFrLTjPjPqnqnqnqnqnxOeeqnqnqnqnqnqnjxqnqnqnqnqnqndsFrFrlPFrFrFrFrFrFr -FrFxFrFrFxFrkoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnaEFrFrLTqnqnqnqnjxqnjxjxjxjxjxjxqnqnqnhXqnqnqnqnqnqnqnqnqnqnqnaEFrFrFrFrFrFrFrFrzCqnqnlaGfvmCwfjKDiNDbPnqnqnqndsFrFrFrFrFrFrLTjPqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnjPaEFrFrLTjPqnqnqnqnqnqnqnqnxOeeqnqnqnqnqnqnqnqnqnqnqnqnqnqnaEFrlPFrFrFrFrFrFr +FrFxFrFrFrFrlPLTqnqnqnqnYGqnqnqnqnqnqnqnqnaEFrFrFrFrLTqnqnqntXjxtXtXtXtXtXtXqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrFrFrFrFrFrFrFrzCqnirlaGLmvgIirgIPHrKPnirqnqnqnighuFrFrFrFrFrFrzCYGqnqnqnqnqnqnqnqnqnjPjPjPaEFrFrFrFrFrFrLTjPjPqnqnqnqnqnxOeeqnqnqnqnqnqnjxqnqnqnqnqnqndsFrFrlPFrFrFrFrFrFr +FrFxFrFrFxFrkoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnaEFrFrLTqnqnqnqnjxqnjxjxjxjxjxjxqnqnqnhXqnqnqnqnqnqnqnqnqnqnqnaEFrFrFrFrFrFrFrFrzCqnqnlaGfvmCwfjKDiNDbPnqnqnWVdsFrFrFrFrFrFrLTjPqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnjPaEFrFrLTjPqnqnqnqnqnqnqnqnxOeeqnqnqnqnqnqnqnqnqnqnqnqnqnqnaEFrlPFrFrFrFrFrFr WjPPWjWjWjOHXLXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFeXeXXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFeXIRWjWjWjOHeXeXXFXFXFXFIcLEizANSkqkqEXFXFXFXFoBWjWjWjWjWjWjSFXFXFXFXFXFXFXFXFXFXFEwXFXFXFXFXFXFXFeXeXXFXFXFXFXFXFXFXFXFXFqnKMqnhXqnqnqnqnYGqnqnqnqnaNqnqndsFrlPFrFrFrFrFrFr nXIZnXcjnXycQSsXJSsXsXsXsXsXsXsXJSsXsXsXsXsXsXJSsXsXsXsXsXsXJSsXsXsXsXsXsXJSsXsXsXsXsXsXJSsXsXsXsXsXsXJSsXsXsXsXFFFFZBsXsXsXsXsXsXJSsXGGEvsIlhzEsXJSsXsXsXsXQsnXnXudFFFFsXJSsXsXsXsXsXsXJSsXsXsXsXsXsXJSsXsXsXsXsXsXJSsXsXsXsXsXsXJSsXdgqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnaElPFrFrFrFrFrFr FriJFrFrLTqnozqnzNqnqnqnqnqnqnqnzNqnqnqnqnqnqnzNqnqnqnqnqnqnzNqnqnqnqnqnqnzNqnqnqnqnqnqnzNqnqnqnqnqnqnzNqnqnqnqnqnqnzNqnqnqnqnqnqnzNqnPHaWVMaJmvqnzNqnqnqnqnzNjPjPqnqnqnZbzNqnqnqnqnqnqnzNqnqnqnqnqnqnzNqnqnqnqnqnqnzNqnqnqnqnqnqnzNqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqndslPFrFrFrFrFrFr @@ -712,23 +765,23 @@ HiHiHiHiHiHiPNHiUZGoGoGoUZHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHi HiHiHiHiHiHiPNHiCMUZUZUZCMHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiCMCMCMCMCMHiHiHiHiHiHiHiHiBBBBBBGoBBBBBBHiHiHiHiHiHiHiHiCMCMCMCMCMHiHiHiHiHiHiHiHiHiHiHiHimWmWmWHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiCMUZUZUZCMHiPNHiHiHiHiHiHi mWmWmWuojKjKdkjMhcCMCMCMhcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLchchchchchcLcLcLcLcLcLcLcLcFBhcXMUZlHhcSLLcLcjMjMjMjMLcLchchchchchcLcLcLcLcLcLcLcLcLcLcLcLcmWmWmWLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcLcjMhcCMCMCMhcLcKTjKjKYCmWmWmW fufufuwrwrwrGEUsVMhchchcVMZaSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMPCPCPCPCPCSMSMSMSMSMSMSMADARVMAyCMgyVMeJZaSMSMSMSMSMSMSMPCPCPCPCPCSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMSMUsVMhchchcVMZaGEwrwrwrSMSMSM -WQqnqnqnqnqnozqnPCPCPCPCPCqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaARVMAyFQgyVMeJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnPCPCPCPCPCqnozqnqnqnqnqnqn -FrzCqnqnqnqnozqngIgIqnqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaARVMAyNzgyVMeJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqnqngIgIqnqnozqnqnqnqnqnqn -FrWQqnqnqnqnozlaFgciPnqnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaARVMAyLsgyVMeJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnhXqnqnqnqnYGqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnZbqnlaFgciPnqnozqnqnqnqnqnqn -FrFrWQqnqnqnozlaGLrKPnqnqnaNqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnirqngIEtgIqnqnqnqnqnqnqnqnqnqngIgIgIgIqnqnqnqnqnqnqnqnlaARVMMgAebqVMeJPnqnqnqnqnqnqnqnqngIgIgIgIYGqnqnqnqnqnqnqnqnqngIgIgIqnirqnqnqnaNqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnlaGLrKPnqnozqnqnqnqnqnqn -FrFrFrWQqnqnozqnTzzYgIgIqnqnqnqnqnqnqnKMqnqnqnqnqnqnKMqnqnqnaNqnqnKMqnqnqnqngIPdcUvlnQiegIqnqnqnqnqnqnqnlaFgqyDuhpieqnqnqnqnqnqnqnPHVdApcfdTApdThwmvqnqnqnqnqnqnqnPHqyDuhpciPnqnqnqnqnqnqnqngIPHcUvlnQmvgIqnKMqnqnqnqnqnqnKMqnqnqnYGqnqnKMqnqnqnqnqnqnqnqnqnqngIgITzzYqnqnozqnqnqnqnqnqn -FrFrFrFrzCqnozqnqnPdvlvlieqnqnqnqnqnqntXqnqnqnqnqnqntXqnqnqnqnqnqnqnqnqnqnlaqyDuDuDuDuDuhpPnqnqnqnqnqnqnqnQtaWVMGhhpPnqnqngIqnqnlaZEVMiNDbIkGfvmVMIJPnqnqngIqnqnlaqyhjVMaJwPqnqnqnqnqnqntXlaqyDuDuDuDuDuhpPnqnZbqnqnhXqnqnqntXtXtXqnqnqnqnqnZbqnqnhXqnqnaNqnPHqyhpmvqnqnqnozqnqnqnqnqnqn -FrFrFrFrzCqnozqnlaVMQzwLgzPnqnqnqnqnqntXtXqnqnqntXqnjxqnqnqnqnqntXqnqnqnqnlaDyCwVMVMVMCwQpPntXqnqnqnqnqnqnHaorCwCweaPnqnlafHPnqnlaYvCwaJwPqnQtaWCwTRPnqnlafHPnqnlayWCwCwajPnqnqnqnqnqnZbjxlahdCwVMVMVMCwboPnqntXqntXqnqnqnqnjxtXjxaNqnqntXqnqntXqnqnqnqnqnlaPkPpSNDzPnqnqnozqnqnqnqnqnqn -FrFrFrLTqnqnozqnqnrjeNeNFwqnqnqnqnqnqnjxjxqnqnqntXqnYGqnqnqnqnqnjxqntXqnqnlaGfjDjDjDjDjDDbPnjxqnqnqnqnqnqnPHaWVMiNDbPnqnqnirqnqnlaZQvmaJmvqnPHaWiNoVPnqnqnirqnqnlaGfvmVMaJmvqnqnqnqnqnqnqnlaGfjDjDjDjDjDDbPnqntXtXjxqnqntXqnhXjxqntXqntXjxtXqnjxqnqnqnqnqnqncHGfDbCnqnqnqnozqnqnqnqnqnqn -FrFrLTqnqnqnozqngIgIIFPCqnqnKMqnqnqnqnqnqnZbqnqnjxqnqnqnqnqnqnqnqnqnjxqnqnqnTzuveAJkduMuzYqnqnqnKMqnqnqnlaGLGfjDDbnAqnqnqnqnqnqnqnSJaWGhoFfjdjhjaJztqnqnqnqnqnqnqnOIGfjDDbrKPnKMqnqnqnqnqnqnTzJOeAJkduaUzYqnqngPjxqnqnqnjxqnqnqnqnjxqnjxqnjxqnqnqnKMqnqnqnhXqnPCPCgIgIgIqnozqnqnqnqnqnqn -FrFrWQqnqnqnozlaVpdyYmPnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqngIZbqnqnqnqnqngIqnPCPCPCqnqnqnqnqnqnqnqnqnqnTzgdgdzYqnqnqnqnqnqnqnqnlaaWVMGhDuhjVMaJPnqnqnqnqnqnqnqnqnTzgdgdzYqnqnqnqnqnqnqnqnqnZbPCPCPCqngIqnqnqnqnqnqngIqnqnqnqnZbqngIqnqnqnqnqnqngIqnqnqnqnqnqnlatTJkaPPnozqnqnqnqnqnqn -FrFrFrzCqnqnozlaWWXKXmPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnYGqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaaWtTJkVMJkaPaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnhXqnqnqnqnqnqnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnqnlaWpDMCePnozqnqnqnqnqnqn -FrFrFrzCqnqnozlaJiGqDoPnqnqnqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaaWWpoKQqoKCeaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnYGqnqnqnqnqnqnqnqnqnqnirqnqnaNqnqnqnirqnqnqnqnqnqnirqnqnYGqnqnqnirqnqnqnqnqnqnlaRRQqLDPnozqnqnqnqnqnqn -FrFrLTqnqnqnozqnTzgdzYqnqnqnqnqnqnqnqnKMqnqnqnqnqnqnKMqnqnqnqnqnqnKMqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaaWWpmvirPHCeaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnaNqnqnqnTDqnqnqnqnqnqnKMqnaNqnqnqnqnKMqnqnqnqnqnqnqnqnqnhXqnqnTzgdzYqnozqnqnqnqnqnqn -FrFrzCqnqnqnozqnqnqnqnqnqnhXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaaWVMpbDFEWVMaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnZbqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnaNqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrFrzCqnqnqnozqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnPdaWWpztgISJCeaJieqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnhXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -FrLTqnqnqnqnozqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnPdMghjWpeyeNeyCeGhItieqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn -LTqnqnqnqnqnozqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlabVVMVMRRQqVMQqLDVMVMWpPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnYGqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnozqnqnqnqnqnqn +qwqwqnqnqwqwozqnPCPCPCPCPCqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaARVMAyFQgyVMeJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnPCPCPCPCPCqnozqwqwqwqwqwqw +FrFrWQhuFrFrihqngIgIqnqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnFflaARVMAyNzgyVMeJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqnqngIgIqnqwiiFrFrFrFrFrFr +FrFrFrFrFrFrlPPUFgciPnqnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaARVMAyLsgyVMeJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnhXqnqnqnqnYGqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnZbqnlaFgciNUFrlPFrFrLTaEFrFr +FrFrFrFrFrFrlPPUGLrKPnqnqnaNqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnirqngIEtgIqnqnqnqnqnqnqnqnqnqngIgIgIgIqnqnqnqnqnqnqnqnlaARVMMgAebqVMeJPnqnqnqnqnqnqnqnqngIgIgIgIYGqnqnqnqnqnqnqnqnqngIgIgIqnirqnqnqnaNqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnlaGLrKYLFrlPLTjPqndsFrFr +FrFrFrFrFrFrlPWQTzzYgIgIqnqnqnqnqnqnqnKMqnqnqnqnqnqnKMqnqnqnaNqnqnKMqnqnqnqngIPdcUvlnQiegIqnqnqnqnqnqnqnlaFgqyDuhpieqnqnqnqnqnqnqnPHVdApcfdTApdThwmvqnqnqnqnqnqnqnPHqyDuhpciPnqnqnqnqnqnqnqngIPHcUvlnQmvgIqnKMqnqnqnqnqnqnKMqnqnqnYGqnqnKMqnqnqnqnqnqnqnqnqnqngIgITzYyFrFrlPzCqnqnhuFrFr +FrFrFrLTaEFrlPFrzCPdvlvlieqnqnqnqnqnqntXqnqnqnqnqnqntXqnqnqnqnqnqnqnqnqnqnlaqyDuDuDuDuDuhpPnqnqnqnqnqnqnqnQtaWVMGhhpPnqnqngIFfqnlaZEVMiNDbIkGfvmVMIJPnqnqngIqnqnlaqyhjVMaJwPqnqnqnqnqnqntXlaqyDuDuDuDuDuhpPnqnZbqnqnhXqnqnqntXtXtXqnqnqnqnqnZbqnqnhXqnqnaNqnPHqyhpmvdsFrFrkoqnqndsFrFrFr +FrFrFrzCqnaElPFrPUVMQzwLgzPnqnqnqnqnqntXtXqnqnqntXqnjxqnqnqnqnqntXqnqnqnqnlaDyCwVMVMVMCwQpPntXqnqnqnqnqnqnHaorCwCweaPnqnlafHPnqnlaYvCwaJwPqnQtaWCwTRPnqnlafHPnqnlayWCwCwajPnqnqnqnqnqnZbjxlahdCwVMVMVMCwboPnqntXqntXqnqnqnqnjxtXjxaNqnqntXqnqntXqnqnqnqnqnlaPkPpSNDzNUFrFrihqnqndsFrFrFr +FrFrFrzCqnhulPFrzCrjeNeNFwqnqnqnqnqnqnjxjxqnqnqntXqnYGqnqnqnqnqnjxqntXqnqnlaGfjDjDjDjDjDDbPnjxqnqnqnqnqnqnPHaWVMiNDbPnqnqnirqnqnlaZQvmaJmvqnPHaWiNoVPnqnqnirqnqnlaGfvmVMaJmvqnqnqnqnqnqnqnlaGfjDjDjDjDjDDbPnqntXtXjxqnqntXqnhXjxqntXqntXjxtXqnjxqnqnqnqnqnqncHGfDbCnqnaEFrlPWQqnqnaEFrFr +FrFrFrWQhuFrlPLTgIgIIFPCqnqnKMqnqnqnqnqnqnZbqnqnjxqnqnqnqnqnqnqnqnqnjxqnqnqnTzuveAJkduMuzYqnqnqnKMqnqnqnlaGLGfjDDbnAqnqnqnqnqnqnqnSJaWGhoFfjdjhjaJztqnqnqnqnqnqnqnOIGfjDDbrKPnKMqnqnqnqnqnqnTzJOeAJkduaUzYqnqngPjxqnqnqnjxqnqnqnqnjxqnjxqnjxqnqnqnKMqnqnqnhXqnPCPCgIgIgIaEruFrzCqnqnaEFr +FrFrFrFrFrFrlPPUVpdyYmPnqnqnqnqnqngIqnqnqnqnqnqngIqnqnqnqnqnqngIZbqnqnqnqnqngIqnPCPCPCqnqnqnqnqnqnqnqnqnqnTzgdgdzYqnqnqnqnqnqnqnqnlaaWVMGhDuhjVMaJPnqnqnqnqnqnqnqnqnTzgdgdzYqnqnqnqnqnqnqnqnqnZbPCPCPCqngIWVqnqnqnqnqngIqnqnqnqnZbqngIqnqnqnqnqnqngIqnqnqnqnqnqnlatTJkaPNUlPFrzCqnqnhuFr +FrFrFrFrFrFrkolaWWXKXmPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnYGqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaaWtTJkVMJkaPaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnhXqnqnqnqnqnqnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnlaDMPnqnqnqnqnqnlaWpDMCeNUlPFrWQqwhuFrFr +FrFrFrFrFrFrihlaJiGqDoPnqnqnqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnirqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaaWWpoKQqoKCeaJPnqnWVqnqnqnqnqnqnqnqnqnqnqnqnqnYGqnqnqnqnqnqnqnqnqnqnirqnqnaNqnqnqnirqnqnqnqnqnqnirqnqnYGqnqnqnirqnqnqnqnqnqnlaRRQqLDYLlPFrFrFrFrFrFr +FrFrLTaEFrFrlPzCTzgdzYqnqnqnqnqnqnqnqnKMqnqnqnqnqnqnKMqnqnqnqnqnqnKMqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaaWWpmvirPHCeaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnaNqnqnqnTDqnqnqnqnqnqnKMqnaNqnqnqnqnKMqnqnqnqnqnqnqnqnqnhXqnqnTzgdKLFrlPFrFrFrFrFrFr +FrFrWQqnaEFrlPzCqnqnqnqnqnhXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlaaWVMpbDFEWVMaJPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnZbqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnaNqnqnqnqnqnqnqnqnhuFrFrlPFrFrFrFrFrFr +FrFrFrWQhuFrlPzCqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnPdaWWpztgISJCeaJieqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnhXqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnhuFrFrFrlPFrFrFrFrFrFr +FrFrFrFrFrFrkoqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnPdMghjWpeyeNeyCeGhItieqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqndsFrFrFrFrlPFrFrFrFrFrFr +jPjPjPjPjPjPozqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnlabVVMVMRRQqVMQqLDVMVMWpPnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnYGqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnqnjPjPjPjPVgjPjPjPjPjPjP wMwMwMwMwMwMGawMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwEJkGlNneNeNeNGlNnJkvKwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMwMGawMwMwMwMwMwM HiHiHiHiHiHiPNHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiGoREBBBBREREREBBBBREGoHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiPNHiHiHiHiHiHi HiHiHiHiHiHiPNHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiGOVkhcTIdYdYdYhQhcafxsHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiHiPNHiHiHiHiHiHi @@ -743,23 +796,23 @@ FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFrFrFrFrLTjPjPjPjPjPjPjPjPqnqnqnaEFrFrFrLTjPjP FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrLTjPjPjPjPqnqnqnqnqnqwqwqwqnqnqnqnhuFrFrFrzCqnqwqwqnqndsFrFrFrFrzCqnhuFrFrFrFrzCqnqnEpFrFrFrFrOaaWaJPnqnlaDMPnqnlaaWaJNUFrFrFrWQchqwqndsFrFrFrFrLTjPjPjPqnqnqntXtXqnqndsFrFrFrFrFrWQhuFrLTjPjPjPqwqwqngAVxVxVxVMVMMtllFTFTFTTvgAVMVMVxVxVxRVqnaEFrFrFrFr FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrzCqwqwqnqnqwqwqnqnhuFrFrFrWQqnqndsFrFrFrFrgxdsFrFrWQqndsFrFrFrFrzCdsFrFrFrFrFrzCqnhuFrFrFrFrFrOaaWaJPnqnqntDqnqnlaaWaJNUFrFrFrFryqFrWQdsFrFrFrFrzCqntXqnqwcuqwaOtXqnqndsFrFrFrFrFrFrFrLTqnqnqndsFrFrzCjXVxMbREREREgAFgGqGqGqciMtREREREAAVxPRqnhuFrFrFrFr FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrLTdsFrFrWQbWFrFrzChuFrFrFrFryqzCqndsFrFrFrLTlTdsFrFrFrzCdsFrLTBojPqndsFrFrFrFrLTqndsFrFrFrFrFrFrOaaWaJPnqnqnqnqnqnlaaWaJNUFrFrFrFrFrFrFrzCjPjPjPjPqntXjxhuFrHPFrFrKYqnqndsFrFrFrFrFrFrFrzCqnqnqndsFrFrXXVxVxUkCMGxCMgAWWMbNfAAWWMtCMGxCMsZVxVxmCFrFrFrFrFr -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrzCdsFrFrFrFrFrFrEKFrFrFrFrFrLTqntXqnjPaEFrWQqndsFrFrLTqnqnjPqnMDtXqndsFrFrFrFrzCqndsFrFrLTClClClPHaWaJPnqnqnqnqnqnlaaWaJmvJEJEJEaEFrFrFrzCqnqnqnqnqnjxqnFrFrEKFrFrWQtXqndsFrFrFrFrFrFrFrWQqnqnqnhuFrFrXXVxMbVspXDMovgAWWSOobLLWWMtpXDMovVsAAVxmCFrLTaEFrFr -FrFrFrFrFrLTPAFrLTaEFrFrFrFrFrzCdsFrFrFrFrFrFrEKFrFrFrFrFrzCqnjxqnqndsFrFrzCqnaEFrWQqwqwqnqnjxjxqwhuFrFrFrFrzCqnqnjPjWlaCeiNjDdqhjaJPnqnqngIqnqnlaaWGhCdjDvmQzVejPjPjPqnqntXqnqntXqnhuFrFrEKFrFrFrCLqndsFrFrFrFrFrFrFrFrWQqwhuFrFrFrXXVxDejxjxREjxgAWWsmJUzkWWMtjxREjxjxNLVxmCFrzCdsFrFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrzCdsFrFrFrFrFrFrEKFrFrFrFrFrLTqntXqnjPaEFrWQqndsFrFrLTqnqnjPqnMDtXqndsFrFrFrFrzCqndsFrFrLTClClClPHaWaJPnqnqnqnqnqnlaaWaJmvJEJEJEaEFrFrFrzCqnqnqnqnqnjxdsFrFrEKFrFrWQtXqndsFrFrFrFrFrFrFrWQqnqnqnhuFrFrXXVxMbVspXDMovgAWWSOobLLWWMtpXDMovVsAAVxmCFrLTaEFrFr +FrFrFrFrFrLTPAFrLTaEFrFrFrFrFrzCdsFrFrFrFrFrFrEKFrFrFrFrFrzCqnjxqnqndsFrFrzCqnaEFrWQqwqwqnqnjxjxqwhuFrFrFrFrzCqnqnjPjWlaCeiNjDdqhjaJPnqnqngIqnqnlaaWGhCdjDvmQzVejPjPjPqnqntXqnqntXqwhuFrFrEKFrFrFrCLqndsFrFrFrFrFrFrFrFrWQqwhuFrFrFrXXVxDejxjxREjxgAWWsmJUzkWWMtjxREjxjxNLVxmCFrzCdsFrFr FrFrFrFrFrWQozryqndsFrFrFrFrFrWQdsFrFrFrFrFrFrEKFrFrFrFrFrzCqnqntXqndsFrFrzCqndsFrFrFrFrWQqnqndsFrFrFrLTjPjPqnsrqnqnqnEqCeaJfHaWVMaJPnqnlaDMPnqnlaaWVMaJfHaWQzWPsrqnqnqnqnjxtXqnUiFrFrFruUeoFrFrFrFrzCtXaEFrFrFrFrFrFrFrFrFrFrFrFrLTgAVxVMMtqnVsqngAWWgWrHjXWWMtqnVsqngAVMVxMtjPqndsFrFx FrFrFrFrFrhzEbqbPnqnhWaEFrFrriFrEKFrFrFrLTNsNshuFrFrFrLTjPgIPdbVjxqndsFrFrWQqndsFrFrFrFrFrWQjphuFrFrFrWQqnqnqnqnqnqwqwEqCeGhDuoRvmaJPnqnqntDqnqnlaaWiNwxDuhjQzVeJqqwqwRcqntXtXqndsFrFrFrRSeoFrFrFrFrWQjxtXjPjPjPjPaEFrFrFrFrFrFrLTqnqnAGVMMtaNjxqngAGLGqGqGqrKMtqnjxqngAVMRdqnqnqwqnaEFr FrFrFrFrFrLTozOiqndsFrzCjPaEFrLTdsFrFrFrVQFrFrFrFrFrFrWQlaZEQqsEjEqnqnaEFrFrzCdsFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnqndsFrFrWQFbgCJuuvaWaJPnqnqnqnqnqnlaaWaJaUgdYaTFhuFrFrFrzCqnjxtXqndsFrFrFrUcMkFrFrFrFrFrzCtXtXtXtXqndsFrFrFrFrFrFrWQqngAVxVMMtqnqnqnqnREuWuWuWREqnqnqnqngAVMVxMtdsFrzCdsFr FrFrFrFrFrWQiiFrWQhuFrWQqwqwdaqwhuFrFrFrEKFrFrFrFrFrFrFrOatteNtXMDsrtXqnrRrRqndsFrFrFrFrFrFrFrFrFrFrFrFrWQjZqnqndsFrFrFrFrFrFrOaaWaJPnqnqnqnqnqnlaaWaJPndsFrFrFrFrFrFrWQqnqwaOqndsFrFrFrFrzCjPjPaEFrFrWQaOaOaOlWqndsFrFrFrFrFrFrFrFrXXVxMbqnqnqnqnqnVsuWuWuWVsqnqnqnqnqnAAVxMtqnjPqndsFr -FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFrFrrbEKFrFrFrFrFrFrFrWQgCgdtXtXtXjxdsUcUczCdsFrFrFrFrFrFrFrFrFrFrFrFrFrFrzCqndsFrFrLTaEFrFrOaaWaJPnqnqngIqnqnlaaWaJPnhuFrFrFrFrFrFrFrEKFrFrzCqnNsrRrRrRqnqnqnqnaEFrFrFrFrFrUcWQqnjPjPjPjPjPjPjPjPgAVxDeqnqnqnqnqnplhVjDRFjOqnqnqnqnqnNLVxMtqnqnqnhuFr +FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFrFrrbEKFrFrFrFrFrFrFrWQgCgdtXtXtXjxdsUcUczCdsFrFrFrFrFrFrFrFrFrFrFrFrFrFrzCqndsFrFrLTaEFrFrOaaWaJPnqnqngIqnqnlaaWaJPnhuFrFrFrFrFrFrFrEKFrFrzCqnNsrRrRrRqnqnqnqnaEFrFrFrFrFrUcWQqnjPjPjPjPjPjPjPjPgAVxDeqnqnqnqnqnplhVApRFjOqnqnqnqnqnNLVxMtqnqnqnhuFr FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFrFrrbWQhWaEFrFrFrFrFrFrFrqWjxjxtXqnqnaEFrzCdsFrFrFrFrFrFrFrFrFrFrFrFrFrFrzCqnqnjPjPqndsFrFrOaaWaJPnqnlaDMPnqnlaaWaJNUFrFrFrFrFrFrFrFrEKFrFrzCdsFrUcUcUczCqnRcqnqnaEFrFrFrFrFrFrzCqnqnqntXtXqnqntXgAVxVMMtKMqnqnqnlaeJfHgyPnKMqnqnqngAVMVxMtqnqnhuFrFr FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFrFrhzFrriEKFrFrFrFrFrFrFrFrWQqnjxqwqwhuFrzCdsFrFrLTaEFrFrFrFrFrFrFrFrFrFrzCqnqnqnqnjphuFrLTlaaWaJmvqnqntDqnqnPHaWaJNUFrFrFrFrFrFrFrFrEKFrFrWQdsFrFrFrFrWQqnjEqnqndsFrFrFrFrFrLTqnqnqnqnjxlWlWlWaOqnAGVMMtqnqnqnqnRGPBBFHmPnqnqnqnqngAVMRdqnqnhuFrFrFx FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrEKFrFrFrFrFrFrFrFrFrzCdsFrFrFrFrzCdsFrLTqndsFrFrFrFrFrFrFrFrFrFrWQqwtXqndsFrFrFrWQlayJaJcimvgIgIgIPHFgaWJgNUFrFrFrFrFrFrLTjPdsFrFrFrzCaEFrFrFrFryuqnqnqwhuFrFrFrFrFrzCsrqnqwqwhuUcUcUcFrXXVxVMMtqngIqnqnlaGBsaNDPnqnqngIqngAVMVxMthuFrFrFrFr FrFrFrFrFrFrlPFrFrFrFrFrFrFrFrFrFrFrFrFrLTNshuFrFrFrFrFrFrFrFrFrzCdsFrFrLTjPqnqnJztXqnqnjPjPjPjPjPJzaEFrFrFrFrFrKYtXeoFrFrFrFrOaaWGhDuDuhpfHqyDuDuhjaJPnaEFrFrFrFrFrzCqnhuFrFrFrzCqnaEFrFrFrWQlWhuFrFrFrFrFrLTjPqnRcUJFrFrFrFrFrFrLTgAVxMbqnlaDMPnqnlanWSRLzPnqnlaDMPnqnAAVxmCFrFrFrFrFr WjWjWjWjWjWjNuWjOHeXeXIRWjWjWjWjWjWjWjWjzhWjWjWjWjWjWjWjWjWjFrFrgxqnhWhWqwqwqwqwldtXqnqwqwlWchqwqwjxdsFrFrFrFrFrzCjxUiFrFrFrLTlaGfjDjDjDdwGqvnjDjDjDDbPndsFrFrFrFrFrzCdsFrFrFrFrWQqnqnaEFrFrFrUcFrFrFrFrFrFrzCqnqnqwhuFrFrFrFrFrLTqngAVxDeTvTvtDTvTvTvAWKGbKTvOxTvtDTvTvNLVxmCFrFrFrFrFr nXnXGvnXnXnXEYnXMisXsXVZnXnXnXGvnXnXnXnXzuGvnXnXnXnXnXnXGvnXEzFrmodsFrFrFrFrFrFrUcKYdsFrFrUcFrFrFrzCdsFrFrFrFrFrzCqndsFrFrFrWQqnPCPCPCPCPCPCPCPCPCPCPCqnhuFrFrFrFrFresdsFrFrFrFrFrzCqnqnjPjPjPaEFrFrFrLTjPjPqnqndsFrFrFrFrFrFrFrqnqnuAVxVxVxVxxRVxVxVxVxxRVxVxVxVxxRVxVxVxVxmCFrFrFrFrFr -FrFrcSFrFrFrlPFrFKaNdsFrLTClClxKClClaEFrEKiJFrFrFrLTClaEiJFrRnKxjEdsFrFrFrFrFrFrFrzCdsFrFrFrFrFrFrzCqnaEFrFrLTjPqnqndsFrFrFrFrzCqnqwqwqnqnWVqnqwqwqwqwhuFrFrFrFrFrFrXzdsFrFrFrFrFrWQqntXtXtXjEqnJzJzJzqnqnqnqwqwhuFrFrFrFrFrFrLTqnqwtXUrUrUrPJTvPJUrUrPJTvPJUrUrPJTvPJUrUrIeqnaEFrFrFrFr -FrLTICaEFrFrlPLTzNqnhuFrOaugVMzOVMAPbbFrzCDfFrFrFrOafHNUiJFrKZeeqnqnaEFrFrLTjPjPjPqnhuFrFrLTjPjPjPqnqnqnjPjPqnqnqnqndsFrFrLTjPqnhuFrFrWQqnqndsFrFrFrFrFrFrFrFrFrFrFrFrEKFrLTjPaEFrFrWQaOaOlWHXlWlWlWaOqwqwhuFrFrFrFrFrLTaEFrLTqnhuFrqlUZUZfTVxVxVxCjfTVxVxVxCjfTVxVxVxCjUZHUqnqnaEFrFrFr -FrzCKuhuFrFrlPWQKudsFrFrOabVVMMvVMWpPnNsqnKujPNsNschSnqnZNFrmSeeqnqnqnjPjPqnqnqnqndsFrFrLTqnqwqwqwqwqwqwqwqwqwqwqwqwhuFrFrzCqnhuFrFrFrOfzCqnqnjPjPjPjPjPjPjPJzCPFrFrFrEKFrgxqndsFrFrFrFrFrUcUcUcUcUcFrFrFrFrFrLTaEFrFrWQqnjPtXdsFrFrqlCMCMCMUrUrUrCMCMUrUrUrCMCMUrUrUrCMCMLbqnqnqnaEFrFr -FrWQlKFrFrFrlPFrwidsFrFrWQartPYHnYilhuFrWQFVhuFrFrFrFrbBlKyqLjzDqwqwlWlWlIqwjpqwqwhuFrFrWQEpFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrzChuFrFrFrFrFrWQqwqnqnqwqnqnqnqnqwaOlWrRrRrRlWrRkQqwhuFrFrFrFrFrFrFrLTjPaEFrFrFrFrLTqnqnaEFrFrWQqnjxdsFrFrKYVsVsVsGoGoGoVsVsGoGoGoVsVsGoGoGoVsVsnsqnqnqnqnaEFr +FrFrcSFrFrFrlPFrFKaNdsFrLTClClxKClClaEFrEKiJFrFrFrLTClaEiJFrRnKxjEdsFrFrFrFrFrFrFrzCdsFrFrFrFrFrFrzCqnaEFrFrLTjPqnqndsFrFrFrFrzCqnqwqwqnqnWVqnqwqwqwqwhuFrFrFrFrFrFrXzdsFrFrFrFrFrWQqntXtXtXjEqnJzJzJzqngIgIqwqwhuFrFrFrFrFrFrLTqnqwtXUrUrUrPJTvPJUrUrPJTvPJUrUrPJTvPJUrUrIeqnaEFrFrFrFr +FrLTICaEFrFrlPLTzNqnhuFrOaugVMzOVMAPbbFrzCDfFrFrFrOafHNUiJFrKZeeqnqnaEFrFrLTjPjPjPqnhuFrFrLTjPjPjPqnqntXjPjPqnqnqnqndsFrFrLTjPqnhuFrFrWQqnqndsFrFrFrFrFrFrFrFrFrFrFrFrEKFrLTjPaEFrFrWQaOaOlWHXlWlWlWaOlujTtJsVFrFrFrFrLTaEFrLTqnhuFrqlUZUZfTVxVxVxCjfTVxVxVxCjfTVxVxVxCjUZHUqnqnaEFrFrFr +FrzCKuhuFrFrlPWQKudsFrFrOabVVMMvVMWpPnNsqnKujPNsNschSnqnZNFrmSeeqnqnqnjPjPqnqnqnqndsFrFrLTqnqwqwqwqwqwaOlWqwqwqwqwqwhuFrFrzCqnhuFrFrFrOfzCqnqnjPjPjPjPjPjPjPJzCPFrFrFrEKFrgxqndsFrFrFrFrFrUcUcUcUcUcFrFrgovQFrLTaEFrFrWQqnjPtXdsFrFrqlCMCMCMUrUrUrCMCMUrUrUrCMCMUrUrUrCMCMLbqnqnqnaEFrFr +FrWQlKFrFrFrlPFrwidsFrFrWQartPYHnYilhuFrWQFVhuFrFrFrFrbBlKyqLjzDqwqwlWlWlIqwjpqwqwhuFrFrWQEpFrFrFrFrFrFrUcFrFrFrFrFrFrFrFrzChuFrFryqFrFrWQqwKMqnqwqnqnqnqnqwaOlWrRrRrRlWrRkQqwhuFrFrFrFrFrFrFrLTjPaEFrFrFrFrLTqnqnaEFrFrWQqnjxdsFrFrKYVsVsVsGoGoGoVsVsGoGoGoVsVsGoGoGoVsVsnsqnqnqnqnaEFr FrFrFrFrFrFrlPLTqnqnaEFrFrFrgoFOvQFrFrLTaEFrFrFrFrFrFrFrFrFrLjhhFrFrUcUcFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrLTdsFrFrFrFrFrFrFrFrWQhuFrWQlIqwhuFrFrUcUcUcUcUcUcFrFrFrFrFrFrFrFrFrFrWQqwqwjPaEFrFrWQlIqwqnaEFrFrWQqwhuFrFrWQSiSiSijujujuSiSijujujuSiSijujujuSiSiqCqwqwqwqwhuFr FrFrFrFrFrFrlPihmLzUiilPlPlPlPlPlPkoVgoziilPlPlPlPlPlPlPlPlPAilvlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPihiilPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPihozlPlPrulPlPihJalPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPlPFrFrFrFrFrFr FrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrWQqwhuFrFrFrFrFrFrFrFrFrFrLjhhFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrLTjPaEFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrtMFrFrFrFrFrFrzCjPjPjPaEFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFrFr diff --git a/maps/atoll/icons/objs/bronze_overhang.dmi b/maps/atoll/icons/objs/bronze_overhang.dmi index 155f011dc2..dbab2ba8a8 100644 Binary files a/maps/atoll/icons/objs/bronze_overhang.dmi and b/maps/atoll/icons/objs/bronze_overhang.dmi differ diff --git a/maps/atoll/sounds/lakeamb.ogg b/maps/atoll/sounds/lakeamb.ogg index 61b49f566d..63492ec254 100644 Binary files a/maps/atoll/sounds/lakeamb.ogg and b/maps/atoll/sounds/lakeamb.ogg differ diff --git a/maps/expedition_vr/aerostat/aerostat_science_outpost.dmm b/maps/expedition_vr/aerostat/aerostat_science_outpost.dmm index 519f4b7283..fb61612cc8 100644 --- a/maps/expedition_vr/aerostat/aerostat_science_outpost.dmm +++ b/maps/expedition_vr/aerostat/aerostat_science_outpost.dmm @@ -1105,7 +1105,7 @@ /turf/simulated/floor/tiled/dark, /area/offmap/aerostat/inside/lobby) "cT" = ( -/obj/machinery/smartfridge/chemistry/virology, +/obj/machinery/smartfridge/virology, /turf/simulated/floor/tiled/white, /area/offmap/aerostat/inside/virology) "cU" = ( diff --git a/maps/groundbase/gb-centcomm.dmm b/maps/groundbase/gb-centcomm.dmm index 4fa63e3b8b..6df7015172 100644 --- a/maps/groundbase/gb-centcomm.dmm +++ b/maps/groundbase/gb-centcomm.dmm @@ -15121,7 +15121,7 @@ /obj/effect/floor_decal/corner/green/border{ dir = 10 }, -/obj/machinery/smartfridge/chemistry/virology, +/obj/machinery/smartfridge/virology, /turf/simulated/floor/tiled/white, /area/centcom/medical) "XE" = ( diff --git a/maps/groundbase/gb-z2.dmm b/maps/groundbase/gb-z2.dmm index ec904a1ef6..f42f987557 100644 --- a/maps/groundbase/gb-z2.dmm +++ b/maps/groundbase/gb-z2.dmm @@ -210,7 +210,6 @@ /turf/simulated/floor/tiled, /area/groundbase/science/robotics) "aw" = ( -/obj/machinery/firework_launcher, /turf/simulated/floor/tiled, /area/groundbase/science/hall) "ax" = ( diff --git a/maps/groundbase/groundbase_defines.dm b/maps/groundbase/groundbase_defines.dm index dabb1bb2a4..2ad85dbff9 100644 --- a/maps/groundbase/groundbase_defines.dm +++ b/maps/groundbase/groundbase_defines.dm @@ -70,12 +70,12 @@ shuttle_docked_message = "The scheduled shuttle to the %dock_name% has arrived. It will depart in approximately %ETD%." shuttle_leaving_dock = "The shuttle has departed. Estimate %ETA% until arrival at %dock_name%." - shuttle_called_message = "A scheduled crew transfer to the %dock_name% is occuring. The shuttle will arrive shortly. Those departing should proceed to deck three, aft within %ETA%." + shuttle_called_message = "A scheduled crew transfer to the %dock_name% is occuring. The shuttle will arrive shortly. Those departing should proceed to the upper level on the west side of the main facility within %ETA%." shuttle_recall_message = "The scheduled crew transfer has been cancelled." shuttle_name = "Crew Transport" emergency_shuttle_docked_message = "The evacuation shuttle has arrived. You have approximately %ETD% to board the shuttle." emergency_shuttle_leaving_dock = "The emergency shuttle has departed. Estimate %ETA% until arrival at %dock_name%." - emergency_shuttle_called_message = "An emergency evacuation has begun, and an off-schedule shuttle has been called. It will arrive at deck three, aft in approximately %ETA%." + emergency_shuttle_called_message = "An emergency evacuation has begun, and an off-schedule shuttle has been called. It will arrive at the upper level on the west side of the main facility in approximately %ETA%." emergency_shuttle_recall_message = "The evacuation shuttle has been recalled." station_networks = list( diff --git a/maps/groundbase/pois/outdoors16.dmm b/maps/groundbase/pois/outdoors16.dmm index ee0a8b6e28..c613a41c91 100644 --- a/maps/groundbase/pois/outdoors16.dmm +++ b/maps/groundbase/pois/outdoors16.dmm @@ -13,27 +13,18 @@ /area/template_noop) "d" = ( /obj/structure/table/wooden_reinforced, +/obj/structure/picnic_blanket_deployed/for_mapping_use{ + desc = "An old and worn picnic blanket. Its colours appear bleached from being outside too much."; + folded_desc = "A worn picnic blanket with a rough texture. One could swear it seems to be covered in strange, otter-like fur"; + name = "weathered picnic blanket" + }, /obj/item/weapon/storage/toolbox/lunchbox/cat/filled{ - pixel_y = 8 - }, -/obj/item/weapon/storage/toolbox/lunchbox/nymph/filled, -/obj/item/clothing/suit/leathercoat{ - desc = "Who would use a leather coat as a tablecloth?!"; - name = "Tablecloth?!"; - pixel_x = 5 - }, -/obj/item/clothing/suit/greatcoat{ - desc = "This great coat appears covered in food! Did... it get stolen and reused as ... ?!"; - name = "Tablecloth?"; - pixel_x = -9 + pixel_x = 6; + pixel_y = 9 }, +/obj/item/weapon/reagent_containers/food/snacks/fruitsalad, /turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, /area/template_noop) -"g" = ( -/obj/effect/decal/cleanable/fruit_smudge, -/obj/item/weapon/storage/mre/random, -/turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow, -/area/template_noop) "h" = ( /obj/structure/table/bench/wooden, /obj/effect/decal/cleanable/filth, @@ -47,16 +38,13 @@ /obj/structure/table/wooden_reinforced, /obj/random/pizzabox, /obj/item/weapon/storage/toolbox/lunchbox/mars/filled{ - pixel_x = -10; + pixel_x = -7; pixel_y = 11 }, -/obj/item/weapon/bedsheet/rd{ - desc = "Is this Nubbins' doing?!"; - name = "Strange tablecloth"; - pixel_x = 11; - pixel_y = 12 +/obj/random/mug{ + pixel_x = 10; + pixel_y = 9 }, -/obj/random/mug, /turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, /area/template_noop) "k" = ( @@ -71,10 +59,6 @@ /obj/effect/decal/cleanable/filth, /turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow, /area/template_noop) -"p" = ( -/obj/random/junk, -/turf/simulated/floor/outdoors/grass/seasonal/nomobs, -/area/template_noop) "s" = ( /obj/structure/table/bench/wooden, /obj/random/mob/wildscugs{ @@ -127,16 +111,15 @@ /area/template_noop) "N" = ( /obj/structure/table/wooden_reinforced, -/obj/item/weapon/bedsheet/hosdouble{ - desc = "Odd, this tablecloth looks... suspiciously like the bedsheets NanoTrasen security staff use!"; - name = "Picnic Blanket" +/obj/item/weapon/storage/toolbox/lunchbox/heart/filled{ + pixel_x = -4; + pixel_y = -6 }, -/obj/item/weapon/bedsheet/hosdouble{ - desc = "Odd, this tablecloth looks... suspiciously like the bedsheets NanoTrasen security staff use!"; - name = "Picnic Blanket"; - pixel_x = 11 +/obj/random/mug{ + pixel_x = 10; + pixel_y = 9 }, -/obj/item/weapon/storage/toolbox/lunchbox/heart/filled, +/obj/effect/decal/cleanable/tomato_smudge, /turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, /area/template_noop) "O" = ( @@ -148,10 +131,6 @@ /obj/random/mug, /turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, /area/template_noop) -"Q" = ( -/obj/random/cigarettes, -/turf/simulated/floor/outdoors/grass/seasonal/nomobs, -/area/template_noop) "S" = ( /obj/structure/table/bench/wooden, /obj/item/weapon/towel/random, @@ -162,7 +141,6 @@ /turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_nosnow, /area/template_noop) "T" = ( -/obj/effect/decal/cleanable/tomato_smudge, /turf/simulated/floor/outdoors/grass/seasonal/notrees_nomobs_lowsnow, /area/template_noop) "Y" = ( @@ -181,18 +159,18 @@ A a T n -n +T Y "} (3,1,1) = {" -Q +A s h J w "} (4,1,1) = {" -L +A N d i @@ -208,7 +186,7 @@ m (6,1,1) = {" L z -g +T k A "} @@ -217,5 +195,5 @@ A A A A -p +A "} diff --git a/maps/stellar_delight/ship_centcom.dmm b/maps/stellar_delight/ship_centcom.dmm index a29f00e50f..00a1c8c203 100644 --- a/maps/stellar_delight/ship_centcom.dmm +++ b/maps/stellar_delight/ship_centcom.dmm @@ -9664,7 +9664,7 @@ /obj/effect/floor_decal/corner/green/border{ dir = 10 }, -/obj/machinery/smartfridge/chemistry/virology, +/obj/machinery/smartfridge/virology, /turf/simulated/floor/tiled/white, /area/centcom/medical) "KJ" = ( diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm index 9b433defd3..569d141810 100644 --- a/maps/stellar_delight/stellar_delight1.dmm +++ b/maps/stellar_delight/stellar_delight1.dmm @@ -296,10 +296,10 @@ dir = 8; icon_state = "pipe-c" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 4 }, /turf/simulated/floor/tiled/milspec, @@ -2461,13 +2461,6 @@ }, /turf/simulated/floor, /area/maintenance/stellardelight/substation/exploration) -"ey" = ( -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "1-2" - }, -/turf/simulated/wall/bay/purple, -/area/stellardelight/deck1/exploration) "ez" = ( /obj/structure/table/reinforced, /obj/item/clothing/gloves/sterile/latex, @@ -3526,30 +3519,6 @@ "gQ" = ( /turf/simulated/wall/bay/brown, /area/stellardelight/deck1/oreprocessing) -"gS" = ( -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "1-8" - }, -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, -/obj/effect/floor_decal/steeldecal/steel_decals4{ - dir = 6 - }, -/obj/effect/floor_decal/steeldecal/steel_decals4{ - dir = 1 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/explobriefing) "gT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -5139,19 +5108,21 @@ "jZ" = ( /obj/structure/cable/green{ color = "#42038a"; - icon_state = "4-8" + icon_state = "2-4" }, /obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 + dir = 4; + icon_state = "pipe-c" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 + dir = 6 + }, +/obj/effect/floor_decal/steeldecal/steel_decals6, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 6 }, /turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/area/stellardelight/deck1/explobriefing) "ka" = ( /obj/machinery/portable_atmospherics/canister/nitrogen, /obj/effect/floor_decal/industrial/warning{ @@ -6080,15 +6051,6 @@ }, /turf/simulated/floor/tiled/monotile, /area/janitor) -"md" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/bed/chair/backed_red{ - dir = 8 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) "me" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -6403,18 +6365,6 @@ }, /turf/simulated/floor/reinforced, /area/stellardelight/deck1/shuttlebay) -"mH" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/bed/chair/backed_red{ - dir = 4 - }, -/obj/machinery/firealarm/angled{ - dir = 8 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) "mI" = ( /obj/machinery/door/firedoor/glass/hidden/steel{ dir = 1 @@ -6468,12 +6418,11 @@ /turf/simulated/floor/tiled/techmaint, /area/stellardelight/deck1/fore) "mP" = ( -/obj/machinery/computer/ship/navigation/telescreen{ - pixel_x = -32 +/obj/machinery/light/small{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/explobriefing) +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "mQ" = ( /obj/machinery/door/firedoor/glass/hidden/steel{ dir = 8 @@ -7161,20 +7110,12 @@ /turf/simulated/floor/tiled/white, /area/medical/patient_wing) "oq" = ( -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/computer/ship/navigation/telescreen{ + pixel_x = -32 }, -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "1-8" - }, -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "1-4" - }, -/turf/simulated/floor/airless, -/area/stellardelight/deck1/exterior) +/turf/simulated/floor/tiled/milspec, +/area/stellardelight/deck1/explobriefing) "or" = ( /obj/structure/window/reinforced/full, /obj/structure/window/reinforced{ @@ -7516,11 +7457,14 @@ /turf/simulated/floor/tiled/dark, /area/security/armoury) "pd" = ( -/obj/machinery/computer/ship/navigation/telescreen{ - pixel_x = -64 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/obj/structure/closet, +/obj/random/maintenance, +/obj/random/maintenance, +/obj/random/maintenance, +/obj/random/maintenance/clean, +/obj/random/maintenance/clean, +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "pe" = ( /turf/simulated/floor/tiled/eris/steel/brown_platform, /area/stellardelight/deck1/miningshuttle) @@ -8074,10 +8018,9 @@ /area/stellardelight/deck1/explobriefing) "ql" = ( /obj/structure/table/woodentable, -/obj/machinery/light{ - dir = 1 +/obj/machinery/microwave{ + pixel_y = 7 }, -/obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/explobriefing) "qm" = ( @@ -8646,14 +8589,24 @@ "rB" = ( /obj/structure/cable/green{ color = "#42038a"; - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/light/small{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/machinery/door/airlock/angled_bay/hatch{ + dir = 4; + door_color = "#ffffff"; + name = "maintenance access"; + req_one_access = null; + stripe_color = "#5a19a8" + }, /turf/simulated/floor, /area/maintenance/stellardelight/deck1/exploration) "rC" = ( @@ -8745,12 +8698,20 @@ /turf/simulated/floor/tiled/steel_ridged, /area/medical/morgue) "rM" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 9 +/obj/structure/cable/green{ + color = "#42038a"; + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/obj/structure/cable/green{ + color = "#42038a"; + icon_state = "1-4" + }, +/obj/structure/cable/green{ + color = "#42038a"; + icon_state = "1-8" + }, +/turf/simulated/floor/airless, +/area/stellardelight/deck1/exterior) "rN" = ( /obj/structure/cable/green{ icon_state = "1-2" @@ -9458,10 +9419,8 @@ /turf/simulated/floor/airless, /area/stellardelight/deck1/exterior) "tm" = ( -/obj/structure/dogbed, -/mob/living/simple_mob/animal/passive/tindalos/twigs, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/turf/simulated/wall/bay/r_wall/purple, +/area/maintenance/stellardelight/deck1/exploration) "tn" = ( /obj/machinery/light{ dir = 4 @@ -9838,12 +9797,6 @@ }, /turf/simulated/floor/tiled/techmaint, /area/stellardelight/deck1/port) -"uf" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) "ug" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 @@ -9970,11 +9923,6 @@ "uw" = ( /turf/space/internal_edge/left, /area/stellardelight/deck1/starboard) -"ux" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) "uy" = ( /obj/structure/table/rack/shelf/steel, /obj/item/weapon/gun/energy/ionrifle/pistol, @@ -10289,11 +10237,9 @@ /turf/simulated/floor/tiled/white, /area/crew_quarters/toilet) "ve" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/obj/structure/closet/emcloset, +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "vf" = ( /obj/machinery/door/firedoor/glass, /obj/structure/cable/yellow{ @@ -10777,9 +10723,12 @@ "wk" = ( /obj/structure/cable/green{ color = "#42038a"; - icon_state = "1-2" + icon_state = "0-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/power/apc/angled{ + dir = 8 + }, /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/explobriefing) "wm" = ( @@ -10813,12 +10762,13 @@ /turf/simulated/floor/tiled/eris/steel/cargo, /area/stellardelight/deck1/mining) "wq" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/alarm/angled{ - dir = 4 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/explobriefing) +/obj/structure/table/rack, +/obj/random/maintenance/cargo, +/obj/random/maintenance/cargo, +/obj/random/maintenance/cargo, +/obj/random/maintenance/clean, +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "ws" = ( /obj/structure/cable/pink{ icon_state = "4-8" @@ -13197,12 +13147,6 @@ /obj/effect/landmark/start/visitor, /turf/simulated/floor/wood, /area/library) -"By" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) "Bz" = ( /obj/structure/cable/green{ icon_state = "1-4" @@ -13570,15 +13514,13 @@ /turf/simulated/floor/wood, /area/library) "Cl" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/camera/network/command{ - dir = 4 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/explobriefing) +/obj/structure/table/rack/shelf, +/obj/random/contraband, +/obj/random/maintenance/research, +/obj/random/maintenance, +/obj/random/maintenance, +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "Cm" = ( /obj/effect/floor_decal/industrial/outline/yellow, /obj/structure/disposalpipe/up{ @@ -13782,13 +13724,12 @@ /turf/simulated/floor/tiled/eris/white/bluecorner, /area/medical/virology) "CK" = ( -/obj/machinery/button/remote/blast_door{ - id = "explowindowlockdown"; - name = "Window Lockdown"; - pixel_y = 25 +/obj/item/device/radio/intercom{ + dir = 1; + pixel_y = 24 }, /turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/area/stellardelight/deck1/explobriefing) "CL" = ( /obj/structure/stairs/spawner/north, /obj/structure/window/reinforced{ @@ -13869,24 +13810,6 @@ }, /turf/simulated/floor/tiled/techmaint, /area/stellardelight/deck1/aft) -"CW" = ( -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "2-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 4; - icon_state = "pipe-c" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 8 - }, -/obj/effect/floor_decal/steeldecal/steel_decals6, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/explobriefing) "CX" = ( /obj/effect/floor_decal/chapel{ dir = 1 @@ -14314,6 +14237,14 @@ }, /turf/simulated/floor/tiled/techfloor, /area/rnd/workshop) +"DX" = ( +/obj/structure/closet/crate, +/obj/random/maintenance/clean, +/obj/random/maintenance/cargo, +/obj/random/maintenance/cargo, +/obj/random/maintenance, +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "DY" = ( /obj/structure/railing/grey{ dir = 4 @@ -14974,12 +14905,12 @@ "Fy" = ( /obj/structure/flora/pottedplant/orientaltree, /obj/machinery/light, -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, /obj/machinery/camera/network/command{ dir = 9 }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 1 + }, /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/explobriefing) "Fz" = ( @@ -15634,18 +15565,11 @@ /turf/simulated/floor, /area/stellardelight/deck1/explobriefing) "Hf" = ( -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/bed/chair/backed_red{ - dir = 4 - }, -/obj/item/device/radio/intercom{ - dir = 8; - pixel_x = -24 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/obj/structure/table/rack/shelf, +/obj/random/maintenance/research, +/obj/random/maintenance, +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "Hg" = ( /obj/structure/cable/green{ icon_state = "4-8" @@ -15883,11 +15807,16 @@ /turf/simulated/floor/tiled/dark, /area/security/lobby) "HG" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 9 +/obj/structure/table/woodentable, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/unary/vent_pump/on, +/obj/machinery/camera/network/command{ + dir = 4 }, /turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/area/stellardelight/deck1/explobriefing) "HH" = ( /obj/machinery/door/firedoor/glass, /obj/structure/window/bay/reinforced, @@ -15964,13 +15893,26 @@ /turf/simulated/floor/tiled/eris/white/bluecorner, /area/medical/exam_room) "HS" = ( -/obj/structure/table/woodentable, -/obj/machinery/microwave{ - pixel_y = 7 +/obj/structure/cable/green{ + color = "#42038a"; + icon_state = "1-8" }, -/obj/item/device/radio/intercom{ - dir = 1; - pixel_y = 24 +/obj/structure/cable/green{ + color = "#42038a"; + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply, +/obj/effect/floor_decal/steeldecal/steel_decals4{ + dir = 6 + }, +/obj/effect/floor_decal/steeldecal/steel_decals4{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 8 }, /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/explobriefing) @@ -16767,11 +16709,15 @@ /turf/simulated/floor/tiled/eris/white/bluecorner, /area/stellardelight/deck1/lowermed) "Jz" = ( -/obj/machinery/newscaster{ - pixel_y = 28 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/obj/structure/closet, +/obj/random/contraband, +/obj/random/maintenance, +/obj/random/maintenance, +/obj/random/maintenance, +/obj/random/maintenance/cargo, +/obj/random/maintenance/research, +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "JA" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -17554,16 +17500,16 @@ /turf/simulated/floor/tiled/techmaint, /area/stellardelight/deck1/starboard) "Lp" = ( -/obj/machinery/power/apc/angled{ - dir = 8 - }, -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "0-2" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/explobriefing) +/obj/structure/closet, +/obj/random/maintenance, +/obj/random/maintenance, +/obj/random/maintenance, +/obj/random/maintenance, +/obj/random/maintenance, +/obj/random/maintenance/cargo, +/obj/random/maintenance/research, +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "Lq" = ( /obj/structure/cable/green{ color = "#42038a"; @@ -17807,25 +17753,11 @@ /turf/simulated/floor/tiled/dark, /area/security/security_cell_hallway) "LO" = ( -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ +/obj/machinery/light/small{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "2-8" - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "LP" = ( /obj/structure/table/standard, /obj/machinery/cell_charger, @@ -18832,12 +18764,15 @@ /turf/simulated/floor/tiled/dark, /area/rnd/xenobiology) "NY" = ( -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "1-2" +/obj/machinery/door/airlock/angled_bay/hatch{ + dir = 4; + door_color = "#e6ab22"; + name = "Exploration Substation"; + req_one_access = list(10); + stripe_color = "#e6ab22" }, -/turf/simulated/wall/bay/r_wall/steel, -/area/stellardelight/deck1/exploration) +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "NZ" = ( /obj/effect/floor_decal/steeldecal/steel_decals4{ dir = 5 @@ -19499,9 +19434,14 @@ /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/exploration) "PE" = ( -/obj/machinery/alarm/angled, +/obj/effect/floor_decal/steeldecal/steel_decals6{ + dir = 4 + }, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/area/stellardelight/deck1/explobriefing) "PF" = ( /obj/structure/cable/green{ icon_state = "4-8" @@ -20604,8 +20544,8 @@ /turf/simulated/floor/tiled/eris, /area/rnd/xenobiology/xenoflora) "RS" = ( -/turf/simulated/wall/bay/purple, -/area/stellardelight/deck1/explobriefing) +/turf/simulated/wall/bay/steel, +/area/maintenance/stellardelight/deck1/exploration) "RT" = ( /obj/machinery/door/firedoor/glass, /obj/structure/cable/white{ @@ -20833,11 +20773,13 @@ /turf/simulated/floor, /area/maintenance/stellardelight/substation/security) "Sn" = ( -/obj/structure/flora/pottedplant/orientaltree, -/obj/machinery/light, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 1 +/obj/structure/dogbed, +/mob/living/simple_mob/animal/passive/tindalos/twigs, +/obj/structure/cable/green{ + color = "#42038a"; + icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/explobriefing) "Sq" = ( @@ -21422,27 +21364,10 @@ /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/explobriefing) "TD" = ( -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ - dir = 1 - }, -/obj/effect/floor_decal/steeldecal/steel_decals4{ - dir = 8 - }, -/obj/effect/floor_decal/steeldecal/steel_decals4{ - dir = 5 - }, +/obj/structure/flora/pottedplant/orientaltree, +/obj/machinery/light, /turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/area/stellardelight/deck1/explobriefing) "TE" = ( /obj/effect/floor_decal/milspec/color/orange/half, /turf/simulated/floor/tiled/dark, @@ -21545,13 +21470,6 @@ }, /turf/simulated/floor/tiled/techmaint, /area/stellardelight/deck1/aft) -"TP" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/effect/floor_decal/steeldecal/steel_decals6{ - dir = 4 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/explobriefing) "TQ" = ( /obj/structure/cable/green{ icon_state = "1-8" @@ -21568,24 +21486,13 @@ /turf/simulated/floor, /area/maintenance/stellardelight/deck1/starboardcent) "TR" = ( -/obj/structure/cable/green{ - color = "#42038a"; - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/obj/effect/floor_decal/steeldecal/steel_decals6{ - dir = 8 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/obj/structure/table/rack, +/obj/random/maintenance/cargo, +/obj/random/maintenance/cargo, +/obj/random/maintenance/clean, +/obj/random/maintenance/clean, +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "TS" = ( /obj/random/maintenance/security, /obj/random/maintenance/security, @@ -21834,11 +21741,12 @@ /turf/simulated/floor/tiled/milspec, /area/stellardelight/deck1/explobriefing) "Up" = ( -/obj/machinery/status_display{ - pixel_y = 32 - }, -/turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/explobriefing) +/obj/structure/table/rack/shelf, +/obj/random/medical, +/obj/random/medical, +/obj/random/maintenance, +/turf/simulated/floor, +/area/maintenance/stellardelight/deck1/exploration) "Uq" = ( /obj/structure/cable/pink{ icon_state = "1-2" @@ -23491,14 +23399,9 @@ /turf/simulated/floor/tiled/techfloor, /area/stellardelight/deck1/researchserver) "XH" = ( -/obj/machinery/status_display{ - pixel_y = 32 - }, -/obj/effect/floor_decal/steeldecal/steel_decals6{ - dir = 1 - }, +/obj/machinery/alarm/angled, /turf/simulated/floor/tiled/milspec, -/area/stellardelight/deck1/exploration) +/area/stellardelight/deck1/explobriefing) "XJ" = ( /obj/structure/disposalpipe/segment, /obj/effect/floor_decal/milspec/color/emerald/half{ @@ -30669,7 +30572,7 @@ iU iU iU KZ -vT +mP tE Jo BP @@ -30677,7 +30580,7 @@ Cc gw xw vT -Gy +DX ra bD vF @@ -30813,13 +30716,13 @@ um In wm Ag +wm Ly wm wm -rB wm Np -Oz +vT ra RF vF @@ -30953,16 +30856,16 @@ KD KP um if -WM -WM -WM -WM -WM -WM -WM -XD -WM -nk +RS +RS +NY +RS +RS +RS +RS +rB +RS +ra RF vF bD @@ -31095,16 +30998,16 @@ ng cC um if -WM +RS Cl -wq +vT mP Lp -wk -sT -gS -Sn -nk +RS +wq +if +Gy +ra bD hE JE @@ -31237,18 +31140,18 @@ um Jp um if -WM -Rz -Rz -Uo -kg -kg -kg -ji -kO -He -JE -en +RS +Hf +vT +vT +Jz +RS +TR +if +ve +ra +RF +vF uq RF vF @@ -31379,16 +31282,16 @@ Mn PL DQ XM -WM +RS Up -Rz -TC -zZ -yP -zZ -OB -Rz -ny +vT +vT +pd +RS +LO +if +pd +ra bD vF uq @@ -31521,16 +31424,16 @@ Ua Ua Ua Ec +RS +tm WM -HS -Rz -TC -oZ -Zh -rt -OB -Rz -ny +WM +WM +WM +WM +XD +WM +nk uq vF uq @@ -31663,16 +31566,16 @@ ex Pu Ua Ec -WM -Rz -Rz -NA -An -An -An -sN -Rz -ny +Jz +tm +HG +oq +wk +Sn +sT +HS +TD +nk bD vF uq @@ -31805,16 +31708,16 @@ fQ nl MV gt -WM +Oz +tm ql -TP -CW -Fx -fe -qk -aC -Fy -nk +Rz +Rz +Rz +Rz +sN +Rz +ny bD vF uq @@ -31949,16 +31852,16 @@ pC pC pC pC -vy -mW -RS -RS -RS -RS -RS -nk -RF -vF +Rz +Uo +kg +kg +kg +ji +kO +He +JE +rM uq RF vF @@ -32092,13 +31995,13 @@ nd Nx pC XH -TR -WH -mH -WH -WH -Hf -LZ +TC +zZ +yP +zZ +OB +Rz +nk bD hE JE @@ -32234,13 +32137,13 @@ ZQ sO pC CK -jZ -DO -uf -DO -pd -ve -uB +TC +oZ +Zh +rt +OB +Rz +ny uq vF bD @@ -32375,14 +32278,14 @@ tY tY zK pC -By -TD -ux -rM -Qt -Qt -HG -uB +Rz +NA +An +An +An +sN +Rz +ny uq vF uq @@ -32519,12 +32422,12 @@ eJ pC PE jZ -PC -PC -PC -md -tm -LZ +Fx +fe +qk +aC +Fy +nk bD vF uq @@ -32659,16 +32562,16 @@ AD UR xk pC -Jz -LO -ey -ey -ey -ey -ey -NY -JE -oq +vy +mW +WM +WM +WM +WM +WM +nk +RF +vF uq uq uq @@ -32803,10 +32706,10 @@ tu pC zL SE +Dt vz WH WH -WH gh uB bD @@ -33087,7 +32990,7 @@ Pw DO iQ KU -PC +DO PC lw PC diff --git a/maps/submaps/admin_use_vr/dhael_centcom.dmm b/maps/submaps/admin_use_vr/dhael_centcom.dmm index 0e66e67a78..87cd723922 100644 --- a/maps/submaps/admin_use_vr/dhael_centcom.dmm +++ b/maps/submaps/admin_use_vr/dhael_centcom.dmm @@ -5726,7 +5726,7 @@ /obj/effect/floor_decal/corner/green/border{ dir = 10 }, -/obj/machinery/smartfridge/chemistry/virology, +/obj/machinery/smartfridge/virology, /turf/unsimulated/floor/steel{ icon_state = "white" }, diff --git a/maps/tether/submaps/tether_centcom.dmm b/maps/tether/submaps/tether_centcom.dmm index 3333aeb76d..a9df0402f5 100644 --- a/maps/tether/submaps/tether_centcom.dmm +++ b/maps/tether/submaps/tether_centcom.dmm @@ -9700,7 +9700,7 @@ /obj/effect/floor_decal/corner/green/border{ dir = 10 }, -/obj/machinery/smartfridge/chemistry/virology, +/obj/machinery/smartfridge/virology, /turf/simulated/floor/tiled/white, /area/centcom/medical) "KJ" = ( diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index 44d8584302..e078c7644d 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -8980,7 +8980,6 @@ /area/tether/surfacebase/surface_one_hall) "aoR" = ( /obj/machinery/light/small, -/obj/machinery/firework_launcher, /turf/simulated/floor/tiled, /area/rnd/hardstorage) "aoS" = ( diff --git a/tgui/docs/tgui-for-custom-html-popups.md b/tgui/docs/tgui-for-custom-html-popups.md index f25060e9fa..f7efffbe08 100644 --- a/tgui/docs/tgui-for-custom-html-popups.md +++ b/tgui/docs/tgui-for-custom-html-popups.md @@ -193,7 +193,7 @@ To receive it in DM, you must register a delegate proc (callback) that will rece ```dm /datum/my_object/proc/initialize() // ... - window.subscribe(src, .proc/on_message) + window.subscribe(src, PROC_REF(on_message)) /datum/my_object/proc/on_message(type, payload) if (type == "click") process_button_click(payload["button"]) diff --git a/tgui/packages/tgui/components/index.js b/tgui/packages/tgui/components/index.js index fa613161ea..6e117bf838 100644 --- a/tgui/packages/tgui/components/index.js +++ b/tgui/packages/tgui/components/index.js @@ -30,6 +30,7 @@ export { LabeledControls } from './LabeledControls'; export { LabeledList } from './LabeledList'; export { MenuBar } from './MenuBar'; export { Modal } from './Modal'; +export { NanoMap } from './NanoMap'; export { NoticeBox } from './NoticeBox'; export { NumberInput } from './NumberInput'; export { ProgressBar } from './ProgressBar'; diff --git a/tgui/packages/tgui/constants.test.ts b/tgui/packages/tgui/constants.test.ts index 953fc2dce5..c48b03a5da 100644 --- a/tgui/packages/tgui/constants.test.ts +++ b/tgui/packages/tgui/constants.test.ts @@ -3,8 +3,23 @@ import { getGasColor, getGasFromId, getGasLabel } from './constants'; describe('gas helper functions', () => { it('should get the proper gas label', () => { - const gasId = 'n2o'; + // Testing for alphabetic gas id + const gasId = 'oxygen'; const gasLabel = getGasLabel(gasId); + expect(gasLabel).toBe('Oâ‚‚'); + }); + + it('should get the proper gas label', () => { + // Testing for underscore gas id + const gasId = 'nitrous_oxide'; + const gasLabel = getGasLabel(gasId); + expect(gasLabel).toBe('Nâ‚‚O'); + }); + + it('should get the proper gas label', () => { + // Testing for wrong capitalization of two word gas + const gasId = 'nitrous oxide'; + const gasLabel = getGasLabel(gasId); // This should set to Nitrous Oxide before checking expect(gasLabel).toBe('Nâ‚‚O'); }); @@ -23,7 +38,7 @@ describe('gas helper functions', () => { }); it('should get the proper gas color', () => { - const gasId = 'n2o'; + const gasId = 'nitrous_oxide'; const gasColor = getGasColor(gasId); expect(gasColor).toBe('red'); @@ -37,11 +52,11 @@ describe('gas helper functions', () => { }); it('should return the gas object if found', () => { - const gasId = 'n2o'; + const gasId = 'nitrous_oxide'; const gas = getGasFromId(gasId); expect(gas).toEqual({ - id: 'n2o', + id: 'nitrous_oxide', // path: '/datum/gas/antinoblium', name: 'Nitrous Oxide', label: 'Nâ‚‚O', diff --git a/tgui/packages/tgui/constants.ts b/tgui/packages/tgui/constants.ts index 3c2f3b94a3..f4cb574dbb 100644 --- a/tgui/packages/tgui/constants.ts +++ b/tgui/packages/tgui/constants.ts @@ -182,6 +182,9 @@ export const RADIO_CHANNELS = [ }, ] as const; +/* +Entries must match /code/defines/gases.dm entries. +*/ const GASES = [ { 'id': 'oxygen', @@ -190,13 +193,13 @@ const GASES = [ 'color': 'blue', }, { - 'id': 'n2', + 'id': 'nitrogen', 'name': 'Nitrogen', 'label': 'Nâ‚‚', - 'color': 'red', + 'color': 'green', }, { - 'id': 'carbon dioxide', + 'id': 'carbon_dioxide', 'name': 'Carbon Dioxide', 'label': 'COâ‚‚', 'color': 'grey', @@ -208,65 +211,17 @@ const GASES = [ 'color': 'pink', }, { - 'id': 'water_vapor', - 'name': 'Water Vapor', - 'label': 'Hâ‚‚O', - 'color': 'grey', - }, - { - 'id': 'nob', - 'name': 'Hyper-noblium', - 'label': 'Hyper-nob', + 'id': 'volatile_fuel', + 'name': 'Volatile Fuel', + 'label': 'EXP', 'color': 'teal', }, { - 'id': 'n2o', + 'id': 'nitrous_oxide', 'name': 'Nitrous Oxide', 'label': 'Nâ‚‚O', 'color': 'red', }, - { - 'id': 'no2', - 'name': 'Nitryl', - 'label': 'NOâ‚‚', - 'color': 'brown', - }, - { - 'id': 'tritium', - 'name': 'Tritium', - 'label': 'Tritium', - 'color': 'green', - }, - { - 'id': 'bz', - 'name': 'BZ', - 'label': 'BZ', - 'color': 'purple', - }, - { - 'id': 'stim', - 'name': 'Stimulum', - 'label': 'Stimulum', - 'color': 'purple', - }, - { - 'id': 'pluox', - 'name': 'Pluoxium', - 'label': 'Pluoxium', - 'color': 'blue', - }, - { - 'id': 'miasma', - 'name': 'Miasma', - 'label': 'Miasma', - 'color': 'olive', - }, - { - 'id': 'hydrogen', - 'name': 'Hydrogen', - 'label': 'Hâ‚‚', - 'color': 'white', - }, { 'id': 'other', 'name': 'Other', @@ -290,13 +245,18 @@ const GASES = [ // VOREStation Edit End // Returns gas label based on gasId +// Checks GASES for both id (all chars lowercase) +// and name (each word start capitalized, to match standards in code\defines\gases.dm) export const getGasLabel = (gasId: string, fallbackValue?: string) => { if (!gasId) return fallbackValue || 'None'; - const gasSearchString = gasId.toLowerCase(); + const gasSearchId = gasId.toLowerCase(); + const gasSearchName = gasId.replace(/(^\w{1})|(\s+\w{1})/g, (letter) => + letter.toUpperCase() + ); for (let idx = 0; idx < GASES.length; idx++) { - if (GASES[idx].id === gasSearchString) { + if (GASES[idx].id === gasSearchId || GASES[idx].name === gasSearchName) { return GASES[idx].label; } } @@ -305,13 +265,18 @@ export const getGasLabel = (gasId: string, fallbackValue?: string) => { }; // Returns gas color based on gasId +// Checks GASES for both id (all chars lowercase) +// and name (each word start capitalized, to match standards in code\defines\gases.dm) export const getGasColor = (gasId: string) => { if (!gasId) return 'black'; - const gasSearchString = gasId.toLowerCase(); + const gasSearchId = gasId.toLowerCase(); + const gasSearchName = gasId.replace(/(^\w{1})|(\s+\w{1})/g, (letter) => + letter.toUpperCase() + ); for (let idx = 0; idx < GASES.length; idx++) { - if (GASES[idx].id === gasSearchString) { + if (GASES[idx].id === gasSearchId || GASES[idx].name === gasSearchName) { return GASES[idx].color; } } @@ -320,13 +285,18 @@ export const getGasColor = (gasId: string) => { }; // Returns gas object based on gasId +// Checks GASES for both id (all chars lowercase) +// and name (each word start capitalized, to match standards in code\defines\gases.dm) export const getGasFromId = (gasId: string): Gas | undefined => { if (!gasId) return; - const gasSearchString = gasId.toLowerCase(); + const gasSearchId = gasId.toLowerCase(); + const gasSearchName = gasId.replace(/(^\w{1})|(\s+\w{1})/g, (letter) => + letter.toUpperCase() + ); for (let idx = 0; idx < GASES.length; idx++) { - if (GASES[idx].id === gasSearchString) { + if (GASES[idx].id === gasSearchId || GASES[idx].name === gasSearchName) { return GASES[idx]; } } diff --git a/tgui/packages/tgui/hotkeys.ts b/tgui/packages/tgui/hotkeys.ts index f7176bd003..6e945cf4eb 100644 --- a/tgui/packages/tgui/hotkeys.ts +++ b/tgui/packages/tgui/hotkeys.ts @@ -103,14 +103,14 @@ const handlePassthrough = (key: KeyEvent) => { // KeyDown if (key.isDown() && !keyState[byondKeyCode]) { keyState[byondKeyCode] = true; - const command = `KeyDown "${byondKeyCode}"`; + const command = `TguiKeyDown "${byondKeyCode}"`; logger.debug(command); return Byond.command(command); } // KeyUp if (key.isUp() && keyState[byondKeyCode]) { keyState[byondKeyCode] = false; - const command = `KeyUp "${byondKeyCode}"`; + const command = `TguiKeyUp "${byondKeyCode}"`; logger.debug(command); return Byond.command(command); } @@ -139,7 +139,7 @@ export const releaseHeldKeys = () => { if (keyState[byondKeyCode]) { keyState[byondKeyCode] = false; logger.log(`releasing key "${byondKeyCode}"`); - Byond.command(`KeyUp "${byondKeyCode}"`); + Byond.command(`TguiKeyUp "${byondKeyCode}"`); } } }; diff --git a/tgui/packages/tgui/interfaces/Biogenerator.js b/tgui/packages/tgui/interfaces/Biogenerator.js index d6a56d82de..dc47936573 100644 --- a/tgui/packages/tgui/interfaces/Biogenerator.js +++ b/tgui/packages/tgui/interfaces/Biogenerator.js @@ -3,7 +3,6 @@ import { Fragment } from 'inferno'; import { useBackend, useLocalState } from '../backend'; import { Box, Button, Collapsible, Dropdown, Flex, Input, Section } from '../components'; import { Window } from '../layouts'; -import { refocusLayout } from '../layouts'; const sortTypes = { 'Alphabetical': (a, b) => a - b, @@ -90,7 +89,7 @@ const BiogeneratorItems = (props, context) => { }); return ( -
refocusLayout()}> +
{has_contents ? ( contents ) : ( diff --git a/tgui/packages/tgui/interfaces/CasinoPrizeDispenser.js b/tgui/packages/tgui/interfaces/CasinoPrizeDispenser.js index 7ff2730960..d47948d4e6 100644 --- a/tgui/packages/tgui/interfaces/CasinoPrizeDispenser.js +++ b/tgui/packages/tgui/interfaces/CasinoPrizeDispenser.js @@ -3,7 +3,6 @@ import { Fragment } from 'inferno'; import { useBackend, useLocalState } from '../backend'; import { Box, Button, Collapsible, Dropdown, Flex, Input, Section } from '../components'; import { Window } from '../layouts'; -import { refocusLayout } from '../layouts'; const sortTypes = { 'Alphabetical': (a, b) => a - b, @@ -112,7 +111,7 @@ const CasinoPrizeDispenserItems = (props, context) => { }); return ( -
refocusLayout()}> +
{has_contents ? ( contents ) : ( diff --git a/tgui/packages/tgui/interfaces/ChemDispenser.js b/tgui/packages/tgui/interfaces/ChemDispenser.js index ee362d6ddb..edfa04b55c 100644 --- a/tgui/packages/tgui/interfaces/ChemDispenser.js +++ b/tgui/packages/tgui/interfaces/ChemDispenser.js @@ -26,24 +26,19 @@ const ChemDispenserSettings = (properties, context) => {
- - {dispenseAmounts.map((a, i) => ( - -