Merge branch 'CHOMPStation2:master' into BaseBlep

This commit is contained in:
FluffMedic
2023-06-23 09:03:13 -04:00
committed by GitHub
1209 changed files with 53700 additions and 25158 deletions
+9
View File
@@ -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 */;
+74
View File
@@ -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
-33
View File
@@ -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
+2
View File
@@ -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
View File
@@ -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"
+1
View File
@@ -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"
+3 -3
View File
@@ -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
View File
@@ -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]")
+33
View File
@@ -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)
+1 -1
View File
@@ -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"))
+2
View File
@@ -0,0 +1,2 @@
GLOBAL_VAR_INIT(year, time2text(world.realtime,"YYYY"))
GLOBAL_VAR_INIT(year_integer, text2num(year)) // = 2013???
+3 -3
View File
@@ -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.
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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)
-24
View File
@@ -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()
+3 -3
View File
@@ -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)
+1 -1
View File
@@ -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()
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+6 -6
View File
@@ -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
+2 -2
View File
@@ -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 ..()
+2 -2
View File
@@ -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)
+5 -5
View File
@@ -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]")
+5 -5
View File
@@ -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
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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()
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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))
+7 -7
View File
@@ -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 = "*&nbsp;[text]&nbsp;*"
@@ -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
+16 -16
View File
@@ -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
+4 -4
View File
@@ -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)
+31 -31
View File
@@ -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]
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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)
++.
++.
+1 -1
View File
@@ -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
+4 -4
View File
@@ -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
+3 -2
View File
@@ -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
+3 -3
View File
@@ -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."
+4 -3
View File
@@ -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
+22 -3
View File
@@ -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
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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))
+2 -2
View File
@@ -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
+2 -3
View File
@@ -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)
+1 -1
View File
@@ -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"
+2 -2
View File
@@ -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"
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+7 -6
View File
@@ -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
+1 -1
View File
@@ -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()
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
..()
+1 -1
View File
@@ -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()
+2 -2
View File
@@ -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)
+1
View File
@@ -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
+1 -1
View File
@@ -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()
+3 -3
View File
@@ -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))
+28
View File
@@ -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()
+2 -3
View File
@@ -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()
+3 -3
View File
@@ -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)
+28
View File
@@ -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()
+9 -6
View File
@@ -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,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
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+3 -1
View File
@@ -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.
+3 -3
View File
@@ -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()
+2 -2
View File
@@ -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