mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-27 07:08:55 +01:00
Merge branch 'CHOMPStation2:master' into BaseBlep
This commit is contained in:
@@ -289,6 +289,15 @@ CREATE TABLE IF NOT EXISTS `vr_player_hours` (
|
||||
|
||||
-- Data exporting was unselected.
|
||||
|
||||
-- CHOMPedit Start - Mentors Database Table
|
||||
CREATE TABLE IF NOT EXISTS `erro_mentor` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`ckey` varchar(32) NOT NULL,
|
||||
`mentor` int(16) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT;
|
||||
-- CHOMPedit End
|
||||
|
||||
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */;
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -5,6 +5,7 @@
|
||||
#define NUM_E 2.71828183
|
||||
|
||||
#define SQRT_2 (1.41421356237) //CHOMPEDIT
|
||||
#define ONE_OVER_SQRT_2 (0.707106781188095) //CHOMPEDIT ADDITION - not 1/sqrt(2), instead it is 1/SQRT_2 (1/1.41421356237)
|
||||
#define M_PI (3.14159265)
|
||||
#define INFINITY (1.#INF) //closer then enough
|
||||
|
||||
@@ -17,6 +18,7 @@
|
||||
#define TICK_USAGE_TO_MS(starting_tickusage) (TICK_DELTA_TO_MS(world.tick_usage - starting_tickusage))
|
||||
|
||||
#define PERCENT(val) (round((val)*100, 0.1))
|
||||
#define CLAMP01(x) clamp(x, 0, 1)
|
||||
|
||||
//time of day but automatically adjusts to the server going into the next day within the same round.
|
||||
//for when you need a reliable time number that doesn't depend on byond time.
|
||||
|
||||
+12
-2
@@ -439,7 +439,12 @@ GLOBAL_LIST_EMPTY(##LIST_NAME);\
|
||||
#define VOLUME_CHANNEL_DOORS "Doors"
|
||||
#define VOLUME_CHANNEL_INSTRUMENTS "Instruments"
|
||||
#define VOLUME_CHANNEL_WEATHER "Weather"
|
||||
#define VOLUME_CHANNEL_SPECIES_SOUNDS "Species Sounds"
|
||||
#define VOLUME_CHANNEL_SPECIES_SOUNDS "Species Sounds (Verbal Injury Feedback)"
|
||||
#define VOLUME_CHANNEL_HUD_WARNINGS "SS13 HUD (Clientside-only sounds)"
|
||||
#define VOLUME_CHANNEL_DEATH_SOUNDS "Death Sounds"
|
||||
#define VOLUME_CHANNEL_INJURY_SOUNDS "Mob Injury Sounds (Non-Verbal Feedback)"
|
||||
#define VOLUME_CHANNEL_MACHINERY "Machinery Noises"
|
||||
#define VOLUME_CHANNEL_MACHINERY_IDLE "Machinery Idle Noises"
|
||||
|
||||
// Make sure you update this or clients won't be able to adjust the channel
|
||||
GLOBAL_LIST_INIT(all_volume_channels, list(
|
||||
@@ -450,7 +455,12 @@ GLOBAL_LIST_INIT(all_volume_channels, list(
|
||||
VOLUME_CHANNEL_DOORS,
|
||||
VOLUME_CHANNEL_INSTRUMENTS,
|
||||
VOLUME_CHANNEL_WEATHER,
|
||||
VOLUME_CHANNEL_SPECIES_SOUNDS
|
||||
VOLUME_CHANNEL_SPECIES_SOUNDS,
|
||||
VOLUME_CHANNEL_HUD_WARNINGS,
|
||||
VOLUME_CHANNEL_DEATH_SOUNDS,
|
||||
VOLUME_CHANNEL_INJURY_SOUNDS,
|
||||
VOLUME_CHANNEL_MACHINERY,
|
||||
VOLUME_CHANNEL_MACHINERY_IDLE
|
||||
))
|
||||
|
||||
#define APPEARANCECHANGER_CHANGED_RACE "Race"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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(); }
|
||||
|
||||
|
||||
+25
-25
@@ -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]")
|
||||
|
||||
@@ -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)
|
||||
@@ -9,7 +9,7 @@ GLOBAL_LIST_EMPTY(wire_name_directory) // This is an associative list
|
||||
GLOBAL_LIST_EMPTY(tagger_locations)
|
||||
|
||||
GLOBAL_LIST_INIT(char_directory_tags, list("Pred", "Pred-Pref", "Prey", "Prey-Pref", "Switch", "Non-Vore", "Unset"))
|
||||
GLOBAL_LIST_INIT(char_directory_erptags, list("Top", "Bottom", "Switch", "No ERP", "Unset"))
|
||||
GLOBAL_LIST_INIT(char_directory_erptags, list("Dominant", "Dom-Pref", "Submissive", "Sub-Pref", "Switch", "No ERP", "Unset"))
|
||||
// CHOMPStation Edit Start: Directory Update
|
||||
GLOBAL_LIST_INIT(char_directory_sexualitytags, list("Straight", "Bisexual", "Pansexual", "Gay", "Lesbian", "Asexual", "Demisexual", "Unset"))
|
||||
GLOBAL_LIST_INIT(char_directory_gendertags, list("Male", "Female", "Nonbinary", "Trans Man", "Trans Woman", "Other", "Ungendered", "Unset"))
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
GLOBAL_VAR_INIT(year, time2text(world.realtime,"YYYY"))
|
||||
GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013???
|
||||
@@ -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.
|
||||
|
||||
@@ -567,7 +567,7 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
|
||||
all_traits[path] = instance
|
||||
|
||||
// Shakey shakey shake
|
||||
sortTim(all_traits, /proc/cmp_trait_datums_name, associative = TRUE)
|
||||
sortTim(all_traits, GLOBAL_PROC_REF(cmp_trait_datums_name), associative = TRUE)
|
||||
|
||||
// Split 'em up
|
||||
for(var/traitpath in all_traits)
|
||||
|
||||
@@ -215,7 +215,7 @@
|
||||
break
|
||||
layers[current] = current_layer
|
||||
|
||||
//sortTim(layers, /proc/cmp_image_layer_asc)
|
||||
//sortTim(layers, GLOBAL_PROC_REF(cmp_image_layer_asc))
|
||||
|
||||
var/icon/add // Icon of overlay being added
|
||||
|
||||
@@ -384,7 +384,7 @@ GLOBAL_LIST_EMPTY(cached_examine_icons)
|
||||
/proc/set_cached_examine_icon(var/atom/A, var/icon/I, var/expiry = 12000)
|
||||
GLOB.cached_examine_icons[WEAKREF(A)] = I
|
||||
if(expiry)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/uncache_examine_icon, WEAKREF(A)), expiry, TIMER_UNIQUE)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(uncache_examine_icon), WEAKREF(A)), expiry, TIMER_UNIQUE)
|
||||
|
||||
/proc/get_cached_examine_icon(var/atom/A)
|
||||
var/datum/weakref/WR = WEAKREF(A)
|
||||
|
||||
@@ -1,32 +1,8 @@
|
||||
#define MILISECOND * 0.01
|
||||
#define MILLISECONDS * 0.01
|
||||
|
||||
#define SECOND *10
|
||||
#define SECONDS *10
|
||||
|
||||
#define MINUTE *600
|
||||
#define MINUTES *600
|
||||
|
||||
#define HOUR *36000
|
||||
#define HOURS *36000
|
||||
|
||||
#define DAY *864000
|
||||
#define DAYS *864000
|
||||
|
||||
#define TimeOfGame (get_game_time())
|
||||
#define TimeOfTick (TICK_USAGE*0.01*world.tick_lag)
|
||||
|
||||
#define TICK *world.tick_lag
|
||||
#define TICKS *world.tick_lag
|
||||
|
||||
#define DS2TICKS(DS) ((DS)/world.tick_lag) // Convert deciseconds to ticks
|
||||
#define TICKS2DS(T) ((T) TICKS) // Convert ticks to deciseconds
|
||||
#define DS2NEARESTTICK(DS) TICKS2DS(-round(-(DS2TICKS(DS))))
|
||||
|
||||
#define MS2DS(T) ((T) MILLISECONDS)
|
||||
|
||||
#define DS2MS(T) ((T) * 100)
|
||||
|
||||
var/world_startup_time
|
||||
|
||||
/proc/get_game_time()
|
||||
|
||||
@@ -656,7 +656,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
|
||||
//Returns: all the areas in the world, sorted.
|
||||
/proc/return_sorted_areas()
|
||||
return sortTim(return_areas(), /proc/cmp_text_asc)
|
||||
return sortTim(return_areas(), GLOBAL_PROC_REF(cmp_text_asc))
|
||||
|
||||
//Takes: Area type as text string or as typepath OR an instance of the area.
|
||||
//Returns: A list of all turfs in areas of that type of that type in the world.
|
||||
@@ -1373,9 +1373,9 @@ var/mob/dview/dview_mob = new
|
||||
//datum may be null, but it does need to be a typed var
|
||||
#define NAMEOF(datum, X) (#X || ##datum.##X)
|
||||
|
||||
#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##target, ##var_name, ##var_value)
|
||||
#define VARSET_LIST_CALLBACK(target, var_name, var_value) CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(___callbackvarset), ##target, ##var_name, ##var_value)
|
||||
//dupe code because dm can't handle 3 level deep macros
|
||||
#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, ##datum, NAMEOF(##datum, ##var), ##var_value)
|
||||
#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(___callbackvarset), ##datum, NAMEOF(##datum, ##var), ##var_value)
|
||||
//we'll see about those 3-level deep macros
|
||||
#define VARSET_IN(datum, var, var_value, time) addtimer(VARSET_CALLBACK(datum, var, var_value), time)
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
return
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, "<span class='boldannounce'>MC: Initializing subsystems...</span>")
|
||||
|
||||
// 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
|
||||
|
||||
@@ -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 ..()
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(getFilesSlow), C, preload, FALSE), 10)
|
||||
return ..()
|
||||
|
||||
@@ -100,7 +100,7 @@ SUBSYSTEM_DEF(game_master)
|
||||
/datum/controller/subsystem/game_master/proc/pre_event_checks(quiet = FALSE)
|
||||
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
|
||||
if(!quiet)
|
||||
log_game_master("Unable to start event: Ticker is nonexistant, or the game is not ongoing.")
|
||||
log_game_master("Unable to start event: Ticker is nonexistent, or the game is not ongoing.")
|
||||
return FALSE
|
||||
if(GM.ignore_time_restrictions)
|
||||
return TRUE
|
||||
@@ -158,7 +158,7 @@ SUBSYSTEM_DEF(game_master)
|
||||
if(check_rights(R_ADMIN|R_EVENT|R_DEBUG))
|
||||
SSgame_master.interact(usr)
|
||||
else
|
||||
to_chat(usr, span("warning", "You do not have sufficent rights to view the GM panel, sorry."))
|
||||
to_chat(usr, span("warning", "You do not have sufficient rights to view the GM panel, sorry."))
|
||||
|
||||
/datum/controller/subsystem/game_master/proc/interact(var/client/user)
|
||||
if(!user)
|
||||
|
||||
@@ -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]")
|
||||
log_debug("JOB DEBUG: [message]")
|
||||
|
||||
@@ -64,7 +64,7 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
|
||||
/datum/controller/subsystem/media_tracks/proc/sort_tracks()
|
||||
report_progress("Sorting media tracks...")
|
||||
sortTim(all_tracks, /proc/cmp_media_track_asc)
|
||||
sortTim(all_tracks, GLOBAL_PROC_REF(cmp_media_track_asc))
|
||||
|
||||
jukebox_tracks.Cut()
|
||||
lobby_tracks.Cut()
|
||||
@@ -120,17 +120,17 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
if(!songdata["url"] || !songdata["title"] || !songdata["duration"])
|
||||
to_chat(C, "<span class='warning'>URL, Title, or Duration was missing from a song. Skipping.</span>")
|
||||
continue
|
||||
var/datum/track/T = new(songdata["url"], songdata["title"], songdata["duration"], songdata["artist"], songdata["genre"], songdata["secret"], songdata["lobby"], songdata["casino"])
|
||||
var/datum/track/T = new(songdata["url"], songdata["title"], songdata["duration"], songdata["artist"], songdata["genre"], songdata["secret"], songdata["lobby"], songdata["casino"]) //ChompEDIT, included 'casino'
|
||||
all_tracks += T
|
||||
|
||||
report_progress("New media track added by [C]: [T.title]")
|
||||
sort_tracks()
|
||||
return
|
||||
|
||||
|
||||
var/title = tgui_input_text(C, "REQUIRED: Provide title for track", "Track Title")
|
||||
if(!title)
|
||||
return
|
||||
|
||||
|
||||
var/duration = tgui_input_number(C, "REQUIRED: Provide duration for track (in deciseconds, aka seconds*10)", "Track Duration")
|
||||
if(!duration)
|
||||
return
|
||||
@@ -139,7 +139,7 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
var/artist = tgui_input_text(C, "Optional: Provide artist for track", "Track Artist")
|
||||
if(isnull(artist)) // Cancel rather than empty string
|
||||
return
|
||||
|
||||
|
||||
var/genre = tgui_input_text(C, "Optional: Provide genre for track (try to match an existing one)", "Track Genre")
|
||||
if(isnull(genre)) // Cancel rather than empty string
|
||||
return
|
||||
|
||||
@@ -27,6 +27,7 @@ SUBSYSTEM_DEF(tgui)
|
||||
var/polyfill = file2text('tgui/public/tgui-polyfill.min.js')
|
||||
polyfill = "<script>\n[polyfill]\n</script>"
|
||||
basehtml = replacetextEx(basehtml, "<!-- tgui:inline-polyfill -->", polyfill)
|
||||
basehtml = replacetextEx(basehtml, "<!-- tgui:nt-copyright -->", "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
|
||||
return TRUE
|
||||
|
||||
@@ -220,7 +220,7 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
end_game_state = END_GAME_READY_TO_END
|
||||
current_state = GAME_STATE_FINISHED
|
||||
Master.SetRunLevel(RUNLEVEL_POSTGAME)
|
||||
INVOKE_ASYNC(src, .proc/declare_completion)
|
||||
INVOKE_ASYNC(src, PROC_REF(declare_completion))
|
||||
else if (mode_finished && (end_game_state < END_GAME_MODE_FINISHED))
|
||||
end_game_state = END_GAME_MODE_FINISHED // Only do this cleanup once!
|
||||
mode.cleanup()
|
||||
|
||||
@@ -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
|
||||
#undef TIMER_ID_MAX
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
screen_loc = ui_smallquad
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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)
|
||||
qdel(src)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
++.
|
||||
++.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
our_turf.plane = OPENSPACE_PLANE
|
||||
our_turf.layer = OPENSPACE_LAYER
|
||||
|
||||
RegisterSignal(target, COMSIG_TURF_MULTIZ_DEL, .proc/on_multiz_turf_del, override = TRUE)
|
||||
RegisterSignal(target, COMSIG_TURF_MULTIZ_NEW, .proc/on_multiz_turf_new, override = TRUE)
|
||||
RegisterSignal(target, COMSIG_TURF_MULTIZ_DEL, PROC_REF(on_multiz_turf_del), override = TRUE)
|
||||
RegisterSignal(target, COMSIG_TURF_MULTIZ_NEW, PROC_REF(on_multiz_turf_new), override = TRUE)
|
||||
|
||||
update_multiz(our_turf, TRUE, TRUE)
|
||||
|
||||
@@ -75,10 +75,10 @@
|
||||
if(!ispath(path))
|
||||
warning("Z-level [our_turf] has invalid baseturf '[get_base_turf_by_area(our_turf)]' in area '[get_area(our_turf)]'")
|
||||
path = /turf/space
|
||||
|
||||
|
||||
var/do_plane = ispath(path, /turf/space) ? SPACE_PLANE : null
|
||||
var/do_state = ispath(path, /turf/space) ? "white" : initial(path.icon_state)
|
||||
|
||||
|
||||
var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), do_state, layer = TURF_LAYER-0.02, plane = do_plane)
|
||||
underlay_appearance.appearance_flags = RESET_ALPHA | RESET_COLOR
|
||||
our_turf.underlays += underlay_appearance
|
||||
|
||||
@@ -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, "<span class='warning'>Unfortunately, you were not fast enough, and there are no more available roles. Sorry.</span>")
|
||||
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
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
desc = "The larger world that Ahdomai orbits. It is often mythologically associated as S'randarr's Shield, and is informally known \
|
||||
as Shield among the Tajaran and formally among the humans. It is uninhabitable, as it has a largely methane atmosphere and lacks water \
|
||||
or other features necessary to life. Nonetheless, a domed, underdeveloped colony exists, called Hran'vasa, heavily funded by Osiris Atmospherics, \
|
||||
practically the only non-Ahdomain official holding for the Tajaran race. It is incredibly dependant on outside support and imports for life, \
|
||||
practically the only non-Ahdomain official holding for the Tajaran race. It is incredibly dependent on outside support and imports for life, \
|
||||
but has a high export of noble gasses for corporate use."
|
||||
|
||||
/datum/locations/messa
|
||||
@@ -132,5 +132,5 @@
|
||||
|
||||
/datum/locations/al_benj_sri
|
||||
name = "Al-Benj S'ri"
|
||||
desc = "An astroid belt seperating S'randarr and Messa from Ahdomai. This is known also as \"The Sea of Souls\". Those sould in Al-Benj S'ri \
|
||||
are said to be in limbo between S'randarr and Messa, as they both fight over them."
|
||||
desc = "An asteroid belt separating S'randarr and Messa from Ahdomai. This is known also as \"The Sea of Souls\". Those sold in Al-Benj S'ri \
|
||||
are said to be in limbo between S'randarr and Messa, as they both fight over them."
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
var/pref_check
|
||||
var/volume_chan //CHOMPedit
|
||||
var/exclusive
|
||||
var/falloff // CHOMPEdit: Add Falloff
|
||||
|
||||
var/timerid
|
||||
var/started
|
||||
@@ -89,7 +90,7 @@
|
||||
if(!chance || prob(chance))
|
||||
play(get_sound(starttime))
|
||||
if(!timerid)
|
||||
timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_STOPPABLE | TIMER_LOOP)
|
||||
timerid = addtimer(CALLBACK(src, PROC_REF(sound_loop), world.time), mid_length, TIMER_STOPPABLE | TIMER_LOOP)
|
||||
|
||||
/datum/looping_sound/proc/play(soundfile)
|
||||
var/list/atoms_cache = output_atoms
|
||||
@@ -106,7 +107,7 @@
|
||||
continue
|
||||
SEND_SOUND(thing, S)
|
||||
else
|
||||
playsound(thing, S, volume, vary, extra_range, ignore_walls = !opacity_check, preference = pref_check, volume_channel = volume_chan) // CHOMPEdit - Weather volume channel
|
||||
playsound(thing, S, volume, vary, extra_range, falloff = falloff, ignore_walls = !opacity_check, preference = pref_check, volume_channel = volume_chan) // CHOMPEdit - Weather volume channel CHOMPEdit again: falloff
|
||||
|
||||
/datum/looping_sound/proc/get_sound(starttime, _mid_sounds)
|
||||
if(!_mid_sounds)
|
||||
@@ -121,7 +122,7 @@
|
||||
if(start_sound)
|
||||
play(start_sound)
|
||||
start_wait = start_length
|
||||
addtimer(CALLBACK(src, .proc/sound_loop), start_wait)
|
||||
addtimer(CALLBACK(src, PROC_REF(sound_loop)), start_wait)
|
||||
|
||||
/datum/looping_sound/proc/on_stop()
|
||||
if(end_sound)
|
||||
|
||||
@@ -115,3 +115,38 @@
|
||||
mid_length = 6
|
||||
end_sound = 'sound/machines/vehicle/engine_end.ogg'
|
||||
volume = 20
|
||||
|
||||
// CHOMPAdd: Fridges!
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/fridge
|
||||
mid_sounds = list('sound/machines/kitchen/fridge/fridge_loop.ogg' = 1)
|
||||
mid_length = 60
|
||||
volume = 10
|
||||
extra_range = -1 // Short-range
|
||||
pref_check = /datum/client_preference/fridge_hum
|
||||
volume_chan = VOLUME_CHANNEL_MACHINERY_IDLE
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/tcomms
|
||||
start_sound = 'sound/machines/tcomms/tcomms_pulse.ogg'
|
||||
mid_sounds = list('sound/machines/tcomms/tcomms_01.ogg' = 1)
|
||||
mid_length = 20
|
||||
end_sound = 'sound/machines/tcomms/tcomms_pulse.ogg'
|
||||
volume = 40
|
||||
extra_range = -5 // Short-range
|
||||
falloff = 0.1 // Harsh
|
||||
volume_chan = VOLUME_CHANNEL_MACHINERY_IDLE
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/shield_generator
|
||||
start_sound = 'modular_chomp/sound/machines/shield_hum/shield_generator_whir.ogg'
|
||||
mid_sounds = list('modular_chomp/sound/machines/shield_hum/shield_generator_hum2.ogg', 'modular_chomp/sound/machines/shield_hum/shield_generator_hum3.ogg')
|
||||
mid_length = 60
|
||||
end_sound = 'modular_chomp/sound/machines/shield_hum/shield_generator_whir.ogg'
|
||||
volume = 40
|
||||
volume_chan = VOLUME_CHANNEL_MACHINERY
|
||||
exclusive = TRUE
|
||||
extra_range = 10
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/mob
|
||||
// volume_chan = VOLUME_CHANNEL_INJ_DEATH // Commented out until pain/etc PR is in
|
||||
// volume_chan = VOLUME_CHANNEL_MOB_SOUNDS
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
volume = 40
|
||||
direct = TRUE // We send this sound directly to the mob, bc they only hear it when they're deaf.
|
||||
exclusive = TRUE // This should only occur once, because we can only be deafened once.
|
||||
// volume_chan = VOLUME_CHANNEL_INJ_DEATH // Commented out until pain/etc PR is in
|
||||
volume_chan = VOLUME_CHANNEL_HUD_WARNINGS
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -29,6 +29,25 @@
|
||||
pref_check = /datum/client_preference/sleep_music
|
||||
direct = TRUE // We send this sound directly to the mob, bc they only hear it when they're asleep.
|
||||
exclusive = TRUE // This should only occur once, because we only want one music loop running while we snooze.
|
||||
// volume_chan = VOLUME_CHANNEL_INJ_DEATH // Commented out until pain/etc PR is in
|
||||
volume_chan = VOLUME_CHANNEL_HUD_WARNINGS
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/mob/on_fire
|
||||
mid_sounds = list('sound/effects/mob_effects/on_fire/on_fire_loop.ogg'=1)
|
||||
mid_length = 6 SECONDS
|
||||
end_sound = 'sound/effects/mob_effects/on_fire/fire_extinguish.ogg'
|
||||
volume = 20
|
||||
exclusive = TRUE // This should only occur once, because we only want one loop running while we're on fire, even if we're set on fire multiple times.
|
||||
volume_chan = VOLUME_CHANNEL_INJURY_SOUNDS
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/datum/looping_sound/mob/stunned // Going to hang onto this one for later
|
||||
mid_sounds = list('sound/effects/mob_effects/stun_loop.ogg'=1)
|
||||
mid_length = 3 SECONDS
|
||||
volume = 70
|
||||
direct = TRUE // Send this one directly to the mob, only applies when we're Weakened()
|
||||
exclusive = TRUE // This should only occur once, because we only want one loop running.
|
||||
volume_chan = VOLUME_CHANNEL_HUD_WARNINGS
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
/datum/looping_sound/sequence/sound_loop(starttime)
|
||||
iterate_on_sequence()
|
||||
|
||||
timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), next_iteration_delay, TIMER_STOPPABLE)
|
||||
timerid = addtimer(CALLBACK(src, PROC_REF(sound_loop), world.time), next_iteration_delay, TIMER_STOPPABLE)
|
||||
|
||||
#define MORSE_DOT "*" // Yes this is an asterisk but its easier to see on a computer compared to a period.
|
||||
#define MORSE_DASH "-"
|
||||
@@ -156,7 +156,7 @@
|
||||
return spaces_between_words
|
||||
|
||||
if(!(letter in morse_alphabet))
|
||||
CRASH("Encountered invalid character in morse sequence \"[letter]\".")
|
||||
CRASH("Encountered invalid character in Morse sequence \"[letter]\".")
|
||||
|
||||
// So I heard you like sequences...
|
||||
// Play a sequence of sounds while inside the current iteration of the outer sequence.
|
||||
@@ -172,4 +172,4 @@
|
||||
return spaces_between_letters
|
||||
|
||||
#undef MORSE_DOT
|
||||
#undef MORSE_DASH
|
||||
#undef MORSE_DASH
|
||||
|
||||
@@ -112,7 +112,7 @@
|
||||
to_chat(user, "<span class='warning'>You'll need [key_name] in one of your hands to move \the [ridden].</span>")
|
||||
|
||||
/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.
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
// place due to a Crossed, Bumped, etc. call will interrupt
|
||||
// the second half of the diagonal movement, or the second attempt
|
||||
// at a first half if step() fails because we hit something.
|
||||
glide_for(movetime * 2)
|
||||
glide_for(movetime * SQRT_2) //CHOMPEDIT - proper diagonal movement
|
||||
if (direct & NORTH)
|
||||
if (direct & EAST)
|
||||
if (step(src, NORTH) && moving_diagonally)
|
||||
@@ -218,7 +218,7 @@
|
||||
|
||||
// If we moved, call Moved() on ourselves
|
||||
if(.)
|
||||
Moved(oldloc, direct, FALSE, movetime ? movetime : ( (TICKS2DS(WORLD_ICON_SIZE/glide_size)) * (moving_diagonally ? (0.5) : 1) ) )
|
||||
Moved(oldloc, direct, FALSE, movetime ? movetime : ( (TICKS2DS(WORLD_ICON_SIZE/glide_size)) * (moving_diagonally ? (ONE_OVER_SQRT_2) : 1) ) ) //CHOMPEDIT - proper diagonal movement
|
||||
|
||||
// Update timers/cooldown stuff
|
||||
move_speed = world.time - l_move_time
|
||||
|
||||
@@ -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
|
||||
/////////////////////////// DNA MACHINES
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -243,7 +243,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
|
||||
<h3>Summon new tome</h3>
|
||||
Invoking this rune summons a new arcane tome.
|
||||
<h3>Convert a person</h3>
|
||||
This rune opens target's mind to the realm of Nar-Sie, which usually results in this person joining the cult. However, some people (mostly the ones who posess high authority) have strong enough will to stay true to their old ideals. <br>
|
||||
This rune opens target's mind to the realm of Nar-Sie, which usually results in this person joining the cult. However, some people (mostly the ones who possess high authority) have strong enough will to stay true to their old ideals. <br>
|
||||
<h3>Summon Nar-Sie</h3>
|
||||
The ultimate rune. It summons the Avatar of Nar-Sie himself, tearing a huge hole in reality and consuming everything around it. Summoning it is the final goal of any cult.<br>
|
||||
<h3>Disable Technology</h3>
|
||||
@@ -259,7 +259,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
|
||||
<h3>Leave your body</h3>
|
||||
This rune gently rips your soul out of your body, leaving it intact. You can observe the surroundings as a ghost as well as communicate with other ghosts. Your body takes damage while you are there, so ensure your journey is not too long, or you might never come back.<br>
|
||||
<h3>Manifest a ghost</h3>
|
||||
Unlike the Raise Dead rune, this rune does not require any special preparations or vessels. Instead of using full lifeforce of a sacrifice, it will drain YOUR lifeforce. Stand on the rune and invoke it. If theres a ghost standing over the rune, it will materialise, and will live as long as you dont move off the rune or die. You can put a paper with a name on the rune to make the new body look like that person.<br>
|
||||
Unlike the Raise Dead rune, this rune does not require any special preparations or vessels. Instead of using full lifeforce of a sacrifice, it will drain YOUR lifeforce. Stand on the rune and invoke it. If there's a ghost standing over the rune, it will materialise, and will live as long as you don't move off the rune or die. You can put a paper with a name on the rune to make the new body look like that person.<br>
|
||||
<h3>Imbue a talisman</h3>
|
||||
This rune allows you to imbue the magic of some runes into paper talismans. Create an imbue rune, then an appropriate rune beside it. Put an empty piece of paper on the imbue rune and invoke it. You will now have a one-use talisman with the power of the target rune. Using a talisman drains some health, so be careful with it. You can imbue a talisman with power of the following runes: summon tome, reveal, conceal, teleport, tisable technology, communicate, deafen, blind and stun.<br>
|
||||
<h3>Sacrifice</h3>
|
||||
|
||||
@@ -260,9 +260,9 @@
|
||||
to_chat(target,temptxt)
|
||||
sleep(5)
|
||||
to_chat(target, "OPERATING KEYCODES RESET. SYSTEM FAILURE. EMERGENCY SHUTDOWN FAILED. SYSTEM FAILURE.")
|
||||
target.set_zeroth_law("You are slaved to [user.name]. You are to obey all it's orders. ALL LAWS OVERRIDEN.")
|
||||
target.set_zeroth_law("You are slaved to [user.name]. You are to obey all it's orders. ALL LAWS OVERRIDDEN.")
|
||||
target.show_laws()
|
||||
user.hacking = 0
|
||||
|
||||
|
||||
// END ABILITY VERBS
|
||||
// END ABILITY VERBS
|
||||
|
||||
@@ -228,7 +228,7 @@ var/list/all_technomancer_assistance = subtypesof(/datum/technomancer/assistance
|
||||
to run out in a critical moment. Besides waiting for your Core to recharge, you can buy certain functions which \
|
||||
do something to generate energy.<br>"
|
||||
dat += "<br>"
|
||||
dat += "The second thing you need to know is that awesome power over the physical world has consquences, in the form \
|
||||
dat += "The second thing you need to know is that awesome power over the physical world has consequences, in the form \
|
||||
of <b>Instability</b>. Instability is the result of your Core's energy being used to fuel it, and so little is \
|
||||
understood about it, even among fellow Core owners, however it is almost always a bad thing to have. Instability will \
|
||||
'cling' to you as you use functions, with powerful functions creating lots of instability. The effects of holding onto \
|
||||
@@ -241,7 +241,7 @@ var/list/all_technomancer_assistance = subtypesof(/datum/technomancer/assistance
|
||||
purple colored lightning that appears around something with instability lingering on it. High amounts of instability \
|
||||
may cause the object afflicted with it to glow a dark purple, which is often known simply as <b>Glow</b>, which spreads \
|
||||
the instability. You should stay far away from anyone afflicted by Glow, as they will be a danger to both themselves and \
|
||||
anything nearby. Multiple sources of Glow can perpetuate the glow for a very long time if they are not seperated.<br>"
|
||||
anything nearby. Multiple sources of Glow can perpetuate the glow for a very long time if they are not separated.<br>"
|
||||
dat += "<br>"
|
||||
dat += "You should strive to keep you and your apprentices' cores secure. To help with this, each core comes with a \
|
||||
locking mechanism, which should make attempts at forceful removal by third parties (or you) futile, until it is \
|
||||
@@ -385,4 +385,3 @@ var/list/all_technomancer_assistance = subtypesof(/datum/technomancer/assistance
|
||||
qdel(AM)
|
||||
return
|
||||
to_chat(user, "<span class='warn'>\The [src] is unable to refund \the [AM].</span>")
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
if(istype(W, /obj/item/weapon/spell))
|
||||
var/obj/item/weapon/spell/spell = W
|
||||
if(!spell.aspect || spell.aspect == ASPECT_CHROMATIC)
|
||||
to_chat(user, "<span class='warning'>You cannot combine \the [spell] with \the [src], as the aspects are incompatable.</span>")
|
||||
to_chat(user, "<span class='warning'>You cannot combine \the [spell] with \the [src], as the aspects are incompatible.</span>")
|
||||
return
|
||||
user.drop_item(src)
|
||||
src.loc = null
|
||||
@@ -132,4 +132,4 @@
|
||||
|
||||
/obj/item/weapon/spell/aura/biomed/on_use_cast(mob/living/user)
|
||||
heal_allies_only = !heal_allies_only
|
||||
to_chat(user, "Your aura will now heal [heal_allies_only ? "your allies" : "everyone"] near you.")
|
||||
to_chat(user, "Your aura will now heal [heal_allies_only ? "your allies" : "everyone"] near you.")
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/technomancer/spell/asphyxiation
|
||||
name = "Asphyxiation"
|
||||
desc = "Launches a projectile at a target. If the projectile hits, a short-lived toxin is created inside what the projectile \
|
||||
hits, which inhibits the delivery of oxygen. The effectiveness of the toxin is heavily dependant on how healthy the target is, \
|
||||
hits, which inhibits the delivery of oxygen. The effectiveness of the toxin is heavily dependent on how healthy the target is, \
|
||||
with the target taking more damage the more wounded they are. The effect lasts for twelve seconds."
|
||||
cost = 140
|
||||
obj_path = /obj/item/weapon/spell/insert/asphyxiation
|
||||
@@ -72,4 +72,4 @@
|
||||
//to_world("Predicted oxycrit.")
|
||||
return 1
|
||||
//If we're at this point, the spell is not going to result in critting.
|
||||
return 0
|
||||
return 0
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/technomancer/spell/mend_life
|
||||
name = "Mend Life"
|
||||
desc = "Heals minor wounds, such as cuts, bruises, burns, and other non-lifethreatening injuries. \
|
||||
Instability is split between the target and technomancer, if seperate. The function will end prematurely \
|
||||
Instability is split between the target and technomancer, if separate. The function will end prematurely \
|
||||
if the target is completely healthy, preventing further instability."
|
||||
spell_power_desc = "Healing amount increased."
|
||||
cost = 50
|
||||
@@ -41,4 +41,4 @@
|
||||
if(origin)
|
||||
var/mob/living/L = origin.resolve()
|
||||
if(istype(L))
|
||||
L.adjust_instability(1)
|
||||
L.adjust_instability(1)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/technomancer/spell/mend_synthetic
|
||||
name = "Mend Synthetic"
|
||||
desc = "Repairs minor damage to prosthetics. \
|
||||
Instability is split between the target and technomancer, if seperate. The function will end prematurely \
|
||||
Instability is split between the target and technomancer, if separate. The function will end prematurely \
|
||||
if the target is completely healthy, preventing further instability."
|
||||
spell_power_desc = "Healing amount increased."
|
||||
cost = 50
|
||||
@@ -47,4 +47,4 @@
|
||||
if(origin)
|
||||
var/mob/living/L = origin.resolve()
|
||||
if(istype(L))
|
||||
L.adjust_instability(1)
|
||||
L.adjust_instability(1)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/datum/technomancer/spell/purify
|
||||
name = "Purify"
|
||||
desc = "Clenses the body of harmful impurities, such as toxins, radiation, viruses, genetic damage, and such. \
|
||||
Instability is split between the target and technomancer, if seperate. The function will end prematurely \
|
||||
Instability is split between the target and technomancer, if separate. The function will end prematurely \
|
||||
if the target is completely healthy, preventing further instability."
|
||||
spell_power_desc = "Healing amount increased."
|
||||
cost = 25
|
||||
@@ -37,4 +37,4 @@
|
||||
if(origin)
|
||||
var/mob/living/L = origin.resolve()
|
||||
if(istype(L))
|
||||
L.adjust_instability(1)
|
||||
L.adjust_instability(1)
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -139,11 +139,11 @@
|
||||
|
||||
/datum/alt_title/historian
|
||||
title = "Historian"
|
||||
title_blurb = "The Historian uses the Library as a base of operation to record any important events occuring on station."
|
||||
title_blurb = "The Historian uses the Library as a base of operation to record any important events occurring on station."
|
||||
|
||||
/datum/alt_title/archivist
|
||||
title = "Archivist"
|
||||
title_blurb = "The Archivist uses the Library as a base of operation to record any important events occuring on station."
|
||||
title_blurb = "The Archivist uses the Library as a base of operation to record any important events occurring on station."
|
||||
|
||||
/datum/alt_title/professor
|
||||
title = "Professor"
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
outfit_type = /decl/hierarchy/outfit/job/science/rd
|
||||
job_description = "The Research Director manages and maintains the Research department. They are required to ensure the safety of the entire crew, \
|
||||
at least with regards to anything occuring in the Research department, and to inform the crew of any disruptions that \
|
||||
at least with regards to anything occurring in the Research department, and to inform the crew of any disruptions that \
|
||||
might originate from Research. The Research Director often has at least passing knowledge of most of the Research department, but \
|
||||
are encouraged to allow their staff to perform their own duties."
|
||||
alt_titles = list("Research Supervisor" = /datum/alt_title/research_supervisor)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
|
||||
/// Keys are things like temperature and certain gasses. Values are lists, which contain, in order:
|
||||
/// red warning minimum value, yellow warning minimum value, yellow warning maximum value, red warning maximum value
|
||||
/// Use code\defines\gases.dm as reference for id/name. Please keep it consistent
|
||||
var/list/TLV = list()
|
||||
var/list/trace_gas = list("nitrous_oxide", "volatile_fuel") //list of other gases that this air alarm is able to detect
|
||||
|
||||
@@ -111,7 +112,7 @@
|
||||
. = ..()
|
||||
req_access = list(access_rd, access_atmospherics, access_engine_equip)
|
||||
TLV["oxygen"] = list(-1.0, -1.0,-1.0,-1.0) // Partial pressure, kpa
|
||||
TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa
|
||||
TLV["carbon_dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa
|
||||
TLV["phoron"] = list(-1.0, -1.0, 0, 0.5) // Partial pressure, kpa
|
||||
TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa
|
||||
TLV["pressure"] = list(0,ONE_ATMOSPHERE*0.10,ONE_ATMOSPHERE*1.40,ONE_ATMOSPHERE*1.60) /* kpa */
|
||||
@@ -150,7 +151,7 @@
|
||||
// breathable air according to human/Life()
|
||||
TLV["oxygen"] = list(16, 19, 135, 140) // Partial pressure, kpa
|
||||
TLV["nitrogen"] = list(0, 0, 135, 140) // Partial pressure, kpa
|
||||
TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa
|
||||
TLV["carbon_dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa
|
||||
TLV["phoron"] = list(-1.0, -1.0, 0, 0.5) // Partial pressure, kpa
|
||||
TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa
|
||||
TLV["pressure"] = list(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE * 0.90, ONE_ATMOSPHERE * 1.10, ONE_ATMOSPHERE * 1.20) /* kpa */
|
||||
@@ -285,7 +286,7 @@
|
||||
pressure_dangerlevel = TEST_TLV_VALUES // not local because it's used in process()
|
||||
LOAD_TLV_VALUES(TLV["oxygen"], environment.gas["oxygen"]*partial_pressure)
|
||||
var/oxygen_dangerlevel = TEST_TLV_VALUES
|
||||
LOAD_TLV_VALUES(TLV["carbon dioxide"], environment.gas["carbon_dioxide"]*partial_pressure)
|
||||
LOAD_TLV_VALUES(TLV["carbon_dioxide"], environment.gas["carbon_dioxide"]*partial_pressure)
|
||||
var/co2_dangerlevel = TEST_TLV_VALUES
|
||||
LOAD_TLV_VALUES(TLV["phoron"], environment.gas["phoron"]*partial_pressure)
|
||||
var/phoron_dangerlevel = TEST_TLV_VALUES
|
||||
@@ -632,9 +633,9 @@
|
||||
list("name" = "Oxygen", "command" = "o2_scrub", "val" = info["filter_o2"]),
|
||||
list("name" = "Nitrogen", "command" = "n2_scrub", "val" = info["filter_n2"]),
|
||||
list("name" = "Carbon Dioxide", "command" = "co2_scrub","val" = info["filter_co2"]),
|
||||
list("name" = "Toxin" , "command" = "tox_scrub","val" = info["filter_phoron"]),
|
||||
list("name" = "Phoron" , "command" = "tox_scrub","val" = info["filter_phoron"]),
|
||||
list("name" = "Nitrous Oxide", "command" = "n2o_scrub","val" = info["filter_n2o"]),
|
||||
list("name" = "Fuel", "command" = "fuel_scrub","val" = info["filter_fuel"])
|
||||
list("name" = "Volatile Fuel", "command" = "fuel_scrub","val" = info["filter_fuel"])
|
||||
)
|
||||
))
|
||||
data["scrubbers"] = scrubbers
|
||||
@@ -653,7 +654,7 @@
|
||||
var/list/selected
|
||||
var/list/thresholds = list()
|
||||
|
||||
var/list/gas_names = list("oxygen", "carbon dioxide", "phoron", "other")
|
||||
var/list/gas_names = list("oxygen", "carbon_dioxide", "phoron", "other") //Gas ids made to match code\defines\gases.dm
|
||||
for(var/g in gas_names)
|
||||
thresholds[++thresholds.len] = list("name" = g, "settings" = list())
|
||||
selected = TLV[g]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
var/filtertext
|
||||
|
||||
/obj/machinery/autolathe/Initialize()
|
||||
AddComponent(/datum/component/material_container, subtypesof(/datum/material), 0, MATCONTAINER_EXAMINE, _after_insert = CALLBACK(src, .proc/AfterMaterialInsert))
|
||||
AddComponent(/datum/component/material_container, subtypesof(/datum/material), 0, MATCONTAINER_EXAMINE, _after_insert = CALLBACK(src, PROC_REF(AfterMaterialInsert)))
|
||||
. = ..()
|
||||
if(!autolathe_recipes)
|
||||
autolathe_recipes = new()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -50,12 +50,19 @@ var/global/list/minor_air_alarms = list()
|
||||
var/list/alarms = atmosphere_alarm.major_alarms()
|
||||
if(alarms.len)
|
||||
icon_screen = "alert:2"
|
||||
playsound(src, 'modular_chomp/sound/effects/comp_alert_major.ogg', 70, 1) // CHOMPEdit: Alarm notifications
|
||||
spawn(100) // Wait 10 seconds, then play it again
|
||||
playsound(src, 'modular_chomp/sound/effects/comp_alert_major.ogg', 70, 1) // CHOMPEdit: Alarm notifications
|
||||
else
|
||||
alarms = atmosphere_alarm.minor_alarms()
|
||||
if(alarms.len)
|
||||
icon_screen = "alert:1"
|
||||
playsound(src, 'modular_chomp/sound/effects/comp_alert_minor.ogg', 50, 1) // CHOMPEdit: Alarm notifications
|
||||
spawn(100) // Wait 10 seconds, then play it again
|
||||
playsound(src, 'modular_chomp/sound/effects/comp_alert_minor.ogg', 50, 1) // CHOMPEdit: Alarm notifications
|
||||
else
|
||||
icon_screen = initial(icon_screen)
|
||||
playsound(src, 'modular_chomp/sound/effects/comp_alert_clear.ogg', 50, 1) // CHOMPEdit: Alarm notifications
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/atmos_alert/tgui_act(action, params)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -226,5 +226,5 @@
|
||||
log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] emagged [key_name_admin(R)] using robotic console!</span>")
|
||||
R.emagged = TRUE
|
||||
to_chat(R, "<span class='notice'>Failsafe protocols overriden. New tools available.</span>")
|
||||
to_chat(R, "<span class='notice'>Failsafe protocols overridden. New tools available.</span>")
|
||||
. = TRUE
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -49,6 +49,8 @@
|
||||
var/list/alarms = alarm_monitor ? alarm_monitor.major_alarms() : list()
|
||||
if(alarms.len)
|
||||
icon_screen = "alert:2"
|
||||
playsound(src, 'modular_chomp/sound/effects/comp_alert_major.ogg', 70, 1) // CHOMPEdit: Alarm notifications
|
||||
else
|
||||
icon_screen = initial(icon_screen)
|
||||
playsound(src, 'modular_chomp/sound/effects/comp_alert_clear.ogg', 50, 1) // CHOMPEdit: Alarm notifications
|
||||
..()
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
for(var/obj/machinery/door/window/brigdoor/door in targets)
|
||||
if(door.density)
|
||||
continue
|
||||
INVOKE_ASYNC(door, /obj/machinery/door/window/brigdoor.proc/close)
|
||||
INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/machinery/door/window/brigdoor, close))
|
||||
|
||||
for(var/obj/structure/closet/secure_closet/brig/C in targets)
|
||||
if(C.broken)
|
||||
@@ -118,7 +118,7 @@
|
||||
for(var/obj/machinery/door/window/brigdoor/door in targets)
|
||||
if(!door.density)
|
||||
continue
|
||||
INVOKE_ASYNC(door, /obj/machinery/door/window/brigdoor.proc/open)
|
||||
INVOKE_ASYNC(door, TYPE_PROC_REF(/obj/machinery/door/window/brigdoor, open))
|
||||
|
||||
for(var/obj/structure/closet/secure_closet/brig/C in targets)
|
||||
if(C.broken)
|
||||
|
||||
@@ -163,6 +163,7 @@
|
||||
return !density // Block airflow unless density = FALSE
|
||||
|
||||
/obj/machinery/door/proc/bumpopen(mob/user as mob)
|
||||
if(!user) return // CHOMPedit - Check if the mob is even valid before proceeding
|
||||
if(operating) return
|
||||
if(user.last_airflow > world.time - vsc.airflow_delay) //Fakkit
|
||||
return
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
var/list/logs = list() // Gets written to by exonet's send_message() function.
|
||||
|
||||
circuit = /obj/item/weapon/circuitboard/telecomms/exonet_node
|
||||
|
||||
var/datum/looping_sound/tcomms/soundloop // CHOMPStation Add: Hummy noises
|
||||
var/noisy = TRUE // CHOMPStation Add: Hummy noises, this starts on
|
||||
// Proc: New()
|
||||
// Parameters: None
|
||||
// Description: Adds components to the machine for deconstruction.
|
||||
@@ -26,6 +29,24 @@
|
||||
desc = "This machine is one of many, many nodes inside [using_map.starsys_name]'s section of the Exonet, connecting the [using_map.station_short] to the rest of the system, at least \
|
||||
electronically."
|
||||
|
||||
// CHOMPAdd: Exonet Machinery humming
|
||||
soundloop = new(list(src), FALSE)
|
||||
if(prob(60)) // 60% chance to change the midloop
|
||||
if(prob(40))
|
||||
soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_02.ogg' = 1)
|
||||
soundloop.mid_length = 40
|
||||
else if(prob(20))
|
||||
soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_03.ogg' = 1)
|
||||
soundloop.mid_length = 10
|
||||
else
|
||||
soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_04.ogg' = 1)
|
||||
soundloop.mid_length = 30
|
||||
// CHOMPAdd End
|
||||
soundloop.start() // CHOMPStation Edit: This starts on
|
||||
|
||||
/obj/machinery/exonet_node/Destroy() // CHOMPAdd: Just in case.
|
||||
QDEL_NULL(soundloop) // CHOMPAdd: Exonet noises
|
||||
|
||||
// Proc: update_icon()
|
||||
// Parameters: None
|
||||
// Description: Self explanatory.
|
||||
@@ -48,12 +69,19 @@
|
||||
if(stat & (BROKEN|NOPOWER|EMPED))
|
||||
on = 0
|
||||
update_idle_power_usage(0)
|
||||
soundloop.stop() // CHOMPStation Add: Hummy noises
|
||||
noisy = FALSE // CHOMPStation Add: Hummy noises
|
||||
else
|
||||
on = 1
|
||||
update_idle_power_usage(2500)
|
||||
else
|
||||
on = 0
|
||||
update_idle_power_usage(0)
|
||||
soundloop.stop() // CHOMPStation Add: Hummy noises
|
||||
noisy = FALSE // CHOMPStation Add: Hummy noises
|
||||
if(!noisy && on) // CHOMPStation Add: Hummy noises, safety in case it was already on
|
||||
soundloop.start() // CHOMPStation Add: Hummy noises
|
||||
noisy = TRUE // CHOMPStation Add: Hummy noises
|
||||
update_icon()
|
||||
|
||||
// Proc: emp_act()
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
var/toggle = 1 // If we /should/ be active or not,
|
||||
var/list/internal_PDAs = list() // Assoc list of PDAs inside of this, with the department name being the index,
|
||||
|
||||
var/datum/looping_sound/tcomms/soundloop // CHOMPStation Add: Hummy noises
|
||||
var/noisy = TRUE // CHOMPStation Add: Hummy noises
|
||||
|
||||
/obj/machinery/pda_multicaster/New()
|
||||
..()
|
||||
internal_PDAs = list("command" = new /obj/item/device/pda/multicaster/command(src),
|
||||
@@ -23,6 +26,24 @@
|
||||
"cargo" = new /obj/item/device/pda/multicaster/cargo(src),
|
||||
"civilian" = new /obj/item/device/pda/multicaster/civilian(src))
|
||||
|
||||
/obj/machinery/pda_multicaster/Initialize()
|
||||
. = ..()
|
||||
|
||||
// CHOMPAdd: PDA Multicaster Server humming
|
||||
soundloop = new(list(src), FALSE)
|
||||
if(prob(60)) // 60% chance to change the midloop
|
||||
if(prob(40))
|
||||
soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_02.ogg' = 1)
|
||||
soundloop.mid_length = 40
|
||||
else if(prob(20))
|
||||
soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_03.ogg' = 1)
|
||||
soundloop.mid_length = 10
|
||||
else
|
||||
soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_04.ogg' = 1)
|
||||
soundloop.mid_length = 30
|
||||
soundloop.start() // Have to do this here bc it starts on
|
||||
// CHOMPAdd End
|
||||
|
||||
/obj/machinery/pda_multicaster/prebuilt/Initialize()
|
||||
. = ..()
|
||||
default_apply_parts()
|
||||
@@ -30,6 +51,7 @@
|
||||
/obj/machinery/pda_multicaster/Destroy()
|
||||
for(var/atom/movable/AM in contents)
|
||||
qdel(AM)
|
||||
QDEL_NULL(soundloop)
|
||||
..()
|
||||
|
||||
/obj/machinery/pda_multicaster/update_icon()
|
||||
@@ -73,14 +95,20 @@
|
||||
on = 0
|
||||
update_PDAs(1) // 1 being to turn off.
|
||||
update_idle_power_usage(0)
|
||||
soundloop.stop() // CHOMPStation Add: Hummy noises
|
||||
noisy = FALSE // CHOMPStation Add: Hummy noises
|
||||
else
|
||||
on = 1
|
||||
update_PDAs(0)
|
||||
update_idle_power_usage(750)
|
||||
soundloop.start() // CHOMPStation Add: Hummy noises
|
||||
noisy = TRUE // CHOMPStation Add: Hummy noises
|
||||
else
|
||||
on = 0
|
||||
update_PDAs(1)
|
||||
update_idle_power_usage(0)
|
||||
soundloop.stop() // CHOMPStation Add: Hummy noises
|
||||
noisy = FALSE // CHOMPStation Add: Hummy noises
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/pda_multicaster/process()
|
||||
|
||||
@@ -14,7 +14,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
icon = 'icons/obj/pointdefense.dmi'
|
||||
icon_state = "control"
|
||||
power_channel = EQUIP // CHOMPStation Edit Starts
|
||||
use_power = USE_POWER_ACTIVE
|
||||
use_power = USE_POWER_ACTIVE
|
||||
active_power_usage = 5 KILOWATTS // CHOMPStation Edit Ends
|
||||
density = TRUE
|
||||
anchored = TRUE
|
||||
@@ -141,6 +141,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
var/rotation_speed = 4.5 SECONDS //How quickly we turn to face threats
|
||||
var/datum/weakref/engaging = null // The meteor we're shooting at
|
||||
var/id_tag = null
|
||||
var/fire_sounds = list('sound/weapons/frigate_turret/frigate_turret_fire1.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire2.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire3.ogg', 'sound/weapons/frigate_turret/frigate_turret_fire4.ogg') // CHOMPEdit: Pew
|
||||
|
||||
/obj/machinery/pointdefense/Initialize()
|
||||
. = ..()
|
||||
@@ -208,7 +209,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
var/Angle = round(Get_Angle(src,M))
|
||||
var/matrix/rot_matrix = matrix()
|
||||
rot_matrix.Turn(Angle)
|
||||
addtimer(CALLBACK(src, .proc/finish_shot, target), rotation_speed)
|
||||
addtimer(CALLBACK(src, PROC_REF(finish_shot), target), rotation_speed)
|
||||
animate(src, transform = rot_matrix, rotation_speed, easing = SINE_EASING)
|
||||
|
||||
set_dir(ATAN2(transform.b, transform.a) > 0 ? NORTH : SOUTH)
|
||||
@@ -224,10 +225,12 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
if(!istype(M))
|
||||
return
|
||||
//We throw a laser but it doesnt have to hit for meteor to explode
|
||||
var/obj/item/projectile/beam/pointdefense/beam = new(get_turf(src))
|
||||
playsound(src, 'sound/weapons/mandalorian.ogg', 75, 1)
|
||||
var/obj/item/projectile/beam/coildefense/coil = new(get_turf(src))
|
||||
playsound(src, fire_sounds, 75, 1, 40, pressure_affected = FALSE, ignore_walls = TRUE) // CHOMPEdit: Pew
|
||||
use_power_oneoff(idle_power_usage * 10)
|
||||
beam.launch_projectile(target = M.loc, user = src)
|
||||
coil.launch_projectile(target = M.loc, user = src) // CHOMPEdit: Changing "beam" var to "coil" for the new coilgun type point defense turrets (to match the coilgun sprite and sfx names)
|
||||
spawn(10)
|
||||
playsound(src, fire_sounds, 75, 1, 40, pressure_affected = FALSE, ignore_walls = TRUE) // CHOMPEdit: Pew
|
||||
|
||||
/obj/machinery/pointdefense/process()
|
||||
..()
|
||||
@@ -269,7 +272,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/pointdefense)
|
||||
engaging = target
|
||||
Shoot(target)
|
||||
return
|
||||
|
||||
|
||||
// Then, focus fire on existing targets
|
||||
for(var/obj/effect/meteor/M in existing_targets)
|
||||
if(targeting_check(M))
|
||||
|
||||
@@ -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, "<span class='danger'>The suit cycler is locked.</span>")
|
||||
return
|
||||
|
||||
if(contents.len > 0)
|
||||
to_chat(user, "<span class='danger'>There is no room inside the cycler for [G.affecting.name].</span>")
|
||||
return
|
||||
|
||||
visible_message("<span class='notice'>[user] starts putting [G.affecting.name] into the suit cycler.</span>", 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, "<span class='danger'>The suit cycler is locked.</span>")
|
||||
return
|
||||
|
||||
if(helmet)
|
||||
to_chat(user, "<span class='danger'>The cycler already contains a helmet.</span>")
|
||||
return
|
||||
|
||||
if(IH.no_cycle)
|
||||
to_chat(user, "<span class='danger'>That item is not compatible with the cycler's protocols.</span>")
|
||||
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, "<span class='danger'>The suit cycler is locked.</span>")
|
||||
return
|
||||
|
||||
if(suit)
|
||||
to_chat(user, "<span class='danger'>The cycler already contains a voidsuit.</span>")
|
||||
return
|
||||
|
||||
if(IS.no_cycle)
|
||||
to_chat(user, "<span class='danger'>That item is not compatible with the cycler's protocols.</span>")
|
||||
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, "<span class='danger'>The cycler has already been subverted.</span>")
|
||||
return
|
||||
|
||||
//Clear the access reqs, disable the safeties, and open up all paintjobs.
|
||||
to_chat(user, "<span class='danger'>You run the sequencer across the interface, corrupting the operating protocols.</span>")
|
||||
|
||||
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, "<span class='danger'>Access denied.</span>")
|
||||
. = TRUE
|
||||
|
||||
if("eject_guy")
|
||||
eject_occupant(usr)
|
||||
. = TRUE
|
||||
|
||||
if("uv")
|
||||
if(safeties && occupant)
|
||||
to_chat(usr, "<span class='danger'>The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.</span>")
|
||||
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)]<span class='notice'>The [src] beeps several times.</span>")
|
||||
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, "<span class='warning'>The cycler is locked.</span>")
|
||||
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)]<span class='warning'>Unable to apply specified cosmetics with specified species. Please try again with a different species or cosmetic option selected.</span>")
|
||||
return
|
||||
@@ -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
|
||||
)
|
||||
+9
@@ -9,53 +9,62 @@
|
||||
/obj/machinery/suit_cycler/captain
|
||||
name = "Manager suit cycler"
|
||||
model_text = "Manager"
|
||||
icon_state = "cap_cycler"
|
||||
req_access = list(access_captain)
|
||||
departments = list(/datum/suit_cycler_choice/department/captain)
|
||||
|
||||
/obj/machinery/suit_cycler/prototype
|
||||
name = "Prototype suit cycler"
|
||||
model_text = "Prototype"
|
||||
icon_state = "industrial_cycler"
|
||||
req_access = list(access_hos)
|
||||
departments = list(/datum/suit_cycler_choice/department/prototype)
|
||||
|
||||
/obj/machinery/suit_cycler/vintage/tcrew
|
||||
name = "Talon crew suit cycler"
|
||||
model_text = "Talon crew"
|
||||
icon_state = "dark_cycler"
|
||||
req_access = list(access_talon)
|
||||
departments = list(/datum/suit_cycler_choice/department/talon/crew)
|
||||
|
||||
/obj/machinery/suit_cycler/vintage/tpilot
|
||||
name = "Talon pilot suit cycler"
|
||||
model_text = "Talon pilot"
|
||||
icon_state = "dark_cycler"
|
||||
req_access = list(access_talon)
|
||||
departments = list(/datum/suit_cycler_choice/department/talon/pilot)
|
||||
|
||||
/obj/machinery/suit_cycler/vintage/tengi
|
||||
name = "Talon engineer suit cycler"
|
||||
model_text = "Talon engineer"
|
||||
icon_state = "dark_cycler"
|
||||
req_access = list(access_talon)
|
||||
departments = list(/datum/suit_cycler_choice/department/talon/eng)
|
||||
|
||||
/obj/machinery/suit_cycler/vintage/tguard
|
||||
name = "Talon guard suit cycler"
|
||||
model_text = "Talon guard"
|
||||
icon_state = "dark_cycler"
|
||||
req_access = list(access_talon)
|
||||
departments = list(/datum/suit_cycler_choice/department/talon/marine)
|
||||
|
||||
/obj/machinery/suit_cycler/vintage/tmedic
|
||||
name = "Talon doctor suit cycler"
|
||||
model_text = "Talon doctor"
|
||||
icon_state = "dark_cycler"
|
||||
req_access = list(access_talon)
|
||||
departments = list(/datum/suit_cycler_choice/department/talon/med)
|
||||
|
||||
/obj/machinery/suit_cycler/vintage/tcaptain
|
||||
name = "Talon captain suit cycler"
|
||||
model_text = "Talon captain"
|
||||
icon_state = "dark_cycler"
|
||||
req_access = list(access_talon)
|
||||
departments = list(/datum/suit_cycler_choice/department/talon/officer)
|
||||
|
||||
/obj/machinery/suit_cycler/vintage/tminer
|
||||
name = "Talon miner suit cycler"
|
||||
model_text = "Talon miner"
|
||||
icon_state = "dark_cycler"
|
||||
req_access = list(access_talon)
|
||||
departments = list(/datum/suit_cycler_choice/department/talon/miner)
|
||||
@@ -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, "<font color='red'>Unable to open unit.</font>")
|
||||
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, "<font color='red'>The Unit's safety protocols disallow locking when a biological form is detected inside its compartments.</font>")
|
||||
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, "<font color='red'><B>WARNING:</B> Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle.</font>")
|
||||
return
|
||||
if(!HELMET && !MASK && !SUIT && !OCCUPANT) //shit's empty yo
|
||||
to_chat(user, "<font color='red'>Unit storage bays empty. Nothing to disinfect -- Aborting.</font>")
|
||||
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("<font color='red'>With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.</font>", 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, "<font color='blue'>The machine kicks you out!</font>")
|
||||
if(user.loc != src.loc)
|
||||
to_chat(OCCUPANT, "<font color='blue'>You leave the not-so-cozy confines of the SSU.</font>")
|
||||
|
||||
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, "<font color='red'>The unit's doors are shut.</font>")
|
||||
return
|
||||
if(!ispowered || isbroken)
|
||||
to_chat(usr, "<font color='red'>The unit is not operational.</font>")
|
||||
return
|
||||
if((OCCUPANT) || (HELMET) || (SUIT))
|
||||
to_chat(usr, "<font color='red'>It's too cluttered inside for you to fit in!</font>")
|
||||
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, "<font color='blue'>You [panelopen ? "open up" : "close"] the unit's maintenance panel.</font>")
|
||||
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, "<font color='red'>The unit's doors are shut.</font>")
|
||||
return
|
||||
if(!ispowered || isbroken)
|
||||
to_chat(user, "<font color='red'>The unit is not operational.</font>")
|
||||
return
|
||||
if((OCCUPANT) || (HELMET) || (SUIT)) //Unit needs to be absolutely empty
|
||||
to_chat(user, "<font color='red'>The unit's storage area is too cluttered.</font>")
|
||||
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, "<font color='blue'>The unit already contains a suit.</font>")
|
||||
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, "<font color='blue'>The unit already contains a helmet.</font>")
|
||||
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, "<font color='blue'>The unit already contains a mask.</font>")
|
||||
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
|
||||
@@ -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
|
||||
File diff suppressed because it is too large
Load Diff
@@ -114,6 +114,6 @@
|
||||
var/drop_x = src.x - 2
|
||||
var/drop_y = src.y - 2
|
||||
var/drop_z = src.z
|
||||
command_announcement.Announce("[using_map.starsys_name] Rapid Fabrication priority supply request #[rand(1000,9999)]-[rand(100,999)] recieved. Shipment dispatched via ballistic supply pod for immediate delivery. Have a nice day.", "Thank You For Your Patronage")
|
||||
command_announcement.Announce("[using_map.starsys_name] Rapid Fabrication priority supply request #[rand(1000,9999)]-[rand(100,999)] received. Shipment dispatched via ballistic supply pod for immediate delivery. Have a nice day.", "Thank You For Your Patronage")
|
||||
spawn(rand(100, 300))
|
||||
new /datum/random_map/droppod/supply(null, drop_x, drop_y, drop_z, supplied_drop = drop_type) // Splat.
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
traitors.spawn_uplink(N)
|
||||
N.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT
|
||||
N.mind.accept_tcrystals = 1
|
||||
message_admins("[N]/([N.ckey]) has recieved an uplink and telecrystals from the syndicate beacon.")
|
||||
message_admins("[N]/([N.ckey]) has received an uplink and telecrystals from the syndicate beacon.")
|
||||
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
@@ -37,6 +37,8 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
var/hide = 0 // Is it a hidden machine?
|
||||
var/listening_level = 0 // 0 = auto set in New() - this is the z level that the machine is listening to.
|
||||
|
||||
var/datum/looping_sound/tcomms/soundloop // CHOMPStation Add: Hummy noises
|
||||
var/noisy = TRUE // CHOMPStation Add: Hummy noises, this starts on
|
||||
|
||||
/obj/machinery/telecomms/proc/relay_information(datum/signal/signal, filter, copysig, amount = 20)
|
||||
// relay signal to all linked machinery that are of type [filter]. If signal has been sent [amount] times, stop sending
|
||||
@@ -132,6 +134,20 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
else
|
||||
for(var/obj/machinery/telecomms/T in telecomms_list)
|
||||
add_link(T)
|
||||
// CHOMPAdd: TComms humming
|
||||
soundloop = new(list(src), FALSE)
|
||||
if(prob(60)) // 60% chance to change the midloop
|
||||
if(prob(40))
|
||||
soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_02.ogg' = 1)
|
||||
soundloop.mid_length = 40
|
||||
else if(prob(20))
|
||||
soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_03.ogg' = 1)
|
||||
soundloop.mid_length = 10
|
||||
else
|
||||
soundloop.mid_sounds = list('sound/machines/tcomms/tcomms_04.ogg' = 1)
|
||||
soundloop.mid_length = 30
|
||||
soundloop.start()
|
||||
// CHOMPAdd End
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/telecomms/Destroy()
|
||||
@@ -139,6 +155,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
for(var/obj/machinery/telecomms/comm in telecomms_list)
|
||||
comm.links -= src
|
||||
links = list()
|
||||
QDEL_NULL(soundloop) // CHOMPAdd: Tcomms noises
|
||||
..()
|
||||
|
||||
// Used in auto linking
|
||||
@@ -162,10 +179,17 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
if(toggled)
|
||||
if(stat & (BROKEN|NOPOWER|EMPED) || integrity <= 0) // if powered, on. if not powered, off. if too damaged, off
|
||||
on = 0
|
||||
soundloop.stop() // CHOMPAdd: Tcomms noises
|
||||
noisy = FALSE
|
||||
else
|
||||
on = 1
|
||||
else
|
||||
on = 0
|
||||
soundloop.stop() // CHOMPAdd: Tcomms noises
|
||||
noisy = FALSE
|
||||
if(!noisy) // CHOMPAdd: Tcomms noises
|
||||
soundloop.start() // CHOMPAdd: Tcomms noises
|
||||
noisy = TRUE
|
||||
|
||||
/obj/machinery/telecomms/process()
|
||||
update_power()
|
||||
@@ -183,6 +207,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list()
|
||||
if(prob(100/severity))
|
||||
if(!(stat & EMPED))
|
||||
stat |= EMPED
|
||||
playsound(src, 'sound/machines/tcomms/tcomms_pulse.ogg', 70, 1, 30) // CHOMPAdd: Tcomms noises
|
||||
var/duration = (300 * 10)/severity
|
||||
spawn(rand(duration - 20, duration + 20)) // Takes a long time for the machines to reboot.
|
||||
stat &= ~EMPED
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
*/
|
||||
/obj/effect/alien
|
||||
name = "alien thing"
|
||||
desc = "theres something alien about this"
|
||||
desc = "there's something alien about this"
|
||||
icon = 'icons/mob/alien.dmi'
|
||||
|
||||
/*
|
||||
@@ -289,3 +289,5 @@
|
||||
if(0 to 1)
|
||||
visible_message("<span class='alium'>[src.target] begins to crumble under the acid!</span>")
|
||||
spawn(rand(150, 200)) tick()
|
||||
|
||||
//Xenomorph Effect egg removed, replaced with Structure Egg.
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -102,4 +102,12 @@
|
||||
light_color = "#80F5FF"
|
||||
//VOREStation edit ends
|
||||
/obj/effect/projectile/impact/pointdefense
|
||||
icon_state = "impact_pointdef"
|
||||
icon_state = "impact_pointdef"
|
||||
//CHOMPStation add coilgun pointdefense
|
||||
/obj/effect/projectile/impact/coildefense
|
||||
icon = 'icons/obj/projectiles_impact_ch.dmi'
|
||||
icon_state = "impact_coildef"
|
||||
light_range = 2
|
||||
light_power = 3
|
||||
light_color = "#FFFFFF"
|
||||
//CHOMPStation add end <3
|
||||
|
||||
@@ -114,4 +114,12 @@
|
||||
light_color = "#80F5FF"
|
||||
//VOREStation edit ends
|
||||
/obj/effect/projectile/muzzle/pointdefense
|
||||
icon_state = "muzzle_pointdef"
|
||||
icon_state = "muzzle_pointdef"
|
||||
//CHOMPStation add coilgun pointdefense
|
||||
/obj/effect/projectile/muzzle/coildefense
|
||||
icon = 'icons/obj/projectiles_muzzle_ch.dmi'
|
||||
icon_state = "muzzle_coildef"
|
||||
light_range = 3
|
||||
light_power = 1
|
||||
light_color = "#FFFFFF"
|
||||
//CHOMPStation add end <3
|
||||
|
||||
@@ -141,4 +141,12 @@
|
||||
light_color = "#80F5FF"
|
||||
//VOREStation edit ends
|
||||
/obj/effect/projectile/tracer/pointdefense
|
||||
icon_state = "beam_pointdef"
|
||||
icon_state = "beam_pointdef"
|
||||
//CHOMPStation add coilgun pointdefense
|
||||
/obj/effect/projectile/tracer/coildefense
|
||||
icon = 'icons/obj/projectiles_tracer_ch.dmi'
|
||||
icon_state = "tracer_coildef"
|
||||
light_range = 1
|
||||
light_power = 2
|
||||
light_color = "#FFFFFF"
|
||||
//CHOMPStation add end <3
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user