mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 09:54:52 +00:00
Merge remote-tracking branch 'origin/master' into TGUI-CHAT-TGUI-CHAT-TGUI-CHAT
This commit is contained in:
Binary file not shown.
@@ -312,6 +312,7 @@
|
|||||||
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
|
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
|
||||||
#define COMSIG_OBJ_BREAK "obj_break" //from base of /obj/obj_break(): (damage_flag)
|
#define COMSIG_OBJ_BREAK "obj_break" //from base of /obj/obj_break(): (damage_flag)
|
||||||
#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value)
|
#define COMSIG_OBJ_SETANCHORED "obj_setanchored" //called in /obj/structure/setAnchored(): (value)
|
||||||
|
#define COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH "obj_default_unfasten_wrench" //called exclusively in plumbing, for now
|
||||||
#define COMSIG_OBJ_ATTACK_GENERIC "obj_attack_generic" //from base of atom/animal_attack(): (/mob/user)
|
#define COMSIG_OBJ_ATTACK_GENERIC "obj_attack_generic" //from base of atom/animal_attack(): (/mob/user)
|
||||||
#define COMPONENT_STOP_GENERIC_ATTACK 1
|
#define COMPONENT_STOP_GENERIC_ATTACK 1
|
||||||
|
|
||||||
|
|||||||
9
code/__DEFINES/plumbing.dm
Normal file
9
code/__DEFINES/plumbing.dm
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#define FIRST_DUCT_LAYER 1
|
||||||
|
#define SECOND_DUCT_LAYER 2
|
||||||
|
#define THIRD_DUCT_LAYER 4
|
||||||
|
#define FOURTH_DUCT_LAYER 8
|
||||||
|
#define FIFTH_DUCT_LAYER 16
|
||||||
|
|
||||||
|
#define DUCT_LAYER_DEFAULT THIRD_DUCT_LAYER
|
||||||
|
|
||||||
|
#define MACHINE_REAGENT_TRANSFER 10
|
||||||
@@ -8,5 +8,5 @@
|
|||||||
GLOBAL_LIST_INIT(blacklisted_pool_reagents, list(
|
GLOBAL_LIST_INIT(blacklisted_pool_reagents, list(
|
||||||
/datum/reagent/toxin/plasma, /datum/reagent/oxygen, /datum/reagent/nitrous_oxide, /datum/reagent/nitrogen, //gases
|
/datum/reagent/toxin/plasma, /datum/reagent/oxygen, /datum/reagent/nitrous_oxide, /datum/reagent/nitrogen, //gases
|
||||||
/datum/reagent/fermi, //blanket fermichem ban sorry. this also covers mkultra, genital enlargers, etc etc.
|
/datum/reagent/fermi, //blanket fermichem ban sorry. this also covers mkultra, genital enlargers, etc etc.
|
||||||
/datum/reagent/consumable/femcum, /datum/reagent/consumable/semen //NO.
|
/datum/reagent/consumable/semen //NO.
|
||||||
))
|
))
|
||||||
|
|||||||
@@ -6,10 +6,17 @@
|
|||||||
#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
|
#define QDEL_HINT_IWILLGC 2 //functionally the same as the above. qdel should assume the object will gc on its own, and not check it.
|
||||||
#define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference.
|
#define QDEL_HINT_HARDDEL 3 //qdel should assume this object won't gc, and queue a hard delete using a hard reference.
|
||||||
#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste.
|
#define QDEL_HINT_HARDDEL_NOW 4 //qdel should assume this object won't gc, and hard del it post haste.
|
||||||
#define QDEL_HINT_FINDREFERENCE 5 //functionally identical to QDEL_HINT_QUEUE if TESTING is not enabled in _compiler_options.dm.
|
|
||||||
//if TESTING is enabled, qdel will call this object's find_references() verb.
|
#ifdef LEGACY_REFERENCE_TRACKING
|
||||||
#define QDEL_HINT_IFFAIL_FINDREFERENCE 6 //Above but only if gc fails.
|
/** If LEGACY_REFERENCE_TRACKING is enabled, qdel will call this object's find_references() verb.
|
||||||
//defines for the gc_destroyed var
|
*
|
||||||
|
* Functionally identical to QDEL_HINT_QUEUE if GC_FAILURE_HARD_LOOKUP is not enabled in _compiler_options.dm.
|
||||||
|
*/
|
||||||
|
#define QDEL_HINT_FINDREFERENCE 5
|
||||||
|
/// Behavior as QDEL_HINT_FINDREFERENCE, but only if the GC fails and a hard delete is forced.
|
||||||
|
#define QDEL_HINT_IFFAIL_FINDREFERENCE 6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define GC_QUEUE_CHECK 1
|
#define GC_QUEUE_CHECK 1
|
||||||
#define GC_QUEUE_HARDDELETE 2
|
#define GC_QUEUE_HARDDELETE 2
|
||||||
|
|||||||
@@ -57,6 +57,10 @@
|
|||||||
#define ADD_REAGENT 2 // reagent added
|
#define ADD_REAGENT 2 // reagent added
|
||||||
#define REM_REAGENT 3 // reagent removed (may still exist)
|
#define REM_REAGENT 3 // reagent removed (may still exist)
|
||||||
|
|
||||||
|
|
||||||
|
#define PILL_STYLE_COUNT 22 //Update this if you add more pill icons or you die (literally, we'll toss a nuke at whever your ip turns up)
|
||||||
|
#define RANDOM_PILL_STYLE 22 //Dont change this one though
|
||||||
|
|
||||||
#define THRESHOLD_UNHUSK 50 // health threshold for synthflesh/rezadone to unhusk someone
|
#define THRESHOLD_UNHUSK 50 // health threshold for synthflesh/rezadone to unhusk someone
|
||||||
|
|
||||||
//reagent bitflags, used for altering how they works
|
//reagent bitflags, used for altering how they works
|
||||||
|
|||||||
@@ -75,6 +75,7 @@
|
|||||||
#define VV_HK_MARK "mark"
|
#define VV_HK_MARK "mark"
|
||||||
#define VV_HK_ADDCOMPONENT "addcomponent"
|
#define VV_HK_ADDCOMPONENT "addcomponent"
|
||||||
#define VV_HK_MODIFY_TRAITS "modtraits"
|
#define VV_HK_MODIFY_TRAITS "modtraits"
|
||||||
|
#define VV_HK_VIEW_REFERENCES "viewreferences"
|
||||||
|
|
||||||
// /datum/gas_mixture
|
// /datum/gas_mixture
|
||||||
#define VV_HK_SET_MOLES "set_moles"
|
#define VV_HK_SET_MOLES "set_moles"
|
||||||
|
|||||||
@@ -37,10 +37,10 @@
|
|||||||
//CIT CHANGES START HERE, ADDS SNOWFLAKE BODYPARTS AND MORE
|
//CIT CHANGES START HERE, ADDS SNOWFLAKE BODYPARTS AND MORE
|
||||||
//mammal bodyparts (fucking furries)
|
//mammal bodyparts (fucking furries)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/mam_tails, GLOB.mam_tails_list)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/ears/mam_ears, GLOB.mam_ears_list)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_snouts, GLOB.mam_snouts_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts/mam_snouts, GLOB.mam_snouts_list)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails_animated, GLOB.mam_tails_animated_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/mam_tails_animated, GLOB.mam_tails_animated_list)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/taur, GLOB.taur_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/taur, GLOB.taur_list)
|
||||||
//xeno parts (hiss?)
|
//xeno parts (hiss?)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_head, GLOB.xeno_head_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/xeno_head, GLOB.xeno_head_list)
|
||||||
|
|||||||
@@ -93,16 +93,16 @@
|
|||||||
if(!GLOB.mam_body_markings_list.len)
|
if(!GLOB.mam_body_markings_list.len)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list)
|
||||||
if(!GLOB.mam_tails_list.len)
|
if(!GLOB.mam_tails_list.len)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/mam_tails, GLOB.mam_tails_list)
|
||||||
if(!GLOB.mam_ears_list.len)
|
if(!GLOB.mam_ears_list.len)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/ears/mam_ears, GLOB.mam_ears_list)
|
||||||
if(!GLOB.mam_snouts_list.len)
|
if(!GLOB.mam_snouts_list.len)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_snouts, GLOB.mam_snouts_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts/mam_snouts, GLOB.mam_snouts_list)
|
||||||
|
|
||||||
//snowflake check so people's ckey features don't get randomly put on unmonkeys/spawns
|
//snowflake check so people's ckey features don't get randomly put on unmonkeys/spawns
|
||||||
var/list/snowflake_mam_tails_list = list()
|
var/list/snowflake_mam_tails_list = list()
|
||||||
for(var/mtpath in GLOB.mam_tails_list)
|
for(var/mtpath in GLOB.mam_tails_list)
|
||||||
var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[mtpath]
|
var/datum/sprite_accessory/tails/mam_tails/instance = GLOB.mam_tails_list[mtpath]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
snowflake_markings_list[S.name] = mmpath
|
snowflake_markings_list[S.name] = mmpath
|
||||||
var/list/snowflake_ears_list = list()
|
var/list/snowflake_ears_list = list()
|
||||||
for(var/mepath in GLOB.mam_ears_list)
|
for(var/mepath in GLOB.mam_ears_list)
|
||||||
var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[mepath]
|
var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[mepath]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
||||||
@@ -129,7 +129,7 @@
|
|||||||
snowflake_ears_list[S.name] = mepath
|
snowflake_ears_list[S.name] = mepath
|
||||||
var/list/snowflake_mam_snouts_list = list()
|
var/list/snowflake_mam_snouts_list = list()
|
||||||
for(var/mspath in GLOB.mam_snouts_list)
|
for(var/mspath in GLOB.mam_snouts_list)
|
||||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[mspath]
|
var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.mam_snouts_list[mspath]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
||||||
@@ -138,7 +138,7 @@
|
|||||||
snowflake_mam_snouts_list[S.name] = mspath
|
snowflake_mam_snouts_list[S.name] = mspath
|
||||||
var/list/snowflake_ipc_antenna_list = list()
|
var/list/snowflake_ipc_antenna_list = list()
|
||||||
for(var/mspath in GLOB.ipc_antennas_list)
|
for(var/mspath in GLOB.ipc_antennas_list)
|
||||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.ipc_antennas_list[mspath]
|
var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.ipc_antennas_list[mspath]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
|
||||||
|
|||||||
@@ -11,15 +11,28 @@
|
|||||||
#ifdef TESTING
|
#ifdef TESTING
|
||||||
#define DATUMVAR_DEBUGGING_MODE
|
#define DATUMVAR_DEBUGGING_MODE
|
||||||
|
|
||||||
//#define GC_FAILURE_HARD_LOOKUP //makes paths that fail to GC call find_references before del'ing.
|
/*
|
||||||
//implies FIND_REF_NO_CHECK_TICK
|
* Enables extools-powered reference tracking system, letting you see what is referencing objects that refuse to hard delete.
|
||||||
|
*
|
||||||
|
* * Requires TESTING to be defined to work.
|
||||||
|
*/
|
||||||
|
//#define REFERENCE_TRACKING
|
||||||
|
|
||||||
//#define FIND_REF_NO_CHECK_TICK //Sets world.loop_checks to false and prevents find references from sleeping
|
///Method of tracking references without using extools. Slower, kept to avoid over-reliance on extools.
|
||||||
|
//#define LEGACY_REFERENCE_TRACKING
|
||||||
|
#ifdef LEGACY_REFERENCE_TRACKING
|
||||||
|
|
||||||
|
///Use the legacy reference on things hard deleting by default.
|
||||||
|
//#define GC_FAILURE_HARD_LOOKUP
|
||||||
|
#ifdef GC_FAILURE_HARD_LOOKUP
|
||||||
|
#define FIND_REF_NO_CHECK_TICK
|
||||||
|
#endif //ifdef GC_FAILURE_HARD_LOOKUP
|
||||||
|
|
||||||
|
#endif //ifdef LEGACY_REFERENCE_TRACKING
|
||||||
|
|
||||||
//#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green
|
//#define VISUALIZE_ACTIVE_TURFS //Highlights atmos active turfs in green
|
||||||
#endif
|
|
||||||
|
|
||||||
|
#endif //ifdef TESTING
|
||||||
//#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETER
|
//#define UNIT_TESTS //Enables unit tests via TEST_RUN_PARAMETER
|
||||||
|
|
||||||
#ifndef PRELOAD_RSC //set to:
|
#ifndef PRELOAD_RSC //set to:
|
||||||
|
|||||||
@@ -40,6 +40,46 @@ GLOBAL_LIST_EMPTY(insect_fluffs_list)
|
|||||||
GLOBAL_LIST_EMPTY(insect_markings_list)
|
GLOBAL_LIST_EMPTY(insect_markings_list)
|
||||||
GLOBAL_LIST_EMPTY(caps_list)
|
GLOBAL_LIST_EMPTY(caps_list)
|
||||||
|
|
||||||
|
//a way to index the right bodypart list given the type of bodypart
|
||||||
|
GLOBAL_LIST_INIT(mutant_reference_list, list(
|
||||||
|
"tail_lizard" = GLOB.tails_list_lizard,
|
||||||
|
"waggingtail_lizard" = GLOB.animated_tails_list_lizard,
|
||||||
|
"tail_human" = GLOB.tails_list_human,
|
||||||
|
"waggingtail_human" = GLOB.animated_tails_list_human,
|
||||||
|
"spines" = GLOB.spines_list,
|
||||||
|
"waggingspines" = GLOB.animated_spines_list,
|
||||||
|
"snout" = GLOB.snouts_list,
|
||||||
|
"frills" = GLOB.frills_list,
|
||||||
|
"horns" = GLOB.horns_list,
|
||||||
|
"ears" = GLOB.ears_list,
|
||||||
|
"body_markings" = GLOB.body_markings_list,
|
||||||
|
"wings" = GLOB.wings_list,
|
||||||
|
"wingsopen" = GLOB.wings_open_list,
|
||||||
|
"deco_wings" = GLOB.deco_wings_list,
|
||||||
|
"legs" = GLOB.legs_list,
|
||||||
|
"insect_wings" = GLOB.insect_wings_list,
|
||||||
|
"insect_fluff" = GLOB.insect_fluffs_list,
|
||||||
|
"insect_markings" = GLOB.insect_markings_list,
|
||||||
|
"caps" = GLOB.caps_list,
|
||||||
|
"ipc_screen" = GLOB.ipc_screens_list,
|
||||||
|
"ipc_antenna" = GLOB.ipc_antennas_list,
|
||||||
|
"mam_tail" = GLOB.mam_tails_list,
|
||||||
|
"mam_waggingtail" = GLOB.mam_tails_animated_list,
|
||||||
|
"mam_body_markings" = GLOB.mam_body_markings_list,
|
||||||
|
"mam_ears" = GLOB.mam_ears_list,
|
||||||
|
"mam_snouts" = GLOB.mam_snouts_list,
|
||||||
|
"taur" = GLOB.taur_list,
|
||||||
|
"xenodorsal" = GLOB.xeno_dorsal_list,
|
||||||
|
"xenohead" = GLOB.xeno_head_list,
|
||||||
|
"xenotail" = GLOB.xeno_tail_list))
|
||||||
|
|
||||||
|
//references wag types to regular types, wings open to wings, etc
|
||||||
|
GLOBAL_LIST_INIT(mutant_transform_list, list("wingsopen" = "wings",
|
||||||
|
"waggingtail_human" = "tail_human",
|
||||||
|
"waggingtail_lizard" = "tail_lizard",
|
||||||
|
"waggingspines" = "spines",
|
||||||
|
"mam_waggingtail" = "mam_tail"))
|
||||||
|
|
||||||
GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites
|
GLOBAL_LIST_INIT(ghost_forms_with_directions_list, list("ghost")) //stores the ghost forms that support directional sprites
|
||||||
GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list("ghost")) //stores the ghost forms that support hair and other such things
|
GLOBAL_LIST_INIT(ghost_forms_with_accessories_list, list("ghost")) //stores the ghost forms that support hair and other such things
|
||||||
|
|
||||||
|
|||||||
@@ -534,4 +534,4 @@
|
|||||||
config_entry_value = 6
|
config_entry_value = 6
|
||||||
|
|
||||||
/datum/config_entry/number/max_shuttle_size
|
/datum/config_entry/number/max_shuttle_size
|
||||||
config_entry_value = 250
|
config_entry_value = 500
|
||||||
|
|||||||
5
code/controllers/subsystem/fluid.dm
Normal file
5
code/controllers/subsystem/fluid.dm
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
PROCESSING_SUBSYSTEM_DEF(fluids)
|
||||||
|
name = "Fluids"
|
||||||
|
wait = 20
|
||||||
|
stat_tag = "FD" //its actually Fluid Ducts
|
||||||
|
flags = SS_NO_INIT | SS_TICKER
|
||||||
@@ -25,7 +25,7 @@ SUBSYSTEM_DEF(garbage)
|
|||||||
//Queue
|
//Queue
|
||||||
var/list/queues
|
var/list/queues
|
||||||
|
|
||||||
#ifdef TESTING
|
#ifdef LEGACY_REFERENCE_TRACKING
|
||||||
var/list/reference_find_on_fail = list()
|
var/list/reference_find_on_fail = list()
|
||||||
var/list/reference_find_on_fail_types = list()
|
var/list/reference_find_on_fail_types = list()
|
||||||
#endif
|
#endif
|
||||||
@@ -134,7 +134,7 @@ SUBSYSTEM_DEF(garbage)
|
|||||||
++gcedlasttick
|
++gcedlasttick
|
||||||
++totalgcs
|
++totalgcs
|
||||||
pass_counts[level]++
|
pass_counts[level]++
|
||||||
#ifdef TESTING
|
#ifdef LEGACY_REFERENCE_TRACKING
|
||||||
reference_find_on_fail -= refID //It's deleted we don't care anymore.
|
reference_find_on_fail -= refID //It's deleted we don't care anymore.
|
||||||
#endif
|
#endif
|
||||||
if (MC_TICK_CHECK)
|
if (MC_TICK_CHECK)
|
||||||
@@ -145,7 +145,9 @@ SUBSYSTEM_DEF(garbage)
|
|||||||
fail_counts[level]++
|
fail_counts[level]++
|
||||||
switch (level)
|
switch (level)
|
||||||
if (GC_QUEUE_CHECK)
|
if (GC_QUEUE_CHECK)
|
||||||
#ifdef TESTING
|
#ifdef REFERENCE_TRACKING
|
||||||
|
D.find_references()
|
||||||
|
#elif defined(LEGACY_REFERENCE_TRACKING)
|
||||||
if(reference_find_on_fail[refID])
|
if(reference_find_on_fail[refID])
|
||||||
D.find_references()
|
D.find_references()
|
||||||
#ifdef GC_FAILURE_HARD_LOOKUP
|
#ifdef GC_FAILURE_HARD_LOOKUP
|
||||||
@@ -156,7 +158,19 @@ SUBSYSTEM_DEF(garbage)
|
|||||||
#endif
|
#endif
|
||||||
var/type = D.type
|
var/type = D.type
|
||||||
var/datum/qdel_item/I = items[type]
|
var/datum/qdel_item/I = items[type]
|
||||||
|
#ifdef TESTING
|
||||||
|
log_world("## TESTING: GC: -- \ref[D] | [type] was unable to be GC'd --")
|
||||||
|
for(var/c in GLOB.admins) //Using testing() here would fill the logs with ADMIN_VV garbage
|
||||||
|
var/client/admin = c
|
||||||
|
if(!check_rights_for(admin, R_ADMIN))
|
||||||
|
continue
|
||||||
|
to_chat(admin, "## TESTING: GC: -- [ADMIN_VV(D)] | [type] was unable to be GC'd --")
|
||||||
testing("GC: -- \ref[src] | [type] was unable to be GC'd --")
|
testing("GC: -- \ref[src] | [type] was unable to be GC'd --")
|
||||||
|
#endif
|
||||||
|
#ifdef REFERENCE_TRACKING
|
||||||
|
GLOB.deletion_failures += D //It should no longer be bothered by the GC, manual deletion only.
|
||||||
|
continue
|
||||||
|
#endif
|
||||||
I.failures++
|
I.failures++
|
||||||
if (GC_QUEUE_HARDDELETE)
|
if (GC_QUEUE_HARDDELETE)
|
||||||
HardDelete(D)
|
HardDelete(D)
|
||||||
@@ -181,7 +195,7 @@ SUBSYSTEM_DEF(garbage)
|
|||||||
var/gctime = world.time
|
var/gctime = world.time
|
||||||
var/refid = "\ref[D]"
|
var/refid = "\ref[D]"
|
||||||
|
|
||||||
#ifdef TESTING
|
#ifdef LEGACY_REFERENCE_TRACKING
|
||||||
if(reference_find_on_fail_types[D.type])
|
if(reference_find_on_fail_types[D.type])
|
||||||
reference_find_on_fail["\ref[D]"] = TRUE
|
reference_find_on_fail["\ref[D]"] = TRUE
|
||||||
#endif
|
#endif
|
||||||
@@ -193,7 +207,7 @@ SUBSYSTEM_DEF(garbage)
|
|||||||
|
|
||||||
queue[refid] = gctime
|
queue[refid] = gctime
|
||||||
|
|
||||||
#ifdef TESTING
|
#ifdef LEGACY_REFERENCE_TRACKING
|
||||||
/datum/controller/subsystem/garbage/proc/add_type_to_findref(type)
|
/datum/controller/subsystem/garbage/proc/add_type_to_findref(type)
|
||||||
if(!ispath(type))
|
if(!ispath(type))
|
||||||
return "NOT A VAILD PATH"
|
return "NOT A VAILD PATH"
|
||||||
@@ -260,12 +274,6 @@ SUBSYSTEM_DEF(garbage)
|
|||||||
/datum/qdel_item/New(mytype)
|
/datum/qdel_item/New(mytype)
|
||||||
name = "[mytype]"
|
name = "[mytype]"
|
||||||
|
|
||||||
#ifdef TESTING
|
|
||||||
/proc/qdel_and_find_ref_if_fail(datum/D, force = FALSE)
|
|
||||||
SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE
|
|
||||||
qdel(D, force)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Should be treated as a replacement for the 'del' keyword.
|
// Should be treated as a replacement for the 'del' keyword.
|
||||||
// Datums passed to this will be given a chance to clean up references to allow the GC to collect them.
|
// Datums passed to this will be given a chance to clean up references to allow the GC to collect them.
|
||||||
/proc/qdel(datum/D, force=FALSE, ...)
|
/proc/qdel(datum/D, force=FALSE, ...)
|
||||||
@@ -319,16 +327,13 @@ SUBSYSTEM_DEF(garbage)
|
|||||||
SSgarbage.Queue(D, GC_QUEUE_HARDDELETE)
|
SSgarbage.Queue(D, GC_QUEUE_HARDDELETE)
|
||||||
if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
|
if (QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste.
|
||||||
SSgarbage.HardDelete(D)
|
SSgarbage.HardDelete(D)
|
||||||
if (QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion.
|
#ifdef LEGACY_REFERENCE_TRACKING
|
||||||
|
if (QDEL_HINT_FINDREFERENCE) //qdel will, if LEGACY_REFERENCE_TRACKING is enabled, display all references to this object, then queue the object for deletion.
|
||||||
SSgarbage.Queue(D)
|
SSgarbage.Queue(D)
|
||||||
#ifdef TESTING
|
|
||||||
D.find_references()
|
|
||||||
#endif
|
|
||||||
if (QDEL_HINT_IFFAIL_FINDREFERENCE)
|
if (QDEL_HINT_IFFAIL_FINDREFERENCE)
|
||||||
SSgarbage.Queue(D)
|
SSgarbage.Queue(D)
|
||||||
#ifdef TESTING
|
|
||||||
SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE
|
SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE
|
||||||
#endif
|
#endif
|
||||||
else
|
else
|
||||||
#ifdef TESTING
|
#ifdef TESTING
|
||||||
if(!I.no_hint)
|
if(!I.no_hint)
|
||||||
@@ -339,119 +344,6 @@ SUBSYSTEM_DEF(garbage)
|
|||||||
else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
|
else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED)
|
||||||
CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic")
|
CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic")
|
||||||
|
|
||||||
#ifdef TESTING
|
|
||||||
|
|
||||||
/datum/verb/find_refs()
|
|
||||||
set category = "Debug"
|
|
||||||
set name = "Find References"
|
|
||||||
set src in world
|
|
||||||
|
|
||||||
find_references(FALSE)
|
|
||||||
|
|
||||||
/datum/proc/find_references(skip_alert)
|
|
||||||
running_find_references = type
|
|
||||||
if(usr && usr.client)
|
|
||||||
if(usr.client.running_find_references)
|
|
||||||
testing("CANCELLED search for references to a [usr.client.running_find_references].")
|
|
||||||
usr.client.running_find_references = null
|
|
||||||
running_find_references = null
|
|
||||||
//restart the garbage collector
|
|
||||||
SSgarbage.can_fire = 1
|
|
||||||
SSgarbage.next_fire = world.time + world.tick_lag
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!skip_alert)
|
|
||||||
if(alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") == "No")
|
|
||||||
running_find_references = null
|
|
||||||
return
|
|
||||||
|
|
||||||
//this keeps the garbage collector from failing to collect objects being searched for in here
|
|
||||||
SSgarbage.can_fire = 0
|
|
||||||
|
|
||||||
if(usr && usr.client)
|
|
||||||
usr.client.running_find_references = type
|
|
||||||
|
|
||||||
testing("Beginning search for references to a [type].")
|
|
||||||
last_find_references = world.time
|
|
||||||
|
|
||||||
DoSearchVar(GLOB) //globals
|
|
||||||
for(var/datum/thing in world) //atoms (don't beleive it's lies)
|
|
||||||
DoSearchVar(thing, "World -> [thing]")
|
|
||||||
|
|
||||||
for (var/datum/thing) //datums
|
|
||||||
DoSearchVar(thing, "World -> [thing]")
|
|
||||||
|
|
||||||
for (var/client/thing) //clients
|
|
||||||
DoSearchVar(thing, "World -> [thing]")
|
|
||||||
|
|
||||||
testing("Completed search for references to a [type].")
|
|
||||||
if(usr && usr.client)
|
|
||||||
usr.client.running_find_references = null
|
|
||||||
running_find_references = null
|
|
||||||
|
|
||||||
//restart the garbage collector
|
|
||||||
SSgarbage.can_fire = 1
|
|
||||||
SSgarbage.next_fire = world.time + world.tick_lag
|
|
||||||
|
|
||||||
/datum/verb/qdel_then_find_references()
|
|
||||||
set category = "Debug"
|
|
||||||
set name = "qdel() then Find References"
|
|
||||||
set src in world
|
|
||||||
|
|
||||||
qdel(src, TRUE) //Force.
|
|
||||||
if(!running_find_references)
|
|
||||||
find_references(TRUE)
|
|
||||||
|
|
||||||
/datum/verb/qdel_then_if_fail_find_references()
|
|
||||||
set category = "Debug"
|
|
||||||
set name = "qdel() then Find References if GC failure"
|
|
||||||
set src in world
|
|
||||||
|
|
||||||
qdel_and_find_ref_if_fail(src, TRUE)
|
|
||||||
|
|
||||||
/datum/proc/DoSearchVar(X, Xname, recursive_limit = 64)
|
|
||||||
if(usr && usr.client && !usr.client.running_find_references)
|
|
||||||
return
|
|
||||||
if (!recursive_limit)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(istype(X, /datum))
|
|
||||||
var/datum/D = X
|
|
||||||
if(D.last_find_references == last_find_references)
|
|
||||||
return
|
|
||||||
|
|
||||||
D.last_find_references = last_find_references
|
|
||||||
var/list/L = D.vars
|
|
||||||
|
|
||||||
for(var/varname in L)
|
|
||||||
if (varname == "vars")
|
|
||||||
continue
|
|
||||||
var/variable = L[varname]
|
|
||||||
|
|
||||||
if(variable == src)
|
|
||||||
testing("Found [src.type] \ref[src] in [D.type]'s [varname] var. [Xname]")
|
|
||||||
|
|
||||||
else if(islist(variable))
|
|
||||||
DoSearchVar(variable, "[Xname] -> list", recursive_limit-1)
|
|
||||||
|
|
||||||
else if(islist(X))
|
|
||||||
var/normal = IS_NORMAL_LIST(X)
|
|
||||||
for(var/I in X)
|
|
||||||
if (I == src)
|
|
||||||
testing("Found [src.type] \ref[src] in list [Xname].")
|
|
||||||
|
|
||||||
else if (I && !isnum(I) && normal && X[I] == src)
|
|
||||||
testing("Found [src.type] \ref[src] in list [Xname]\[[I]\]")
|
|
||||||
|
|
||||||
else if (islist(I))
|
|
||||||
DoSearchVar(I, "[Xname] -> list", recursive_limit-1)
|
|
||||||
|
|
||||||
#ifndef FIND_REF_NO_CHECK_TICK
|
|
||||||
CHECK_TICK
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TESTING
|
#ifdef TESTING
|
||||||
/proc/writeDatumCount()
|
/proc/writeDatumCount()
|
||||||
var/list/datums = list()
|
var/list/datums = list()
|
||||||
|
|||||||
@@ -2,6 +2,15 @@
|
|||||||
//Large Objects//
|
//Large Objects//
|
||||||
/////////////////
|
/////////////////
|
||||||
|
|
||||||
|
/datum/crafting_recipe/plunger
|
||||||
|
name = "Plunger"
|
||||||
|
result = /obj/item/plunger
|
||||||
|
time = 1
|
||||||
|
reqs = list(/obj/item/stack/sheet/plastic = 1,
|
||||||
|
/obj/item/stack/sheet/mineral/wood = 1)
|
||||||
|
category = CAT_MISC
|
||||||
|
subcategory = CAT_TOOL
|
||||||
|
|
||||||
/datum/crafting_recipe/showercurtain
|
/datum/crafting_recipe/showercurtain
|
||||||
name = "Shower Curtains"
|
name = "Shower Curtains"
|
||||||
reqs = list(/obj/item/stack/sheet/cloth = 2,
|
reqs = list(/obj/item/stack/sheet/cloth = 2,
|
||||||
|
|||||||
215
code/datums/components/plumbing/_plumbing.dm
Normal file
215
code/datums/components/plumbing/_plumbing.dm
Normal file
@@ -0,0 +1,215 @@
|
|||||||
|
/datum/component/plumbing
|
||||||
|
///Index with "1" = /datum/ductnet/theductpointingnorth etc. "1" being the num2text from NORTH define
|
||||||
|
var/list/datum/ductnet/ducts = list()
|
||||||
|
///shortcut to our parents' reagent holder
|
||||||
|
var/datum/reagents/reagents
|
||||||
|
///TRUE if we wanna add proper pipe outless under our parent object. this is pretty good if i may so so myself
|
||||||
|
var/use_overlays = TRUE
|
||||||
|
///We can't just cut all of the parents' overlays, so we'll track them here
|
||||||
|
var/list/image/ducterlays
|
||||||
|
///directions in wich we act as a supplier
|
||||||
|
var/supply_connects
|
||||||
|
///direction in wich we act as a demander
|
||||||
|
var/demand_connects
|
||||||
|
///FALSE to pretty much just not exist in the plumbing world so we can be moved, TRUE to go plumbo mode
|
||||||
|
var/active = FALSE
|
||||||
|
///if TRUE connects will spin with the parent object visually and codually, so you can have it work in any direction. FALSE if you want it to be static
|
||||||
|
var/turn_connects = TRUE
|
||||||
|
|
||||||
|
/datum/component/plumbing/Initialize(start=TRUE, _turn_connects=TRUE) //turn_connects for wheter or not we spin with the object to change our pipes
|
||||||
|
if(parent && !istype(parent, /atom/movable))
|
||||||
|
return COMPONENT_INCOMPATIBLE
|
||||||
|
var/atom/movable/AM = parent
|
||||||
|
if(!AM.reagents)
|
||||||
|
return COMPONENT_INCOMPATIBLE
|
||||||
|
reagents = AM.reagents
|
||||||
|
turn_connects = _turn_connects
|
||||||
|
|
||||||
|
RegisterSignal(parent, list(COMSIG_MOVABLE_MOVED,COMSIG_PARENT_PREQDELETED), .proc/disable)
|
||||||
|
RegisterSignal(parent, list(COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH), .proc/toggle_active)
|
||||||
|
|
||||||
|
if(start)
|
||||||
|
enable()
|
||||||
|
|
||||||
|
if(use_overlays)
|
||||||
|
create_overlays()
|
||||||
|
|
||||||
|
/datum/component/plumbing/process()
|
||||||
|
if(!demand_connects || !reagents)
|
||||||
|
STOP_PROCESSING(SSfluids, src)
|
||||||
|
return
|
||||||
|
if(reagents.total_volume < reagents.maximum_volume)
|
||||||
|
for(var/D in GLOB.cardinals)
|
||||||
|
if(D & demand_connects)
|
||||||
|
send_request(D)
|
||||||
|
///Can we be added to the ductnet?
|
||||||
|
/datum/component/plumbing/proc/can_add(datum/ductnet/D, dir)
|
||||||
|
if(!active)
|
||||||
|
return
|
||||||
|
if(!dir || !D)
|
||||||
|
return FALSE
|
||||||
|
if(num2text(dir) in ducts)
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
return TRUE
|
||||||
|
///called from in process(). only calls process_request(), but can be overwritten for children with special behaviour
|
||||||
|
/datum/component/plumbing/proc/send_request(dir)
|
||||||
|
process_request(amount = MACHINE_REAGENT_TRANSFER, reagent = null, dir = dir)
|
||||||
|
///check who can give us what we want, and how many each of them will give us
|
||||||
|
/datum/component/plumbing/proc/process_request(amount, reagent, dir)
|
||||||
|
var/list/valid_suppliers = list()
|
||||||
|
var/datum/ductnet/net
|
||||||
|
if(!ducts.Find(num2text(dir)))
|
||||||
|
return
|
||||||
|
net = ducts[num2text(dir)]
|
||||||
|
for(var/A in net.suppliers)
|
||||||
|
var/datum/component/plumbing/supplier = A
|
||||||
|
if(supplier.can_give(amount, reagent, net))
|
||||||
|
valid_suppliers += supplier
|
||||||
|
for(var/A in valid_suppliers)
|
||||||
|
var/datum/component/plumbing/give = A
|
||||||
|
give.transfer_to(src, amount / valid_suppliers.len, reagent, net)
|
||||||
|
///returns TRUE when they can give the specified amount and reagent. called by process request
|
||||||
|
/datum/component/plumbing/proc/can_give(amount, reagent, datum/ductnet/net)
|
||||||
|
if(amount <= 0)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(reagent) //only asked for one type of reagent
|
||||||
|
for(var/A in reagents.reagent_list)
|
||||||
|
var/datum/reagent/R = A
|
||||||
|
if(R.type == reagent)
|
||||||
|
return TRUE
|
||||||
|
else if(reagents.total_volume > 0) //take whatever
|
||||||
|
return TRUE
|
||||||
|
///this is where the reagent is actually transferred and is thus the finish point of our process()
|
||||||
|
/datum/component/plumbing/proc/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net)
|
||||||
|
if(!reagents || !target || !target.reagents)
|
||||||
|
return FALSE
|
||||||
|
if(reagent)
|
||||||
|
reagents.trans_id_to(target.parent, reagent, amount)
|
||||||
|
else
|
||||||
|
reagents.trans_to(target.parent, amount)
|
||||||
|
///We create our luxurious piping overlays/underlays, to indicate where we do what. only called once if use_overlays = TRUE in Initialize()
|
||||||
|
/datum/component/plumbing/proc/create_overlays()
|
||||||
|
var/atom/movable/AM = parent
|
||||||
|
for(var/image/I in ducterlays)
|
||||||
|
AM.overlays.Remove(I)
|
||||||
|
qdel(I)
|
||||||
|
ducterlays = list()
|
||||||
|
for(var/D in GLOB.cardinals)
|
||||||
|
var/color
|
||||||
|
var/direction
|
||||||
|
if(D & demand_connects)
|
||||||
|
color = "red" //red because red is mean and it takes
|
||||||
|
else if(D & supply_connects)
|
||||||
|
color = "blue" //blue is nice and gives
|
||||||
|
else
|
||||||
|
continue
|
||||||
|
var/image/I
|
||||||
|
if(turn_connects)
|
||||||
|
switch(D)
|
||||||
|
if(NORTH)
|
||||||
|
direction = "north"
|
||||||
|
if(SOUTH)
|
||||||
|
direction = "south"
|
||||||
|
if(EAST)
|
||||||
|
direction = "east"
|
||||||
|
if(WEST)
|
||||||
|
direction = "west"
|
||||||
|
I = image('icons/obj/plumbing/plumbers.dmi', "[direction]-[color]", layer = AM.layer - 1)
|
||||||
|
else
|
||||||
|
I = image('icons/obj/plumbing/plumbers.dmi', color, layer = AM.layer - 1) //color is not color as in the var, it's just the name
|
||||||
|
I.dir = D
|
||||||
|
AM.add_overlay(I)
|
||||||
|
ducterlays += I
|
||||||
|
///we stop acting like a plumbing thing and disconnect if we are, so we can safely be moved and stuff
|
||||||
|
/datum/component/plumbing/proc/disable()
|
||||||
|
if(!active)
|
||||||
|
return
|
||||||
|
STOP_PROCESSING(SSfluids, src)
|
||||||
|
for(var/A in ducts)
|
||||||
|
var/datum/ductnet/D = ducts[A]
|
||||||
|
D.remove_plumber(src)
|
||||||
|
active = FALSE
|
||||||
|
for(var/D in GLOB.cardinals)
|
||||||
|
if(D & (demand_connects | supply_connects))
|
||||||
|
for(var/obj/machinery/duct/duct in get_step(parent, D))
|
||||||
|
duct.attempt_connect()
|
||||||
|
|
||||||
|
///settle wherever we are, and start behaving like a piece of plumbing
|
||||||
|
/datum/component/plumbing/proc/enable()
|
||||||
|
if(active)
|
||||||
|
return
|
||||||
|
update_dir()
|
||||||
|
active = TRUE
|
||||||
|
var/atom/movable/AM = parent
|
||||||
|
for(var/obj/machinery/duct/D in AM.loc) //Destroy any ducts under us. Ducts also self destruct if placed under a plumbing machine. machines disable when they get moved
|
||||||
|
if(D.anchored) //that should cover everything
|
||||||
|
D.disconnect_duct()
|
||||||
|
|
||||||
|
if(demand_connects)
|
||||||
|
START_PROCESSING(SSfluids, src)
|
||||||
|
|
||||||
|
for(var/D in GLOB.cardinals)
|
||||||
|
if(D & (demand_connects | supply_connects))
|
||||||
|
for(var/atom/movable/A in get_step(parent, D))
|
||||||
|
if(istype(A, /obj/machinery/duct))
|
||||||
|
var/obj/machinery/duct/duct = A
|
||||||
|
duct.attempt_connect()
|
||||||
|
else
|
||||||
|
var/datum/component/plumbing/P = A.GetComponent(/datum/component/plumbing)
|
||||||
|
if(P)
|
||||||
|
direct_connect(P, D)
|
||||||
|
|
||||||
|
/// Toggle our machinery on or off. This is called by a hook from default_unfasten_wrench with anchored as only param, so we dont have to copypaste this on every object that can move
|
||||||
|
/datum/component/plumbing/proc/toggle_active(obj/O, new_state)
|
||||||
|
if(new_state)
|
||||||
|
enable()
|
||||||
|
else
|
||||||
|
disable()
|
||||||
|
/** We update our connects only when we settle down by taking our current and original direction to find our new connects
|
||||||
|
* If someone wants it to fucking spin while connected to something go actually knock yourself out
|
||||||
|
*/
|
||||||
|
/datum/component/plumbing/proc/update_dir()
|
||||||
|
if(!turn_connects)
|
||||||
|
return
|
||||||
|
var/atom/movable/AM = parent
|
||||||
|
var/new_demand_connects
|
||||||
|
var/new_supply_connects
|
||||||
|
var/new_dir = AM.dir
|
||||||
|
var/angle = 180 - dir2angle(new_dir)
|
||||||
|
if(new_dir == SOUTH)
|
||||||
|
demand_connects = initial(demand_connects)
|
||||||
|
supply_connects = initial(supply_connects)
|
||||||
|
else
|
||||||
|
for(var/D in GLOB.cardinals)
|
||||||
|
if(D & initial(demand_connects))
|
||||||
|
new_demand_connects += turn(D, angle)
|
||||||
|
if(D & initial(supply_connects))
|
||||||
|
new_supply_connects += turn(D, angle)
|
||||||
|
demand_connects = new_demand_connects
|
||||||
|
supply_connects = new_supply_connects
|
||||||
|
///Give the direction of a pipe, and it'll return wich direction it originally was when it's object pointed SOUTH
|
||||||
|
/datum/component/plumbing/proc/get_original_direction(dir)
|
||||||
|
var/atom/movable/AM = parent
|
||||||
|
return turn(dir, dir2angle(AM.dir) - 180)
|
||||||
|
//special case in-case we want to connect directly with another machine without a duct
|
||||||
|
/datum/component/plumbing/proc/direct_connect(datum/component/plumbing/P, dir)
|
||||||
|
if(!P.active)
|
||||||
|
return
|
||||||
|
var/opposite_dir = turn(dir, 180)
|
||||||
|
if(P.demand_connects & opposite_dir && supply_connects & dir || P.supply_connects & opposite_dir && demand_connects & dir) //make sure we arent connecting two supplies or demands
|
||||||
|
var/datum/ductnet/net = new()
|
||||||
|
net.add_plumber(src, dir)
|
||||||
|
net.add_plumber(P, opposite_dir)
|
||||||
|
|
||||||
|
///has one pipe input that only takes, example is manual output pipe
|
||||||
|
/datum/component/plumbing/simple_demand
|
||||||
|
demand_connects = NORTH
|
||||||
|
///has one pipe output that only supplies. example is liquid pump and manual input pipe
|
||||||
|
/datum/component/plumbing/simple_supply
|
||||||
|
supply_connects = NORTH
|
||||||
|
///input and output, like a holding tank
|
||||||
|
/datum/component/plumbing/tank
|
||||||
|
demand_connects = WEST
|
||||||
|
supply_connects = EAST
|
||||||
21
code/datums/components/plumbing/chemical_acclimator.dm
Normal file
21
code/datums/components/plumbing/chemical_acclimator.dm
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
/datum/component/plumbing/acclimator
|
||||||
|
demand_connects = WEST
|
||||||
|
supply_connects = EAST
|
||||||
|
var/obj/machinery/plumbing/acclimator/AC
|
||||||
|
|
||||||
|
/datum/component/plumbing/acclimator/Initialize(start=TRUE, _turn_connects=TRUE)
|
||||||
|
. = ..()
|
||||||
|
if(!istype(parent, /obj/machinery/plumbing/acclimator))
|
||||||
|
return COMPONENT_INCOMPATIBLE
|
||||||
|
AC = parent
|
||||||
|
|
||||||
|
/datum/component/plumbing/acclimator/can_give(amount, reagent)
|
||||||
|
. = ..()
|
||||||
|
if(. && AC.emptying)
|
||||||
|
return TRUE
|
||||||
|
return FALSE
|
||||||
|
///We're overriding process and not send_request, because all process does is do the requests, so we might aswell cut out the middle man and save some code from running
|
||||||
|
/datum/component/plumbing/acclimator/process()
|
||||||
|
if(AC.emptying)
|
||||||
|
return
|
||||||
|
. = ..()
|
||||||
59
code/datums/components/plumbing/filter.dm
Normal file
59
code/datums/components/plumbing/filter.dm
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
///The magical plumbing component used by the chemical filters. The different supply connects behave differently depending on the filters set on the chemical filter
|
||||||
|
/datum/component/plumbing/filter
|
||||||
|
demand_connects = NORTH
|
||||||
|
supply_connects = SOUTH | EAST | WEST //SOUTH is straight, EAST is left and WEST is right. We look from the perspective of the insert
|
||||||
|
|
||||||
|
/datum/component/plumbing/filter/Initialize()
|
||||||
|
. = ..()
|
||||||
|
if(!istype(parent, /obj/machinery/plumbing/filter))
|
||||||
|
return COMPONENT_INCOMPATIBLE
|
||||||
|
|
||||||
|
/datum/component/plumbing/filter/can_give(amount, reagent, datum/ductnet/net)
|
||||||
|
. = ..()
|
||||||
|
if(.)
|
||||||
|
var/direction
|
||||||
|
for(var/A in ducts)
|
||||||
|
if(ducts[A] == net)
|
||||||
|
direction = get_original_direction(text2num(A)) //we need it relative to the direction, so filters don't change when we turn the filter
|
||||||
|
break
|
||||||
|
if(!direction)
|
||||||
|
return FALSE
|
||||||
|
if(reagent)
|
||||||
|
if(!can_give_in_direction(direction, reagent))
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
/datum/component/plumbing/filter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net)
|
||||||
|
if(!reagents || !target || !target.reagents)
|
||||||
|
return FALSE
|
||||||
|
var/direction
|
||||||
|
for(var/A in ducts)
|
||||||
|
if(ducts[A] == net)
|
||||||
|
direction = get_original_direction(text2num(A))
|
||||||
|
break
|
||||||
|
if(reagent)
|
||||||
|
reagents.trans_id_to(target.parent, reagent, amount)
|
||||||
|
else
|
||||||
|
for(var/A in reagents.reagent_list)
|
||||||
|
var/datum/reagent/R = A
|
||||||
|
if(!can_give_in_direction(direction, R.type))
|
||||||
|
continue
|
||||||
|
var/new_amount
|
||||||
|
if(R.volume < amount)
|
||||||
|
new_amount = amount - R.volume
|
||||||
|
reagents.trans_id_to(target.parent, R.type, amount)
|
||||||
|
amount = new_amount
|
||||||
|
if(amount <= 0)
|
||||||
|
break
|
||||||
|
///We check if the direction and reagent are valid to give. Needed for filters since different outputs have different behaviours
|
||||||
|
/datum/component/plumbing/filter/proc/can_give_in_direction(dir, reagent)
|
||||||
|
var/obj/machinery/plumbing/filter/F = parent
|
||||||
|
switch(dir)
|
||||||
|
if(SOUTH) //straight
|
||||||
|
if(!F.left.Find(reagent) && !F.right.Find(reagent))
|
||||||
|
return TRUE
|
||||||
|
if(WEST) //right
|
||||||
|
if(F.right.Find(reagent))
|
||||||
|
return TRUE
|
||||||
|
if(EAST) //left
|
||||||
|
if(F.left.Find(reagent))
|
||||||
|
return TRUE
|
||||||
38
code/datums/components/plumbing/reaction_chamber.dm
Normal file
38
code/datums/components/plumbing/reaction_chamber.dm
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/datum/component/plumbing/reaction_chamber
|
||||||
|
demand_connects = WEST
|
||||||
|
supply_connects = EAST
|
||||||
|
|
||||||
|
/datum/component/plumbing/reaction_chamber/Initialize(start=TRUE, _turn_connects=TRUE)
|
||||||
|
. = ..()
|
||||||
|
if(!istype(parent, /obj/machinery/plumbing/reaction_chamber))
|
||||||
|
return COMPONENT_INCOMPATIBLE
|
||||||
|
|
||||||
|
/datum/component/plumbing/reaction_chamber/can_give(amount, reagent, datum/ductnet/net)
|
||||||
|
. = ..()
|
||||||
|
var/obj/machinery/plumbing/reaction_chamber/RC = parent
|
||||||
|
if(!. || !RC.emptying)
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
/datum/component/plumbing/reaction_chamber/send_request(dir)
|
||||||
|
var/obj/machinery/plumbing/reaction_chamber/RC = parent
|
||||||
|
if(RC.emptying || !LAZYLEN(RC.required_reagents))
|
||||||
|
return
|
||||||
|
for(var/RT in RC.required_reagents)
|
||||||
|
var/has_reagent = FALSE
|
||||||
|
for(var/A in reagents.reagent_list)
|
||||||
|
var/datum/reagent/RD = A
|
||||||
|
if(RT == RD.type)
|
||||||
|
has_reagent = TRUE
|
||||||
|
if(RD.volume < RC.required_reagents[RT])
|
||||||
|
process_request(min(RC.required_reagents[RT] - RD.volume, MACHINE_REAGENT_TRANSFER) , RT, dir)
|
||||||
|
return
|
||||||
|
if(!has_reagent)
|
||||||
|
process_request(min(RC.required_reagents[RT], MACHINE_REAGENT_TRANSFER), RT, dir)
|
||||||
|
return
|
||||||
|
|
||||||
|
RC.reagent_flags &= ~NO_REACT
|
||||||
|
reagents.handle_reactions()
|
||||||
|
|
||||||
|
RC.emptying = TRUE //If we move this up, it'll instantly get turned off since any reaction always sets the reagent_total to zero. Other option is make the reaction update
|
||||||
|
//everything for every chemical removed, wich isn't a good option either.
|
||||||
|
RC.on_reagent_change() //We need to check it now, because some reactions leave nothing left.
|
||||||
45
code/datums/components/plumbing/splitter.dm
Normal file
45
code/datums/components/plumbing/splitter.dm
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
/datum/component/plumbing/splitter
|
||||||
|
demand_connects = NORTH
|
||||||
|
supply_connects = SOUTH | EAST
|
||||||
|
|
||||||
|
/datum/component/plumbing/splitter/Initialize()
|
||||||
|
. = ..()
|
||||||
|
if(. && !istype(parent, /obj/machinery/plumbing/splitter))
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
/datum/component/plumbing/splitter/can_give(amount, reagent, datum/ductnet/net)
|
||||||
|
. = ..()
|
||||||
|
if(!.)
|
||||||
|
return
|
||||||
|
. = FALSE
|
||||||
|
var/direction
|
||||||
|
for(var/A in ducts)
|
||||||
|
if(ducts[A] == net)
|
||||||
|
direction = get_original_direction(text2num(A))
|
||||||
|
break
|
||||||
|
var/obj/machinery/plumbing/splitter/S = parent
|
||||||
|
switch(direction)
|
||||||
|
if(SOUTH)
|
||||||
|
if(S.turn_straight && S.transfer_straight <= amount)
|
||||||
|
S.turn_straight = FALSE
|
||||||
|
return TRUE
|
||||||
|
if(EAST)
|
||||||
|
if(!S.turn_straight && S.transfer_side <= amount)
|
||||||
|
S.turn_straight = TRUE
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/datum/component/plumbing/splitter/transfer_to(datum/component/plumbing/target, amount, reagent, datum/ductnet/net)
|
||||||
|
var/direction
|
||||||
|
for(var/A in ducts)
|
||||||
|
if(ducts[A] == net)
|
||||||
|
direction = get_original_direction(text2num(A))
|
||||||
|
break
|
||||||
|
var/obj/machinery/plumbing/splitter/S = parent
|
||||||
|
switch(direction)
|
||||||
|
if(SOUTH)
|
||||||
|
if(amount >= S.transfer_straight)
|
||||||
|
amount = S.transfer_straight
|
||||||
|
if(EAST)
|
||||||
|
if(amount >= S.transfer_side)
|
||||||
|
amount = S.transfer_side
|
||||||
|
. = ..()
|
||||||
@@ -31,6 +31,9 @@
|
|||||||
VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player")
|
VV_DROPDOWN_OPTION(VV_HK_EXPOSE, "Show VV To Player")
|
||||||
VV_DROPDOWN_OPTION(VV_HK_ADDCOMPONENT, "Add Component/Element")
|
VV_DROPDOWN_OPTION(VV_HK_ADDCOMPONENT, "Add Component/Element")
|
||||||
VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits")
|
VV_DROPDOWN_OPTION(VV_HK_MODIFY_TRAITS, "Modify Traits")
|
||||||
|
#ifdef REFERENCE_TRACKING
|
||||||
|
VV_DROPDOWN_OPTION(VV_HK_VIEW_REFERENCES, "View References")
|
||||||
|
#endif
|
||||||
|
|
||||||
//This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks!
|
//This proc is only called if everything topic-wise is verified. The only verifications that should happen here is things like permission checks!
|
||||||
//href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables!
|
//href_list is a reference, modifying it in these procs WILL change the rest of the proc in topic.dm of admin/view_variables!
|
||||||
|
|||||||
@@ -31,4 +31,3 @@
|
|||||||
|
|
||||||
/datum/symptom/inorganic_adaptation/OnRemove(datum/disease/advance/A)
|
/datum/symptom/inorganic_adaptation/OnRemove(datum/disease/advance/A)
|
||||||
A.infectable_biotypes &= ~MOB_MINERAL
|
A.infectable_biotypes &= ~MOB_MINERAL
|
||||||
|
|
||||||
|
|||||||
@@ -137,10 +137,10 @@
|
|||||||
L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"], 6)
|
L[DNA_COLOR_TWO_BLOCK] = sanitize_hexcolor(features["mcolor2"], 6)
|
||||||
L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"], 6)
|
L[DNA_COLOR_THREE_BLOCK] = sanitize_hexcolor(features["mcolor3"], 6)
|
||||||
if(!GLOB.mam_tails_list.len)
|
if(!GLOB.mam_tails_list.len)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_tails, GLOB.mam_tails_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/mam_tails, GLOB.mam_tails_list)
|
||||||
L[DNA_MUTANTTAIL_BLOCK] = construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len)
|
L[DNA_MUTANTTAIL_BLOCK] = construct_block(GLOB.mam_tails_list.Find(features["mam_tail"]), GLOB.mam_tails_list.len)
|
||||||
if(!GLOB.mam_ears_list.len)
|
if(!GLOB.mam_ears_list.len)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_ears, GLOB.mam_ears_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/ears/mam_ears, GLOB.mam_ears_list)
|
||||||
L[DNA_MUTANTEAR_BLOCK] = construct_block(GLOB.mam_ears_list.Find(features["mam_ears"]), GLOB.mam_ears_list.len)
|
L[DNA_MUTANTEAR_BLOCK] = construct_block(GLOB.mam_ears_list.Find(features["mam_ears"]), GLOB.mam_ears_list.len)
|
||||||
if(!GLOB.mam_body_markings_list.len)
|
if(!GLOB.mam_body_markings_list.len)
|
||||||
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list)
|
init_sprite_accessory_subtypes(/datum/sprite_accessory/mam_body_markings, GLOB.mam_body_markings_list)
|
||||||
|
|||||||
65
code/datums/ductnet.dm
Normal file
65
code/datums/ductnet.dm
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
///We handle the unity part of plumbing. We track who is connected to who.
|
||||||
|
/datum/ductnet
|
||||||
|
var/list/suppliers = list()
|
||||||
|
var/list/demanders = list()
|
||||||
|
var/list/obj/machinery/duct/ducts = list()
|
||||||
|
|
||||||
|
var/capacity
|
||||||
|
///Add a duct to our network
|
||||||
|
/datum/ductnet/proc/add_duct(obj/machinery/duct/D)
|
||||||
|
if(!D || (D in ducts))
|
||||||
|
return
|
||||||
|
ducts += D
|
||||||
|
D.duct = src
|
||||||
|
///Remove a duct from our network and commit suicide, because this is probably easier than to check who that duct was connected to and what part of us was lost
|
||||||
|
/datum/ductnet/proc/remove_duct(obj/machinery/duct/ducting)
|
||||||
|
destroy_network(FALSE)
|
||||||
|
for(var/obj/machinery/duct/D in ducting.neighbours)
|
||||||
|
addtimer(CALLBACK(D, /obj/machinery/duct/proc/reconnect), 0) //all needs to happen after the original duct that was destroyed finishes destroying itself
|
||||||
|
addtimer(CALLBACK(D, /obj/machinery/duct/proc/generate_connects), 0)
|
||||||
|
qdel(src)
|
||||||
|
///add a plumbing object to either demanders or suppliers
|
||||||
|
/datum/ductnet/proc/add_plumber(datum/component/plumbing/P, dir)
|
||||||
|
if(!P.can_add(src, dir))
|
||||||
|
return FALSE
|
||||||
|
P.ducts[num2text(dir)] = src
|
||||||
|
if(dir & P.supply_connects)
|
||||||
|
suppliers += P
|
||||||
|
else if(dir & P.demand_connects)
|
||||||
|
demanders += P
|
||||||
|
return TRUE
|
||||||
|
///remove a plumber. we dont delete ourselves because ductnets dont persist through plumbing objects
|
||||||
|
/datum/ductnet/proc/remove_plumber(datum/component/plumbing/P)
|
||||||
|
suppliers.Remove(P) //we're probably only in one of these, but Remove() is inherently sane so this is fine
|
||||||
|
demanders.Remove(P)
|
||||||
|
|
||||||
|
for(var/dir in P.ducts)
|
||||||
|
if(P.ducts[dir] == src)
|
||||||
|
P.ducts -= dir
|
||||||
|
if(!ducts.len) //there were no ducts, so it was a direct connection. we destroy ourselves since a ductnet with only one plumber and no ducts is worthless
|
||||||
|
destroy_network()
|
||||||
|
///we combine ductnets. this occurs when someone connects to seperate sets of fluid ducts
|
||||||
|
/datum/ductnet/proc/assimilate(datum/ductnet/D)
|
||||||
|
ducts.Add(D.ducts)
|
||||||
|
suppliers.Add(D.suppliers)
|
||||||
|
demanders.Add(D.demanders)
|
||||||
|
for(var/A in D.suppliers + D.demanders)
|
||||||
|
var/datum/component/plumbing/P = A
|
||||||
|
for(var/s in P.ducts)
|
||||||
|
if(P.ducts[s] != D)
|
||||||
|
continue
|
||||||
|
P.ducts[s] = src //all your ducts are belong to us
|
||||||
|
for(var/A in D.ducts)
|
||||||
|
var/obj/machinery/duct/M = A
|
||||||
|
M.duct = src //forget your old master
|
||||||
|
|
||||||
|
destroy_network()
|
||||||
|
///destroy the network and tell all our ducts and plumbers we are gone
|
||||||
|
/datum/ductnet/proc/destroy_network(delete=TRUE)
|
||||||
|
for(var/A in suppliers + demanders)
|
||||||
|
remove_plumber(A)
|
||||||
|
for(var/A in ducts)
|
||||||
|
var/obj/machinery/duct/D = A
|
||||||
|
D.duct = null
|
||||||
|
if(delete) //I don't want code to run with qdeleted objects because that can never be good, so keep this in-case the ductnet has some business left to attend to before commiting suicide
|
||||||
|
qdel(src)
|
||||||
@@ -646,3 +646,10 @@
|
|||||||
animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING)
|
animate(I, alpha = 175, pixel_x = to_x, pixel_y = to_y, time = 3, transform = M, easing = CUBIC_EASING)
|
||||||
sleep(1)
|
sleep(1)
|
||||||
animate(I, alpha = 0, transform = matrix(), time = 1)
|
animate(I, alpha = 0, transform = matrix(), time = 1)
|
||||||
|
|
||||||
|
/atom/movable/proc/set_anchored(anchorvalue) //literally only for plumbing ran
|
||||||
|
SHOULD_CALL_PARENT(TRUE)
|
||||||
|
if(anchored == anchorvalue)
|
||||||
|
return
|
||||||
|
. = anchored
|
||||||
|
anchored = anchorvalue
|
||||||
|
|||||||
@@ -224,8 +224,7 @@ Credit where due:
|
|||||||
qdel(S)
|
qdel(S)
|
||||||
if(S && !QDELETED(S))
|
if(S && !QDELETED(S))
|
||||||
to_chat(L, "<span class='alloy'>[slot] is a <b>clockwork slab</b>, a multipurpose tool used to construct machines and invoke ancient words of power. If this is your first time \
|
to_chat(L, "<span class='alloy'>[slot] is a <b>clockwork slab</b>, a multipurpose tool used to construct machines and invoke ancient words of power. If this is your first time \
|
||||||
as a servant, you can find a concise tutorial in the Recollection category of its interface.</span>")
|
as a servant, you can read <a href=\"https://citadel-station.net/wikimain/index.php?title=Clockwork_Cult\">the wiki page</a> to learn more.</span>")
|
||||||
to_chat(L, "<span class='alloy italics'>If you want more information, you can read <a href=\"https://tgstation13.org/wiki/Clockwork_Cult\">the wiki page</a> to learn more.</span>")
|
|
||||||
return TRUE
|
return TRUE
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
|
|||||||
@@ -117,6 +117,7 @@ Class Procs:
|
|||||||
var/new_occupant_dir = SOUTH //The direction the occupant will be set to look at when entering the machine.
|
var/new_occupant_dir = SOUTH //The direction the occupant will be set to look at when entering the machine.
|
||||||
var/speed_process = FALSE // Process as fast as possible?
|
var/speed_process = FALSE // Process as fast as possible?
|
||||||
var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created
|
var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created
|
||||||
|
var/wire_compatible = FALSE
|
||||||
// For storing and overriding ui id and dimensions
|
// For storing and overriding ui id and dimensions
|
||||||
var/tgui_id // ID of TGUI interface
|
var/tgui_id // ID of TGUI interface
|
||||||
var/ui_style // ID of custom TGUI style (optional)
|
var/ui_style // ID of custom TGUI style (optional)
|
||||||
@@ -433,6 +434,7 @@ Class Procs:
|
|||||||
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [src].</span>")
|
to_chat(user, "<span class='notice'>You [anchored ? "un" : ""]secure [src].</span>")
|
||||||
setAnchored(!anchored)
|
setAnchored(!anchored)
|
||||||
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
playsound(src, 'sound/items/deconstruct.ogg', 50, 1)
|
||||||
|
SEND_SIGNAL(src, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, anchored)
|
||||||
return SUCCESSFUL_UNFASTEN
|
return SUCCESSFUL_UNFASTEN
|
||||||
return FAILED_UNFASTEN
|
return FAILED_UNFASTEN
|
||||||
return CANT_UNFASTEN
|
return CANT_UNFASTEN
|
||||||
|
|||||||
@@ -135,6 +135,14 @@ RLD
|
|||||||
flick("[icon_state]_empty", src) //somewhat hacky thing to make RCDs with ammo counters actually have a blinking yellow light
|
flick("[icon_state]_empty", src) //somewhat hacky thing to make RCDs with ammo counters actually have a blinking yellow light
|
||||||
return .
|
return .
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/construction/proc/check_menu(mob/living/user)
|
||||||
|
if(!istype(user))
|
||||||
|
return FALSE
|
||||||
|
if(user.incapacitated() || !user.Adjacent(src))
|
||||||
|
return FALSE
|
||||||
|
return TRUE
|
||||||
|
|
||||||
/obj/item/construction/proc/range_check(atom/A, mob/user)
|
/obj/item/construction/proc/range_check(atom/A, mob/user)
|
||||||
if(!(A in range(custom_range, get_turf(user))))
|
if(!(A in range(custom_range, get_turf(user))))
|
||||||
to_chat(user, "<span class='warning'>The \'Out of Range\' light on [src] blinks red.</span>")
|
to_chat(user, "<span class='warning'>The \'Out of Range\' light on [src] blinks red.</span>")
|
||||||
@@ -275,13 +283,6 @@ RLD
|
|||||||
//Not scaling these down to button size because they look horrible then, instead just bumping up radius.
|
//Not scaling these down to button size because they look horrible then, instead just bumping up radius.
|
||||||
return MA
|
return MA
|
||||||
|
|
||||||
/obj/item/construction/rcd/proc/check_menu(mob/living/user)
|
|
||||||
if(!istype(user))
|
|
||||||
return FALSE
|
|
||||||
if(user.incapacitated() || !user.Adjacent(src))
|
|
||||||
return FALSE
|
|
||||||
return TRUE
|
|
||||||
|
|
||||||
/obj/item/construction/rcd/proc/change_computer_dir(mob/user)
|
/obj/item/construction/rcd/proc/change_computer_dir(mob/user)
|
||||||
if(!user)
|
if(!user)
|
||||||
return
|
return
|
||||||
@@ -855,6 +856,82 @@ RLD
|
|||||||
desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells."
|
desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells."
|
||||||
upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS
|
upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS
|
||||||
|
|
||||||
|
/obj/item/construction/plumbing
|
||||||
|
name = "Plumbing Constructor"
|
||||||
|
desc = "An expertly modified RCD outfitted to construct plumbing machinery. Reload with compressed matter cartridges."
|
||||||
|
icon = 'icons/obj/tools.dmi'
|
||||||
|
icon_state = "arcd"
|
||||||
|
item_state = "oldrcd"
|
||||||
|
has_ammobar = FALSE
|
||||||
|
matter = 200
|
||||||
|
max_matter = 200
|
||||||
|
|
||||||
|
///type of the plumbing machine
|
||||||
|
var/blueprint = null
|
||||||
|
///index, used in the attack self to get the type. stored here since it doesnt change
|
||||||
|
var/list/choices = list()
|
||||||
|
///index, used in the attack self to get the type. stored here since it doesnt change
|
||||||
|
var/list/name_to_type = list()
|
||||||
|
///
|
||||||
|
var/list/machinery_data = list("cost" = list(), "delay" = list())
|
||||||
|
|
||||||
|
/obj/item/construction/plumbing/attack_self(mob/user)
|
||||||
|
..()
|
||||||
|
if(!choices.len)
|
||||||
|
for(var/A in subtypesof(/obj/machinery/plumbing))
|
||||||
|
var/obj/machinery/plumbing/M = A
|
||||||
|
if(initial(M.rcd_constructable))
|
||||||
|
choices += list(initial(M.name) = image(icon = initial(M.icon), icon_state = initial(M.icon_state)))
|
||||||
|
name_to_type[initial(M.name)] = M
|
||||||
|
machinery_data["cost"][A] = initial(M.rcd_cost)
|
||||||
|
machinery_data["delay"][A] = initial(M.rcd_delay)
|
||||||
|
|
||||||
|
var/choice = show_radial_menu(user, src, choices, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
|
||||||
|
if(!check_menu(user))
|
||||||
|
return
|
||||||
|
|
||||||
|
blueprint = name_to_type[choice]
|
||||||
|
playsound(src, 'sound/effects/pop.ogg', 50, FALSE)
|
||||||
|
to_chat(user, "<span class='notice'>You change [name]s blueprint to '[choice]'.</span>")
|
||||||
|
|
||||||
|
///pretty much rcd_create, but named differently to make myself feel less bad for copypasting from a sibling-type
|
||||||
|
/obj/item/construction/plumbing/proc/create_machine(atom/A, mob/user)
|
||||||
|
if(!machinery_data || !isopenturf(A))
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
if(checkResource(machinery_data["cost"][blueprint], user) && blueprint)
|
||||||
|
if(do_after(user, machinery_data["delay"][blueprint], target = A))
|
||||||
|
if(checkResource(machinery_data["cost"][blueprint], user) && canPlace(A))
|
||||||
|
useResource(machinery_data["cost"][blueprint], user)
|
||||||
|
activate()
|
||||||
|
playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE)
|
||||||
|
new blueprint (A, FALSE, FALSE)
|
||||||
|
return TRUE
|
||||||
|
|
||||||
|
/obj/item/construction/plumbing/proc/canPlace(turf/T)
|
||||||
|
if(!isopenturf(T))
|
||||||
|
return FALSE
|
||||||
|
. = TRUE
|
||||||
|
for(var/obj/O in T.contents)
|
||||||
|
if(O.density) //let's not built ontop of dense stuff, like big machines and other obstacles, it kills my immershion
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
/obj/item/construction/plumbing/afterattack(atom/A, mob/user)
|
||||||
|
. = ..()
|
||||||
|
if(!range_check(A, user))
|
||||||
|
return
|
||||||
|
if(istype(A, /obj/machinery/plumbing))
|
||||||
|
var/obj/machinery/plumbing/P = A
|
||||||
|
if(P.anchored)
|
||||||
|
to_chat(user, "<span class='warning'>The [P.name] needs to be unanchored!</span>")
|
||||||
|
return
|
||||||
|
if(do_after(user, 20, target = P))
|
||||||
|
P.deconstruct() //Let's not substract matter
|
||||||
|
playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) //this is just such a great sound effect
|
||||||
|
else
|
||||||
|
create_machine(A, user)
|
||||||
|
|
||||||
|
|
||||||
#undef GLOW_MODE
|
#undef GLOW_MODE
|
||||||
#undef LIGHT_MODE
|
#undef LIGHT_MODE
|
||||||
#undef REMOVE_MODE
|
#undef REMOVE_MODE
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ RPD
|
|||||||
#define ATMOS_CATEGORY 0
|
#define ATMOS_CATEGORY 0
|
||||||
#define DISPOSALS_CATEGORY 1
|
#define DISPOSALS_CATEGORY 1
|
||||||
#define TRANSIT_CATEGORY 2
|
#define TRANSIT_CATEGORY 2
|
||||||
|
#define PLUMBING_CATEGORY 3
|
||||||
|
|
||||||
#define BUILD_MODE (1<<0)
|
#define BUILD_MODE (1<<0)
|
||||||
#define WRENCH_MODE (1<<1)
|
#define WRENCH_MODE (1<<1)
|
||||||
@@ -75,6 +76,13 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
|||||||
)
|
)
|
||||||
))
|
))
|
||||||
|
|
||||||
|
GLOBAL_LIST_INIT(fluid_duct_recipes, list(
|
||||||
|
"Fluid Ducts" = list(
|
||||||
|
new /datum/pipe_info/plumbing("Duct", /obj/machinery/duct, PIPE_ONEDIR),
|
||||||
|
new /datum/pipe_info/plumbing/multilayer("Duct Layer-Manifold",/obj/machinery/duct/multilayered, PIPE_STRAIGHT)
|
||||||
|
)
|
||||||
|
))
|
||||||
|
|
||||||
/datum/pipe_info
|
/datum/pipe_info
|
||||||
var/name
|
var/name
|
||||||
var/icon_state
|
var/icon_state
|
||||||
@@ -175,6 +183,15 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
|||||||
if(dt == PIPE_UNARY_FLIPPABLE)
|
if(dt == PIPE_UNARY_FLIPPABLE)
|
||||||
icon_state = "[icon_state]_preview"
|
icon_state = "[icon_state]_preview"
|
||||||
|
|
||||||
|
/datum/pipe_info/plumbing/New(label, obj/path, dt=PIPE_UNARY)
|
||||||
|
name = label
|
||||||
|
id = path
|
||||||
|
icon_state = initial(path.icon_state)
|
||||||
|
dirtype = dt
|
||||||
|
|
||||||
|
/datum/pipe_info/plumbing/multilayer //exists as identifier so we can see the difference between multi_layer and just ducts properly later on
|
||||||
|
|
||||||
|
|
||||||
/obj/item/pipe_dispenser
|
/obj/item/pipe_dispenser
|
||||||
name = "Rapid Piping Device (RPD)"
|
name = "Rapid Piping Device (RPD)"
|
||||||
desc = "A device used to rapidly pipe things."
|
desc = "A device used to rapidly pipe things."
|
||||||
@@ -200,15 +217,19 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
|||||||
var/atmos_build_speed = 5 //deciseconds (500ms)
|
var/atmos_build_speed = 5 //deciseconds (500ms)
|
||||||
var/disposal_build_speed = 5
|
var/disposal_build_speed = 5
|
||||||
var/transit_build_speed = 5
|
var/transit_build_speed = 5
|
||||||
|
var/plumbing_build_speed = 5
|
||||||
var/destroy_speed = 5
|
var/destroy_speed = 5
|
||||||
var/paint_speed = 5
|
var/paint_speed = 5
|
||||||
var/category = ATMOS_CATEGORY
|
var/category = ATMOS_CATEGORY
|
||||||
var/piping_layer = PIPING_LAYER_DEFAULT
|
var/piping_layer = PIPING_LAYER_DEFAULT
|
||||||
|
var/ducting_layer = DUCT_LAYER_DEFAULT
|
||||||
var/datum/pipe_info/recipe
|
var/datum/pipe_info/recipe
|
||||||
var/static/datum/pipe_info/first_atmos
|
var/static/datum/pipe_info/first_atmos
|
||||||
var/static/datum/pipe_info/first_disposal
|
var/static/datum/pipe_info/first_disposal
|
||||||
var/static/datum/pipe_info/first_transit
|
var/static/datum/pipe_info/first_transit
|
||||||
var/mode = BUILD_MODE | DESTROY_MODE | WRENCH_MODE
|
var/mode = BUILD_MODE | DESTROY_MODE | WRENCH_MODE
|
||||||
|
var/static/datum/pipe_info/first_plumbing
|
||||||
|
var/locked = FALSE //wheter we can change categories. Useful for the plumber
|
||||||
|
|
||||||
/obj/item/pipe_dispenser/New()
|
/obj/item/pipe_dispenser/New()
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -253,12 +274,15 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
|||||||
var/list/data = list(
|
var/list/data = list(
|
||||||
"category" = category,
|
"category" = category,
|
||||||
"piping_layer" = piping_layer,
|
"piping_layer" = piping_layer,
|
||||||
// "ducting_layer" = ducting_layer, //uhh is this for chem thing?
|
|
||||||
|
"ducting_layer" = ducting_layer,
|
||||||
|
|
||||||
"preview_rows" = recipe.get_preview(p_dir),
|
"preview_rows" = recipe.get_preview(p_dir),
|
||||||
"categories" = list(),
|
"categories" = list(),
|
||||||
"selected_color" = paint_color,
|
"selected_color" = paint_color,
|
||||||
"paint_colors" = GLOB.pipe_paint_colors,
|
"paint_colors" = GLOB.pipe_paint_colors,
|
||||||
"mode" = mode
|
"mode" = mode,
|
||||||
|
"locked" = locked
|
||||||
)
|
)
|
||||||
|
|
||||||
var/list/recipes
|
var/list/recipes
|
||||||
@@ -269,6 +293,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
|||||||
recipes = GLOB.disposal_pipe_recipes
|
recipes = GLOB.disposal_pipe_recipes
|
||||||
if(TRANSIT_CATEGORY)
|
if(TRANSIT_CATEGORY)
|
||||||
recipes = GLOB.transit_tube_recipes
|
recipes = GLOB.transit_tube_recipes
|
||||||
|
if(PLUMBING_CATEGORY)
|
||||||
|
recipes = GLOB.fluid_duct_recipes
|
||||||
for(var/c in recipes)
|
for(var/c in recipes)
|
||||||
var/list/cat = recipes[c]
|
var/list/cat = recipes[c]
|
||||||
var/list/r = list()
|
var/list/r = list()
|
||||||
@@ -297,6 +323,8 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
|||||||
recipe = first_atmos
|
recipe = first_atmos
|
||||||
if(TRANSIT_CATEGORY)
|
if(TRANSIT_CATEGORY)
|
||||||
recipe = first_transit
|
recipe = first_transit
|
||||||
|
if(PLUMBING_CATEGORY)
|
||||||
|
recipe = first_plumbing
|
||||||
p_dir = NORTH
|
p_dir = NORTH
|
||||||
playeffect = FALSE
|
playeffect = FALSE
|
||||||
if("piping_layer")
|
if("piping_layer")
|
||||||
@@ -468,16 +496,56 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
|
|||||||
if(mode & WRENCH_MODE)
|
if(mode & WRENCH_MODE)
|
||||||
tube.wrench_act(user, src)
|
tube.wrench_act(user, src)
|
||||||
return
|
return
|
||||||
|
if(PLUMBING_CATEGORY) //Plumbing.
|
||||||
|
if(!can_make_pipe)
|
||||||
|
return ..()
|
||||||
|
A = get_turf(A)
|
||||||
|
if(isclosedturf(A))
|
||||||
|
to_chat(user, "<span class='warning'>[src]'s error light flickers; there's something in the way!</span>")
|
||||||
|
return
|
||||||
|
to_chat(user, "<span class='notice'>You start building a fluid duct...</span>")
|
||||||
|
playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
|
||||||
|
if(do_after(user, plumbing_build_speed, target = A))
|
||||||
|
var/obj/machinery/duct/D
|
||||||
|
if(recipe.type == /datum/pipe_info/plumbing/multilayer)
|
||||||
|
var/temp_connects = NORTH + SOUTH
|
||||||
|
if(queued_p_dir == EAST)
|
||||||
|
temp_connects = EAST + WEST
|
||||||
|
D = new queued_p_type (A, TRUE, GLOB.pipe_paint_colors[paint_color], ducting_layer, temp_connects)
|
||||||
|
else
|
||||||
|
D = new queued_p_type (A, TRUE, GLOB.pipe_paint_colors[paint_color], ducting_layer)
|
||||||
|
D.add_fingerprint(usr)
|
||||||
|
if(mode & WRENCH_MODE)
|
||||||
|
D.wrench_act(user, src)
|
||||||
else
|
else
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/obj/item/pipe_dispenser/proc/activate()
|
/obj/item/pipe_dispenser/proc/activate()
|
||||||
playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1)
|
playsound(get_turf(src), 'sound/items/deconstruct.ogg', 50, 1)
|
||||||
|
/* unneeded, you can craft ducts from plastic
|
||||||
|
/obj/item/pipe_dispenser/plumbing
|
||||||
|
name = "Plumberinator"
|
||||||
|
desc = "A crude device to rapidly plumb things."
|
||||||
|
icon_state = "plumberer"
|
||||||
|
category = PLUMBING_CATEGORY
|
||||||
|
locked = TRUE
|
||||||
|
|
||||||
|
/obj/item/pipe_dispenser/plumbing/Initialize()
|
||||||
|
. = ..()
|
||||||
|
spark_system = new
|
||||||
|
spark_system.set_up(5, 0, src)
|
||||||
|
spark_system.attach(src)
|
||||||
|
if(!first_plumbing)
|
||||||
|
first_plumbing = GLOB.fluid_duct_recipes[GLOB.fluid_duct_recipes[1]][1]
|
||||||
|
|
||||||
|
recipe = first_plumbing
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
#undef ATMOS_CATEGORY
|
#undef ATMOS_CATEGORY
|
||||||
#undef DISPOSALS_CATEGORY
|
#undef DISPOSALS_CATEGORY
|
||||||
#undef TRANSIT_CATEGORY
|
#undef TRANSIT_CATEGORY
|
||||||
|
#undef PLUMBING_CATEGORY
|
||||||
|
|
||||||
#undef BUILD_MODE
|
#undef BUILD_MODE
|
||||||
#undef DESTROY_MODE
|
#undef DESTROY_MODE
|
||||||
|
|||||||
@@ -48,6 +48,13 @@
|
|||||||
/obj/item/stack/cable_coil = 5,
|
/obj/item/stack/cable_coil = 5,
|
||||||
/obj/item/stack/sheet/glass = 1)
|
/obj/item/stack/sheet/glass = 1)
|
||||||
|
|
||||||
|
/obj/item/circuitboard/machine/medipen_refiller
|
||||||
|
name = "Medipen Refiller (Machine Board)"
|
||||||
|
icon_state = "medical"
|
||||||
|
build_path = /obj/machinery/medipen_refiller
|
||||||
|
req_components = list(
|
||||||
|
/obj/item/stock_parts/matter_bin = 1)
|
||||||
|
|
||||||
/obj/item/circuitboard/machine/clonepod
|
/obj/item/circuitboard/machine/clonepod
|
||||||
name = "Clone Pod (Machine Board)"
|
name = "Clone Pod (Machine Board)"
|
||||||
build_path = /obj/machinery/clonepod
|
build_path = /obj/machinery/clonepod
|
||||||
@@ -512,6 +519,10 @@
|
|||||||
/obj/item/stack/sheet/glass = 1)
|
/obj/item/stack/sheet/glass = 1)
|
||||||
needs_anchored = FALSE
|
needs_anchored = FALSE
|
||||||
|
|
||||||
|
/obj/item/circuitboard/machine/hydroponics/automagic
|
||||||
|
name = "Automatic Hydroponics Tray (Machine Board)"
|
||||||
|
build_path = /obj/machinery/hydroponics/constructable/automagic
|
||||||
|
|
||||||
/obj/item/circuitboard/machine/seed_extractor
|
/obj/item/circuitboard/machine/seed_extractor
|
||||||
name = "Seed Extractor (Machine Board)"
|
name = "Seed Extractor (Machine Board)"
|
||||||
build_path = /obj/machinery/seed_extractor
|
build_path = /obj/machinery/seed_extractor
|
||||||
|
|||||||
@@ -128,6 +128,7 @@
|
|||||||
absorption_capacity = 5
|
absorption_capacity = 5
|
||||||
splint_factor = 0.35
|
splint_factor = 0.35
|
||||||
custom_price = PRICE_REALLY_CHEAP
|
custom_price = PRICE_REALLY_CHEAP
|
||||||
|
grind_results = list(/datum/reagent/cellulose = 2)
|
||||||
|
|
||||||
// gauze is only relevant for wounds, which are handled in the wounds themselves
|
// gauze is only relevant for wounds, which are handled in the wounds themselves
|
||||||
/obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent)
|
/obj/item/stack/medical/gauze/try_heal(mob/living/M, mob/user, silent)
|
||||||
|
|||||||
@@ -412,6 +412,7 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \
|
|||||||
force = 0
|
force = 0
|
||||||
throwforce = 0
|
throwforce = 0
|
||||||
merge_type = /obj/item/stack/sheet/cloth
|
merge_type = /obj/item/stack/sheet/cloth
|
||||||
|
grind_results = list(/datum/reagent/cellulose = 2)
|
||||||
|
|
||||||
/obj/item/stack/sheet/cloth/get_main_recipes()
|
/obj/item/stack/sheet/cloth/get_main_recipes()
|
||||||
. = ..()
|
. = ..()
|
||||||
@@ -773,6 +774,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list(
|
|||||||
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
|
new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \
|
||||||
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
|
new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \
|
||||||
new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 10, time = 10, one_per_turf = 1, on_floor = 1), \
|
new /datum/stack_recipe("shower curtain", /obj/structure/curtain, 10, time = 10, one_per_turf = 1, on_floor = 1), \
|
||||||
|
new /datum/stack_recipe("duct", /obj/item/stack/ducts,1), \
|
||||||
new /datum/stack_recipe("laser pointer case", /obj/item/glasswork/glass_base/laserpointer_shell, 30), \
|
new /datum/stack_recipe("laser pointer case", /obj/item/glasswork/glass_base/laserpointer_shell, 30), \
|
||||||
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
|
new /datum/stack_recipe("wet floor sign", /obj/item/caution, 2)))
|
||||||
|
|
||||||
@@ -841,6 +843,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
|
|||||||
merge_type = /obj/item/stack/sheet/cotton
|
merge_type = /obj/item/stack/sheet/cotton
|
||||||
var/pull_effort = 30
|
var/pull_effort = 30
|
||||||
var/loom_result = /obj/item/stack/sheet/cloth
|
var/loom_result = /obj/item/stack/sheet/cloth
|
||||||
|
grind_results = list(/datum/reagent/cellulose = 5)
|
||||||
|
|
||||||
/obj/item/stack/sheet/cotton/ten
|
/obj/item/stack/sheet/cotton/ten
|
||||||
amount = 10
|
amount = 10
|
||||||
@@ -856,6 +859,7 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra
|
|||||||
merge_type = /obj/item/stack/sheet/cotton/durathread
|
merge_type = /obj/item/stack/sheet/cotton/durathread
|
||||||
pull_effort = 70
|
pull_effort = 70
|
||||||
loom_result = /obj/item/stack/sheet/durathread
|
loom_result = /obj/item/stack/sheet/durathread
|
||||||
|
grind_results = list(/datum/reagent/cellulose = 10)
|
||||||
|
|
||||||
/obj/item/stack/sheet/meat
|
/obj/item/stack/sheet/meat
|
||||||
name = "meat sheets"
|
name = "meat sheets"
|
||||||
|
|||||||
@@ -478,7 +478,7 @@
|
|||||||
/obj/item/assembly/signaler,
|
/obj/item/assembly/signaler,
|
||||||
/obj/item/lightreplacer,
|
/obj/item/lightreplacer,
|
||||||
/obj/item/rcd_ammo,
|
/obj/item/rcd_ammo,
|
||||||
/obj/item/construction/rcd,
|
/obj/item/construction,
|
||||||
/obj/item/pipe_dispenser,
|
/obj/item/pipe_dispenser,
|
||||||
/obj/item/stack/rods,
|
/obj/item/stack/rods,
|
||||||
/obj/item/stack/tile/plasteel,
|
/obj/item/stack/tile/plasteel,
|
||||||
|
|||||||
@@ -329,3 +329,6 @@
|
|||||||
. = ..()
|
. = ..()
|
||||||
if(. && ricochet_damage_mod)
|
if(. && ricochet_damage_mod)
|
||||||
take_damage(P.damage * ricochet_damage_mod, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) // pass along ricochet_damage_mod damage to the structure for the ricochet
|
take_damage(P.damage * ricochet_damage_mod, P.damage_type, P.flag, 0, turn(P.dir, 180), P.armour_penetration) // pass along ricochet_damage_mod damage to the structure for the ricochet
|
||||||
|
|
||||||
|
/obj/proc/plunger_act(obj/item/plunger/P, mob/living/user, reinforced)
|
||||||
|
return
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
var/erupting_state = null //set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob
|
var/erupting_state = null //set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob
|
||||||
var/activated = FALSE //whether we are active and generating chems
|
var/activated = FALSE //whether we are active and generating chems
|
||||||
var/reagent_id = /datum/reagent/fuel/oil
|
var/reagent_id = /datum/reagent/oil
|
||||||
var/potency = 2 //how much reagents we add every process (2 seconds)
|
var/potency = 2 //how much reagents we add every process (2 seconds)
|
||||||
var/max_volume = 500
|
var/max_volume = 500
|
||||||
var/start_volume = 50
|
var/start_volume = 50
|
||||||
@@ -77,10 +77,10 @@
|
|||||||
|
|
||||||
/obj/item/plunger/reinforced
|
/obj/item/plunger/reinforced
|
||||||
name = "reinforced plunger"
|
name = "reinforced plunger"
|
||||||
desc = "It's an M. 7 Reinforced Plunger<65> for heavy duty plunging."
|
desc = "It's an M. 7 Reinforced Plunger<65> for heavy duty plunging."
|
||||||
icon_state = "reinforced_plunger"
|
icon_state = "reinforced_plunger"
|
||||||
|
|
||||||
reinforced = TRUE
|
reinforced = TRUE
|
||||||
plunge_mod = 0.8
|
plunge_mod = 0.8
|
||||||
|
|
||||||
custom_premium_price = 1200
|
custom_premium_price = 600
|
||||||
|
|||||||
@@ -149,6 +149,8 @@
|
|||||||
var/list/megafauna_spawn_list
|
var/list/megafauna_spawn_list
|
||||||
/// Flora that can spawn in the tunnel, weighted list
|
/// Flora that can spawn in the tunnel, weighted list
|
||||||
var/list/flora_spawn_list
|
var/list/flora_spawn_list
|
||||||
|
//terrain to spawn weighted list
|
||||||
|
var/list/terrain_spawn_list
|
||||||
/// Turf type to choose when spawning in tunnel at 1% chance, weighted list
|
/// Turf type to choose when spawning in tunnel at 1% chance, weighted list
|
||||||
var/list/choose_turf_type
|
var/list/choose_turf_type
|
||||||
/// if the tunnel should keep being created
|
/// if the tunnel should keep being created
|
||||||
@@ -230,7 +232,8 @@
|
|||||||
megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM)
|
megafauna_spawn_list = list(/mob/living/simple_animal/hostile/megafauna/dragon = 4, /mob/living/simple_animal/hostile/megafauna/colossus = 2, /mob/living/simple_animal/hostile/megafauna/bubblegum = SPAWN_BUBBLEGUM)
|
||||||
if (!flora_spawn_list)
|
if (!flora_spawn_list)
|
||||||
flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2)
|
flora_spawn_list = list(/obj/structure/flora/ash/leaf_shroom = 2 , /obj/structure/flora/ash/cap_shroom = 2 , /obj/structure/flora/ash/stem_shroom = 2 , /obj/structure/flora/ash/cacti = 1, /obj/structure/flora/ash/tall_shroom = 2)
|
||||||
|
if(!terrain_spawn_list)
|
||||||
|
terrain_spawn_list = list(/obj/structure/geyser/random = 1)
|
||||||
. = ..()
|
. = ..()
|
||||||
if(!has_data)
|
if(!has_data)
|
||||||
produce_tunnel_from_data()
|
produce_tunnel_from_data()
|
||||||
@@ -334,8 +337,19 @@
|
|||||||
spawned_flora = SpawnFlora(T)
|
spawned_flora = SpawnFlora(T)
|
||||||
if(!spawned_flora) // no rocks beneath mob spawners / mobs.
|
if(!spawned_flora) // no rocks beneath mob spawners / mobs.
|
||||||
SpawnMonster(T)
|
SpawnMonster(T)
|
||||||
|
SpawnTerrain(T)
|
||||||
T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
|
T.ChangeTurf(turf_type, null, CHANGETURF_IGNORE_AIR)
|
||||||
|
|
||||||
|
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnTerrain(turf/T)
|
||||||
|
if(prob(1))
|
||||||
|
if(istype(loc, /area/mine/explored) || istype(loc, /area/lavaland/surface/outdoors/explored))
|
||||||
|
return
|
||||||
|
var/randumb = pickweight(terrain_spawn_list)
|
||||||
|
for(var/obj/structure/geyser/F in range(7, T))
|
||||||
|
if(istype(F, randumb))
|
||||||
|
return
|
||||||
|
new randumb(T)
|
||||||
|
|
||||||
/// Spawns a random mob or megafauna in the tunnel
|
/// Spawns a random mob or megafauna in the tunnel
|
||||||
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
|
/turf/open/floor/plating/asteroid/airless/cave/proc/SpawnMonster(turf/T)
|
||||||
if(!isarea(loc))
|
if(!isarea(loc))
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ GLOBAL_LIST(topic_status_cache)
|
|||||||
if (fexists(EXTOOLS))
|
if (fexists(EXTOOLS))
|
||||||
call(EXTOOLS, "maptick_initialize")()
|
call(EXTOOLS, "maptick_initialize")()
|
||||||
enable_debugger()
|
enable_debugger()
|
||||||
|
#ifdef REFERENCE_TRACKING
|
||||||
|
enable_reference_tracking()
|
||||||
|
#endif
|
||||||
|
|
||||||
world.Profile(PROFILE_START)
|
world.Profile(PROFILE_START)
|
||||||
|
|
||||||
|
|||||||
@@ -171,7 +171,11 @@ GLOBAL_LIST_INIT(admin_verbs_debug, world.AVerbsDebug())
|
|||||||
/client/proc/cmd_display_overlay_log,
|
/client/proc/cmd_display_overlay_log,
|
||||||
/client/proc/reload_configuration,
|
/client/proc/reload_configuration,
|
||||||
/datum/admins/proc/create_or_modify_area,
|
/datum/admins/proc/create_or_modify_area,
|
||||||
/client/proc/generate_wikichem_list //DO NOT PRESS UNLESS YOU WANT SUPERLAG
|
#ifdef REFERENCE_TRACKING
|
||||||
|
/datum/admins/proc/view_refs,
|
||||||
|
/datum/admins/proc/view_del_failures,
|
||||||
|
#endif
|
||||||
|
/client/proc/generate_wikichem_list, //DO NOT PRESS UNLESS YOU WANT SUPERLAG
|
||||||
)
|
)
|
||||||
GLOBAL_PROTECT(admin_verbs_debug)
|
GLOBAL_PROTECT(admin_verbs_debug)
|
||||||
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release))
|
GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release))
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
|
|||||||
//message from the initiator without a target, all admins will see this
|
//message from the initiator without a target, all admins will see this
|
||||||
//won't bug irc
|
//won't bug irc
|
||||||
/datum/admin_help/proc/MessageNoRecipient(msg)
|
/datum/admin_help/proc/MessageNoRecipient(msg)
|
||||||
|
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
|
||||||
var/ref_src = "[REF(src)]"
|
var/ref_src = "[REF(src)]"
|
||||||
//Message to be sent to all admins
|
//Message to be sent to all admins
|
||||||
var/admin_msg = "<span class='adminnotice'><span class='adminhelp'>Ticket [TicketHref("#[id]", ref_src)]</span><b>: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]:</b> <span class='linkify'>[keywords_lookup(msg)]</span></span>"
|
var/admin_msg = "<span class='adminnotice'><span class='adminhelp'>Ticket [TicketHref("#[id]", ref_src)]</span><b>: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]:</b> <span class='linkify'>[keywords_lookup(msg)]</span></span>"
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
|
|
||||||
if(AH)
|
if(AH)
|
||||||
message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
|
message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
|
||||||
var/msg = stripped_multiline_input(src,"Message:", "Private message to [key_name(C, 0, 0)]")
|
var/msg = input(src,"Message:", "Private message to [C.holder?.fakekey ? "an Administrator" : key_name(C, 0, 0)].") as message|null
|
||||||
if (!msg)
|
if (!msg)
|
||||||
message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
|
message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
|
||||||
return
|
return
|
||||||
@@ -90,7 +90,7 @@
|
|||||||
if(!ircreplyamount) //to prevent people from spamming irc/discord
|
if(!ircreplyamount) //to prevent people from spamming irc/discord
|
||||||
return
|
return
|
||||||
if(!msg)
|
if(!msg)
|
||||||
msg = stripped_multiline_input(src,"Message:", "Private message to Administrator")
|
msg = input(src,"Message:", "Private message to Administrator") as message|null
|
||||||
|
|
||||||
if(!msg)
|
if(!msg)
|
||||||
return
|
return
|
||||||
@@ -112,7 +112,7 @@
|
|||||||
|
|
||||||
//get message text, limit it's length.and clean/escape html
|
//get message text, limit it's length.and clean/escape html
|
||||||
if(!msg)
|
if(!msg)
|
||||||
msg = stripped_multiline_input(src,"Message:", "Private message to [key_name(recipient, 0, 0)]")
|
msg = input(src,"Message:", "Private message to [recipient.holder?.fakekey ? "an Administrator" : key_name(recipient, 0, 0)].") as message|null
|
||||||
msg = trim(msg)
|
msg = trim(msg)
|
||||||
if(!msg)
|
if(!msg)
|
||||||
return
|
return
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
|
|
||||||
//clean the message if it's not sent by a high-rank admin
|
//clean the message if it's not sent by a high-rank admin
|
||||||
if(!check_rights(R_SERVER|R_DEBUG,0)||irc)//no sending html to the poor bots
|
if(!check_rights(R_SERVER|R_DEBUG,0)||irc)//no sending html to the poor bots
|
||||||
msg = trim(sanitize(msg), MAX_MESSAGE_LEN)
|
msg = sanitize(copytext_char(msg, 1, MAX_MESSAGE_LEN))
|
||||||
if(!msg)
|
if(!msg)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -188,10 +188,10 @@
|
|||||||
|
|
||||||
//AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
|
//AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn
|
||||||
if(CONFIG_GET(flag/popup_admin_pm))
|
if(CONFIG_GET(flag/popup_admin_pm))
|
||||||
spawn() //so we don't hold the caller proc up
|
spawn() //so we don't hold the caller proc up. Please functionalize this
|
||||||
var/sender = src
|
var/sender = src
|
||||||
var/sendername = key
|
var/sendername = key
|
||||||
var/reply = stripped_multiline_input(recipient, msg,"Admin PM from-[sendername]", "") //show message and await a reply
|
var/reply = input(recipient, msg,"Admin PM from-[sendername]", "") as message|null //show message and await a reply
|
||||||
if(recipient && reply)
|
if(recipient && reply)
|
||||||
if(sender)
|
if(sender)
|
||||||
recipient.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
|
recipient.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them
|
||||||
|
|||||||
225
code/modules/admin/view_variables/reference_tracking.dm
Normal file
225
code/modules/admin/view_variables/reference_tracking.dm
Normal file
@@ -0,0 +1,225 @@
|
|||||||
|
#ifdef REFERENCE_TRACKING
|
||||||
|
|
||||||
|
GLOBAL_LIST_EMPTY(deletion_failures)
|
||||||
|
|
||||||
|
/world/proc/enable_reference_tracking()
|
||||||
|
if (fexists(EXTOOLS))
|
||||||
|
call(EXTOOLS, "ref_tracking_initialize")()
|
||||||
|
|
||||||
|
/proc/get_back_references(datum/D)
|
||||||
|
CRASH("/proc/get_back_references not hooked by extools, reference tracking will not function!")
|
||||||
|
|
||||||
|
/proc/get_forward_references(datum/D)
|
||||||
|
CRASH("/proc/get_forward_references not hooked by extools, reference tracking will not function!")
|
||||||
|
|
||||||
|
/proc/clear_references(datum/D)
|
||||||
|
return
|
||||||
|
|
||||||
|
/datum/admins/proc/view_refs(atom/D in world) //it actually supports datums as well but byond no likey
|
||||||
|
set category = "Debug"
|
||||||
|
set name = "View References"
|
||||||
|
|
||||||
|
if(!check_rights(R_DEBUG) || !D)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/list/backrefs = get_back_references(D)
|
||||||
|
if(isnull(backrefs))
|
||||||
|
var/datum/browser/popup = new(usr, "ref_view", "<div align='center'>Error</div>")
|
||||||
|
popup.set_content("Reference tracking not enabled")
|
||||||
|
popup.open(FALSE)
|
||||||
|
return
|
||||||
|
|
||||||
|
var/list/frontrefs = get_forward_references(D)
|
||||||
|
var/list/dat = list()
|
||||||
|
dat += "<h1>References of \ref[D] - [D]</h1><br><a href='?_src_=vars;[HrefToken()];[VV_HK_VIEW_REFERENCES]=TRUE;[VV_HK_TARGET]=[REF(D)]'>\[Refresh\]</a><hr>"
|
||||||
|
dat += "<h3>Back references - these things hold references to this object.</h3>"
|
||||||
|
dat += "<table>"
|
||||||
|
dat += "<tr><th>Ref</th><th>Type</th><th>Variable Name</th><th>Follow</th>"
|
||||||
|
for(var/ref in backrefs)
|
||||||
|
var/datum/backreference = ref
|
||||||
|
if(isnull(backreference))
|
||||||
|
dat += "<tr><td>GC'd Reference</td></tr>"
|
||||||
|
if(istype(backreference))
|
||||||
|
dat += "<tr><td><a href='?_src_=vars;[HrefToken()];Vars=[REF(backreference)]'>[REF(backreference)]</td><td>[backreference.type]</td><td>[backrefs[backreference]]</td><td><a href='?_src_=vars;[HrefToken()];[VV_HK_VIEW_REFERENCES]=TRUE;[VV_HK_TARGET]=[REF(backreference)]'>\[Follow\]</a></td></tr>"
|
||||||
|
else if(islist(backreference))
|
||||||
|
dat += "<tr><td><a href='?_src_=vars;[HrefToken()];Vars=[REF(backreference)]'>[REF(backreference)]</td><td>list</td><td>[backrefs[backreference]]</td><td><a href='?_src_=vars;[HrefToken()];[VV_HK_VIEW_REFERENCES]=TRUE;[VV_HK_TARGET]=[REF(backreference)]'>\[Follow\]</a></td></tr>"
|
||||||
|
else
|
||||||
|
dat += "<tr><td>Weird reference type. Add more debugging checks.</td></tr>"
|
||||||
|
dat += "</table><hr>"
|
||||||
|
dat += "<h3>Forward references - this object is referencing those things.</h3>"
|
||||||
|
dat += "<table>"
|
||||||
|
dat += "<tr><th>Variable name</th><th>Ref</th><th>Type</th><th>Follow</th>"
|
||||||
|
for(var/ref in frontrefs)
|
||||||
|
var/datum/backreference = frontrefs[ref]
|
||||||
|
dat += "<tr><td>[ref]</td><td><a href='?_src_=vars;[HrefToken()];Vars=[REF(backreference)]'>[REF(backreference)]</a></td><td>[backreference.type]</td><td><a href='?_src_=vars;[HrefToken()];[VV_HK_VIEW_REFERENCES]=TRUE;[VV_HK_TARGET]=[REF(backreference)]'>\[Follow\]</a></td></tr>"
|
||||||
|
dat += "</table><hr>"
|
||||||
|
dat = dat.Join()
|
||||||
|
|
||||||
|
var/datum/browser/popup = new(usr, "ref_view", "<div align='center'>References of \ref[D]</div>")
|
||||||
|
popup.set_content(dat)
|
||||||
|
popup.open(FALSE)
|
||||||
|
|
||||||
|
|
||||||
|
/datum/admins/proc/view_del_failures()
|
||||||
|
set category = "Debug"
|
||||||
|
set name = "View Deletion Failures"
|
||||||
|
|
||||||
|
if(!check_rights(R_DEBUG))
|
||||||
|
return
|
||||||
|
|
||||||
|
var/list/dat = list("<table>")
|
||||||
|
for(var/t in GLOB.deletion_failures)
|
||||||
|
if(isnull(t))
|
||||||
|
dat += "<tr><td>GC'd Reference | <a href='byond://?src=[REF(src)];[HrefToken(TRUE)];delfail_clearnulls=TRUE'>Clear Nulls</a></td></tr>"
|
||||||
|
continue
|
||||||
|
var/datum/thing = t
|
||||||
|
dat += "<tr><td>\ref[thing] | [thing.type][thing.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(thing)]</td></tr>"
|
||||||
|
dat += "</table><hr>"
|
||||||
|
dat = dat.Join()
|
||||||
|
|
||||||
|
var/datum/browser/popup = new(usr, "del_failures", "<div align='center'>Deletion Failures</div>")
|
||||||
|
popup.set_content(dat)
|
||||||
|
popup.open(FALSE)
|
||||||
|
|
||||||
|
|
||||||
|
/datum/proc/find_references()
|
||||||
|
testing("Beginning search for references to a [type].")
|
||||||
|
var/list/backrefs = get_back_references(src)
|
||||||
|
for(var/ref in backrefs)
|
||||||
|
if(isnull(ref))
|
||||||
|
log_world("## TESTING: Datum reference found, but gone now.")
|
||||||
|
continue
|
||||||
|
if(islist(ref))
|
||||||
|
log_world("## TESTING: Found [type] \ref[src] in list.")
|
||||||
|
continue
|
||||||
|
var/datum/datum_ref = ref
|
||||||
|
if(!istype(datum_ref))
|
||||||
|
log_world("## TESTING: Found [type] \ref[src] in unknown type reference: [datum_ref].")
|
||||||
|
return
|
||||||
|
log_world("## TESTING: Found [type] \ref[src] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""]")
|
||||||
|
message_admins("Found [type] \ref[src] [ADMIN_VV(src)] in [datum_ref.type][datum_ref.gc_destroyed ? " (destroyed)" : ""] [ADMIN_VV(datum_ref)]")
|
||||||
|
testing("Completed search for references to a [type].")
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LEGACY_REFERENCE_TRACKING
|
||||||
|
|
||||||
|
/datum/verb/legacy_find_refs()
|
||||||
|
set category = "Debug"
|
||||||
|
set name = "Find References"
|
||||||
|
set src in world
|
||||||
|
|
||||||
|
find_references(FALSE)
|
||||||
|
|
||||||
|
|
||||||
|
/datum/proc/find_references_legacy(skip_alert)
|
||||||
|
running_find_references = type
|
||||||
|
if(usr?.client)
|
||||||
|
if(usr.client.running_find_references)
|
||||||
|
testing("CANCELLED search for references to a [usr.client.running_find_references].")
|
||||||
|
usr.client.running_find_references = null
|
||||||
|
running_find_references = null
|
||||||
|
//restart the garbage collector
|
||||||
|
SSgarbage.can_fire = TRUE
|
||||||
|
SSgarbage.next_fire = world.time + world.tick_lag
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!skip_alert && alert("Running this will lock everything up for about 5 minutes. Would you like to begin the search?", "Find References", "Yes", "No") != "Yes")
|
||||||
|
running_find_references = null
|
||||||
|
return
|
||||||
|
|
||||||
|
//this keeps the garbage collector from failing to collect objects being searched for in here
|
||||||
|
SSgarbage.can_fire = FALSE
|
||||||
|
|
||||||
|
if(usr?.client)
|
||||||
|
usr.client.running_find_references = type
|
||||||
|
|
||||||
|
testing("Beginning search for references to a [type].")
|
||||||
|
last_find_references = world.time
|
||||||
|
|
||||||
|
DoSearchVar(GLOB) //globals
|
||||||
|
for(var/datum/thing in world) //atoms (don't beleive its lies)
|
||||||
|
DoSearchVar(thing, "World -> [thing]")
|
||||||
|
|
||||||
|
for(var/datum/thing) //datums
|
||||||
|
DoSearchVar(thing, "World -> [thing]")
|
||||||
|
|
||||||
|
for(var/client/thing) //clients
|
||||||
|
DoSearchVar(thing, "World -> [thing]")
|
||||||
|
|
||||||
|
testing("Completed search for references to a [type].")
|
||||||
|
if(usr?.client)
|
||||||
|
usr.client.running_find_references = null
|
||||||
|
running_find_references = null
|
||||||
|
|
||||||
|
//restart the garbage collector
|
||||||
|
SSgarbage.can_fire = TRUE
|
||||||
|
SSgarbage.next_fire = world.time + world.tick_lag
|
||||||
|
|
||||||
|
|
||||||
|
/datum/verb/qdel_then_find_references()
|
||||||
|
set category = "Debug"
|
||||||
|
set name = "qdel() then Find References"
|
||||||
|
set src in world
|
||||||
|
|
||||||
|
qdel(src, TRUE) //force a qdel
|
||||||
|
if(!running_find_references)
|
||||||
|
find_references(TRUE)
|
||||||
|
|
||||||
|
|
||||||
|
/datum/verb/qdel_then_if_fail_find_references()
|
||||||
|
set category = "Debug"
|
||||||
|
set name = "qdel() then Find References if GC failure"
|
||||||
|
set src in world
|
||||||
|
|
||||||
|
qdel_and_find_ref_if_fail(src, TRUE)
|
||||||
|
|
||||||
|
|
||||||
|
/datum/proc/DoSearchVar(potential_container, container_name, recursive_limit = 64)
|
||||||
|
if(usr?.client && !usr.client.running_find_references)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!recursive_limit)
|
||||||
|
return
|
||||||
|
|
||||||
|
if(istype(potential_container, /datum))
|
||||||
|
var/datum/datum_container = potential_container
|
||||||
|
if(datum_container.last_find_references == last_find_references)
|
||||||
|
return
|
||||||
|
|
||||||
|
datum_container.last_find_references = last_find_references
|
||||||
|
var/list/vars_list = datum_container.vars
|
||||||
|
|
||||||
|
for(var/varname in vars_list)
|
||||||
|
if (varname == "vars")
|
||||||
|
continue
|
||||||
|
var/variable = vars_list[varname]
|
||||||
|
|
||||||
|
if(variable == src)
|
||||||
|
testing("Found [type] \ref[src] in [datum_container.type]'s [varname] var. [container_name]")
|
||||||
|
|
||||||
|
else if(islist(variable))
|
||||||
|
DoSearchVar(variable, "[container_name] -> list", recursive_limit - 1)
|
||||||
|
|
||||||
|
else if(islist(potential_container))
|
||||||
|
var/normal = IS_NORMAL_LIST(potential_container)
|
||||||
|
for(var/element_in_list in potential_container)
|
||||||
|
if(element_in_list == src)
|
||||||
|
testing("Found [type] \ref[src] in list [container_name].")
|
||||||
|
|
||||||
|
else if(element_in_list && !isnum(element_in_list) && normal && potential_container[element_in_list] == src)
|
||||||
|
testing("Found [type] \ref[src] in list [container_name]\[[element_in_list]\]")
|
||||||
|
|
||||||
|
else if(islist(element_in_list))
|
||||||
|
DoSearchVar(element_in_list, "[container_name] -> list", recursive_limit - 1)
|
||||||
|
|
||||||
|
#ifndef FIND_REF_NO_CHECK_TICK
|
||||||
|
CHECK_TICK
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/proc/qdel_and_find_ref_if_fail(datum/thing_to_del, force = FALSE)
|
||||||
|
SSgarbage.reference_find_on_fail[REF(thing_to_del)] = TRUE
|
||||||
|
qdel(thing_to_del, force)
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -45,6 +45,16 @@
|
|||||||
usr.client.admin_delete(target)
|
usr.client.admin_delete(target)
|
||||||
if (isturf(src)) // show the turf that took its place
|
if (isturf(src)) // show the turf that took its place
|
||||||
usr.client.debug_variables(src)
|
usr.client.debug_variables(src)
|
||||||
|
return
|
||||||
|
#ifdef REFERENCE_TRACKING
|
||||||
|
if(href_list[VV_HK_VIEW_REFERENCES])
|
||||||
|
var/datum/D = locate(href_list[VV_HK_TARGET])
|
||||||
|
if(!D)
|
||||||
|
to_chat(usr, "<span class='warning'>Unable to locate item.</span>")
|
||||||
|
return
|
||||||
|
usr.client.holder.view_refs(target)
|
||||||
|
return
|
||||||
|
#endif
|
||||||
if(href_list[VV_HK_MARK])
|
if(href_list[VV_HK_MARK])
|
||||||
usr.client.mark_datum(target)
|
usr.client.mark_datum(target)
|
||||||
if(href_list[VV_HK_ADDCOMPONENT])
|
if(href_list[VV_HK_ADDCOMPONENT])
|
||||||
|
|||||||
@@ -61,6 +61,7 @@
|
|||||||
"Set len" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SET_LENGTH),
|
"Set len" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SET_LENGTH),
|
||||||
"Shuffle" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SHUFFLE),
|
"Shuffle" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_LIST_SHUFFLE),
|
||||||
"Show VV To Player" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_EXPOSE),
|
"Show VV To Player" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_EXPOSE),
|
||||||
|
"View References" = VV_HREF_TARGETREF_INTERNAL(refid, VV_HK_VIEW_REFERENCES),
|
||||||
"---"
|
"---"
|
||||||
)
|
)
|
||||||
for(var/i in 1 to length(dropdownoptions))
|
for(var/i in 1 to length(dropdownoptions))
|
||||||
|
|||||||
@@ -6,5 +6,5 @@
|
|||||||
zone = BODY_ZONE_PRECISE_GROIN
|
zone = BODY_ZONE_PRECISE_GROIN
|
||||||
slot = ORGAN_SLOT_WOMB
|
slot = ORGAN_SLOT_WOMB
|
||||||
genital_flags = GENITAL_INTERNAL|GENITAL_FUID_PRODUCTION
|
genital_flags = GENITAL_INTERNAL|GENITAL_FUID_PRODUCTION
|
||||||
fluid_id = /datum/reagent/consumable/femcum
|
fluid_id = /datum/reagent/consumable/semen/femcum
|
||||||
linked_organ_slot = ORGAN_SLOT_VAGINA
|
linked_organ_slot = ORGAN_SLOT_VAGINA
|
||||||
|
|||||||
@@ -323,7 +323,7 @@
|
|||||||
name = "pipes"
|
name = "pipes"
|
||||||
|
|
||||||
/datum/asset/spritesheet/pipes/register()
|
/datum/asset/spritesheet/pipes/register()
|
||||||
for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi')) //, 'icons/obj/plumbing/fluid_ducts.dmi'))
|
for (var/each in list('icons/obj/atmospherics/pipes/pipe_item.dmi', 'icons/obj/atmospherics/pipes/disposal.dmi', 'icons/obj/atmospherics/pipes/transit_tube.dmi', 'icons/obj/plumbing/fluid_ducts.dmi'))
|
||||||
InsertAll("", each, GLOB.alldirs)
|
InsertAll("", each, GLOB.alldirs)
|
||||||
..()
|
..()
|
||||||
|
|
||||||
@@ -447,9 +447,11 @@
|
|||||||
Insert("polycrystal", 'icons/obj/telescience.dmi', "polycrystal")
|
Insert("polycrystal", 'icons/obj/telescience.dmi', "polycrystal")
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
|
||||||
/datum/asset/spritesheet/mafia
|
/datum/asset/spritesheet/mafia
|
||||||
name = "mafia"
|
name = "mafia"
|
||||||
|
|
||||||
/datum/asset/spritesheet/mafia/register()
|
/datum/asset/spritesheet/mafia/register()
|
||||||
InsertAll("", 'icons/obj/mafia.dmi')
|
InsertAll("", 'icons/obj/mafia.dmi')
|
||||||
..()
|
..()
|
||||||
|
|
||||||
|
|||||||
@@ -1636,7 +1636,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
if("mam_tail")
|
if("mam_tail")
|
||||||
var/list/snowflake_tails_list = list()
|
var/list/snowflake_tails_list = list()
|
||||||
for(var/path in GLOB.mam_tails_list)
|
for(var/path in GLOB.mam_tails_list)
|
||||||
var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path]
|
var/datum/sprite_accessory/tails/mam_tails/instance = GLOB.mam_tails_list[path]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
||||||
@@ -1661,7 +1661,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
if("snout")
|
if("snout")
|
||||||
var/list/snowflake_snouts_list = list()
|
var/list/snowflake_snouts_list = list()
|
||||||
for(var/path in GLOB.snouts_list)
|
for(var/path in GLOB.snouts_list)
|
||||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.snouts_list[path]
|
var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.snouts_list[path]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
||||||
@@ -1678,7 +1678,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
if("mam_snouts")
|
if("mam_snouts")
|
||||||
var/list/snowflake_mam_snouts_list = list()
|
var/list/snowflake_mam_snouts_list = list()
|
||||||
for(var/path in GLOB.mam_snouts_list)
|
for(var/path in GLOB.mam_snouts_list)
|
||||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path]
|
var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.mam_snouts_list[path]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
||||||
@@ -1827,7 +1827,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
|
|||||||
if("mam_ears")
|
if("mam_ears")
|
||||||
var/list/snowflake_ears_list = list()
|
var/list/snowflake_ears_list = list()
|
||||||
for(var/path in GLOB.mam_ears_list)
|
for(var/path in GLOB.mam_ears_list)
|
||||||
var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path]
|
var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[path]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
// You do not need to raise this if you are adding new values that have sane defaults.
|
// You do not need to raise this if you are adding new values that have sane defaults.
|
||||||
// Only raise this value when changing the meaning/format/name/layout of an existing value
|
// Only raise this value when changing the meaning/format/name/layout of an existing value
|
||||||
// where you would want the updater procs below to run
|
// where you would want the updater procs below to run
|
||||||
#define SAVEFILE_VERSION_MAX 34
|
#define SAVEFILE_VERSION_MAX 35
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
|
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
|
||||||
@@ -200,6 +200,10 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
|
|||||||
features["silicon_flavor_text"] = html_encode(features["silicon_flavor_text"])
|
features["silicon_flavor_text"] = html_encode(features["silicon_flavor_text"])
|
||||||
features["ooc_notes"] = html_encode(features["ooc_notes"])
|
features["ooc_notes"] = html_encode(features["ooc_notes"])
|
||||||
|
|
||||||
|
if(current_version < 35)
|
||||||
|
if(S["species"] == "lizard")
|
||||||
|
features["mam_snouts"] = features["snout"]
|
||||||
|
|
||||||
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
|
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
|
||||||
if(!ckey)
|
if(!ckey)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
ship_name = pick(strings(PIRATE_NAMES_FILE, "ship_names"))
|
ship_name = pick(strings(PIRATE_NAMES_FILE, "ship_names"))
|
||||||
|
|
||||||
/datum/round_event/pirates/announce(fake)
|
/datum/round_event/pirates/announce(fake)
|
||||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") // CITADEL EDIT metabreak
|
priority_announce("A business proposition has been downloaded and printed out at all communication consoles.", "Incoming Business Proposition", "commandreport")
|
||||||
if(fake)
|
if(fake)
|
||||||
return
|
return
|
||||||
threat_message = new
|
threat_message = new
|
||||||
@@ -49,6 +49,7 @@
|
|||||||
else
|
else
|
||||||
priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name)
|
priority_announce("Trying to cheat us? You'll regret this!",sender_override = ship_name)
|
||||||
if(!shuttle_spawned)
|
if(!shuttle_spawned)
|
||||||
|
priority_announce("You won't listen to reason? Then we'll take what's yours or die trying!",sender_override = ship_name)
|
||||||
spawn_shuttle()
|
spawn_shuttle()
|
||||||
|
|
||||||
/datum/round_event/pirates/start()
|
/datum/round_event/pirates/start()
|
||||||
@@ -83,8 +84,7 @@
|
|||||||
announce_to_ghosts(M)
|
announce_to_ghosts(M)
|
||||||
else
|
else
|
||||||
announce_to_ghosts(spawner)
|
announce_to_ghosts(spawner)
|
||||||
|
priority_announce("Unidentified ship detected near the station.")
|
||||||
priority_announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", "commandreport") //CITADEL EDIT also metabreak here too
|
|
||||||
|
|
||||||
//Shuttle equipment
|
//Shuttle equipment
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood.
|
var/self_sufficiency_req = 20 //Required total dose to make a self-sufficient hydro tray. 1:1 with earthsblood.
|
||||||
var/self_sufficiency_progress = 0
|
var/self_sufficiency_progress = 0
|
||||||
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
|
var/self_sustaining = FALSE //If the tray generates nutrients and water on its own
|
||||||
|
var/canirrigate = TRUE //tin
|
||||||
|
|
||||||
/obj/machinery/hydroponics/constructable
|
/obj/machinery/hydroponics/constructable
|
||||||
name = "hydroponics tray"
|
name = "hydroponics tray"
|
||||||
@@ -847,12 +847,13 @@
|
|||||||
if (!anchored)
|
if (!anchored)
|
||||||
to_chat(user, "<span class='warning'>Anchor the tray first!</span>")
|
to_chat(user, "<span class='warning'>Anchor the tray first!</span>")
|
||||||
return
|
return
|
||||||
using_irrigation = !using_irrigation
|
if(canirrigate)
|
||||||
O.play_tool_sound(src)
|
using_irrigation = !using_irrigation
|
||||||
user.visible_message("<span class='notice'>[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.</span>", \
|
O.play_tool_sound(src)
|
||||||
"<span class='notice'>You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.</span>")
|
user.visible_message("<span class='notice'>[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.</span>", \
|
||||||
for(var/obj/machinery/hydroponics/h in range(1,src))
|
"<span class='notice'>You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.</span>")
|
||||||
h.update_icon()
|
for(var/obj/machinery/hydroponics/h in range(1,src))
|
||||||
|
h.update_icon()
|
||||||
|
|
||||||
else if(istype(O, /obj/item/shovel/spade))
|
else if(istype(O, /obj/item/shovel/spade))
|
||||||
if(!myseed && !weedlevel)
|
if(!myseed && !weedlevel)
|
||||||
@@ -910,11 +911,14 @@
|
|||||||
harvest = 0
|
harvest = 0
|
||||||
lastproduce = age
|
lastproduce = age
|
||||||
if(istype(myseed, /obj/item/seeds/replicapod))
|
if(istype(myseed, /obj/item/seeds/replicapod))
|
||||||
to_chat(user, "<span class='notice'>You harvest from the [myseed.plantname].</span>")
|
if(user)//runtimes
|
||||||
|
to_chat(user, "<span class='notice'>You harvest from the [myseed.plantname].</span>")
|
||||||
else if(myseed.getYield() <= 0)
|
else if(myseed.getYield() <= 0)
|
||||||
to_chat(user, "<span class='warning'>You fail to harvest anything useful!</span>")
|
if(user)
|
||||||
|
to_chat(user, "<span class='warning'>You fail to harvest anything useful!</span>")
|
||||||
else
|
else
|
||||||
to_chat(user, "<span class='notice'>You harvest [myseed.getYield()] items from the [myseed.plantname].</span>")
|
if(user)
|
||||||
|
to_chat(user, "<span class='notice'>You harvest [myseed.getYield()] items from the [myseed.plantname].</span>")
|
||||||
if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest))
|
if(!myseed.get_gene(/datum/plant_gene/trait/repeated_harvest))
|
||||||
qdel(myseed)
|
qdel(myseed)
|
||||||
myseed = null
|
myseed = null
|
||||||
|
|||||||
@@ -190,6 +190,31 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
|
|||||||
parent.update_tray(user)
|
parent.update_tray(user)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
/obj/item/seeds/proc/harvest_userless()
|
||||||
|
var/obj/machinery/hydroponics/parent = loc //for ease of access
|
||||||
|
var/t_amount = 0
|
||||||
|
var/list/result = list()
|
||||||
|
var/output_loc = parent.loc
|
||||||
|
var/product_name
|
||||||
|
while(t_amount < getYield())
|
||||||
|
var/obj/item/reagent_containers/food/snacks/grown/t_prod = new product(output_loc, src)
|
||||||
|
if(parent.myseed.plantname != initial(parent.myseed.plantname))
|
||||||
|
t_prod.name = lowertext(parent.myseed.plantname)
|
||||||
|
if(productdesc)
|
||||||
|
t_prod.desc = productdesc
|
||||||
|
t_prod.seed.name = parent.myseed.name
|
||||||
|
t_prod.seed.desc = parent.myseed.desc
|
||||||
|
t_prod.seed.plantname = parent.myseed.plantname
|
||||||
|
result.Add(t_prod) // User gets a consumable
|
||||||
|
if(!t_prod)
|
||||||
|
return
|
||||||
|
t_amount++
|
||||||
|
product_name = parent.myseed.plantname
|
||||||
|
if(getYield() >= 1)
|
||||||
|
SSblackbox.record_feedback("tally", "food_harvested", getYield(), product_name)
|
||||||
|
parent.investigate_log("autmoatic harvest of [getYield()] of [src], with seed traits [english_list(genes)] and reagents_add [english_list(reagents_add)] and potency [potency].", INVESTIGATE_BOTANY)
|
||||||
|
parent.update_tray()
|
||||||
|
return result
|
||||||
|
|
||||||
/obj/item/seeds/proc/prepare_result(var/obj/item/reagent_containers/food/snacks/grown/T)
|
/obj/item/seeds/proc/prepare_result(var/obj/item/reagent_containers/food/snacks/grown/T)
|
||||||
if(!T.reagents)
|
if(!T.reagents)
|
||||||
|
|||||||
@@ -46,6 +46,7 @@
|
|||||||
var/minimal_player_age = 0
|
var/minimal_player_age = 0
|
||||||
|
|
||||||
var/outfit = null
|
var/outfit = null
|
||||||
|
var/plasma_outfit = null //the outfit given to plasmamen
|
||||||
|
|
||||||
var/exp_requirements = 0
|
var/exp_requirements = 0
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
exp_type = EXP_TYPE_CREW
|
exp_type = EXP_TYPE_CREW
|
||||||
|
|
||||||
outfit = /datum/outfit/job/atmos
|
outfit = /datum/outfit/job/atmos
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/atmospherics
|
||||||
|
|
||||||
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
|
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
exp_type_department = EXP_TYPE_SERVICE // This is so the jobs menu can work properly
|
exp_type_department = EXP_TYPE_SERVICE // This is so the jobs menu can work properly
|
||||||
|
|
||||||
outfit = /datum/outfit/job/bartender
|
outfit = /datum/outfit/job/bartender
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/bar
|
||||||
|
|
||||||
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||||
minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_BAR, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
selection_color = "#bbe291"
|
selection_color = "#bbe291"
|
||||||
|
|
||||||
outfit = /datum/outfit/job/botanist
|
outfit = /datum/outfit/job/botanist
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/botany
|
||||||
|
|
||||||
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||||
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_HYDROPONICS, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
|
|
||||||
outfit = /datum/outfit/job/captain
|
outfit = /datum/outfit/job/captain
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/captain
|
||||||
|
|
||||||
access = list() //See get_access()
|
access = list() //See get_access()
|
||||||
minimal_access = list() //See get_access()
|
minimal_access = list() //See get_access()
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
selection_color = "#ca8f55"
|
selection_color = "#ca8f55"
|
||||||
|
|
||||||
outfit = /datum/outfit/job/cargo_tech
|
outfit = /datum/outfit/job/cargo_tech
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/cargo
|
||||||
|
|
||||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING,
|
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING,
|
||||||
ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
|
ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
selection_color = "#dddddd"
|
selection_color = "#dddddd"
|
||||||
|
|
||||||
outfit = /datum/outfit/job/chaplain
|
outfit = /datum/outfit/job/chaplain
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/chaplain
|
||||||
|
|
||||||
access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
|
access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
|
||||||
minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
|
minimal_access = list(ACCESS_MORGUE, ACCESS_CHAPEL_OFFICE, ACCESS_CREMATORIUM, ACCESS_THEATRE)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
exp_requirements = 60
|
exp_requirements = 60
|
||||||
|
|
||||||
outfit = /datum/outfit/job/chemist
|
outfit = /datum/outfit/job/chemist
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/chemist
|
||||||
|
|
||||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
exp_type_department = EXP_TYPE_ENGINEERING
|
exp_type_department = EXP_TYPE_ENGINEERING
|
||||||
|
|
||||||
outfit = /datum/outfit/job/ce
|
outfit = /datum/outfit/job/ce
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/ce
|
||||||
|
|
||||||
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA,
|
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_ATMOSPHERICS, ACCESS_EVA,
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
exp_type_department = EXP_TYPE_MEDICAL
|
exp_type_department = EXP_TYPE_MEDICAL
|
||||||
|
|
||||||
outfit = /datum/outfit/job/cmo
|
outfit = /datum/outfit/job/cmo
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/cmo
|
||||||
|
|
||||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM,
|
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_HEADS, ACCESS_MINERAL_STOREROOM,
|
||||||
ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE,
|
ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_SURGERY, ACCESS_RC_ANNOUNCE,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
selection_color = "#dddddd"
|
selection_color = "#dddddd"
|
||||||
|
|
||||||
outfit = /datum/outfit/job/clown
|
outfit = /datum/outfit/job/clown
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/clown
|
||||||
|
|
||||||
access = list(ACCESS_THEATRE)
|
access = list(ACCESS_THEATRE)
|
||||||
minimal_access = list(ACCESS_THEATRE)
|
minimal_access = list(ACCESS_THEATRE)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
var/cooks = 0 //Counts cooks amount
|
var/cooks = 0 //Counts cooks amount
|
||||||
|
|
||||||
outfit = /datum/outfit/job/cook
|
outfit = /datum/outfit/job/cook
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/chef
|
||||||
|
|
||||||
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
access = list(ACCESS_HYDROPONICS, ACCESS_BAR, ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||||
minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_KITCHEN, ACCESS_MORGUE, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
selection_color = "#dddddd"
|
selection_color = "#dddddd"
|
||||||
|
|
||||||
outfit = /datum/outfit/job/curator
|
outfit = /datum/outfit/job/curator
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/curator
|
||||||
|
|
||||||
access = list(ACCESS_LIBRARY)
|
access = list(ACCESS_LIBRARY)
|
||||||
minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION)
|
minimal_access = list(ACCESS_LIBRARY, ACCESS_CONSTRUCTION, ACCESS_MINING_STATION)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
exp_type = EXP_TYPE_CREW
|
exp_type = EXP_TYPE_CREW
|
||||||
|
|
||||||
outfit = /datum/outfit/job/detective
|
outfit = /datum/outfit/job/detective
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/detective
|
||||||
|
|
||||||
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||||
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_SEC_DOORS, ACCESS_FORENSICS_LOCKERS, ACCESS_MORGUE, ACCESS_MAINT_TUNNELS, ACCESS_COURT, ACCESS_BRIG, ACCESS_WEAPONS, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
exp_requirements = 60
|
exp_requirements = 60
|
||||||
|
|
||||||
outfit = /datum/outfit/job/geneticist
|
outfit = /datum/outfit/job/geneticist
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/genetics
|
||||||
|
|
||||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE)
|
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_ROBOTICS, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE)
|
||||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
exp_type_department = EXP_TYPE_SERVICE
|
exp_type_department = EXP_TYPE_SERVICE
|
||||||
|
|
||||||
outfit = /datum/outfit/job/hop
|
outfit = /datum/outfit/job/hop
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/hop
|
||||||
|
|
||||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
|
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS,
|
||||||
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
|
ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS,
|
||||||
|
|||||||
@@ -17,6 +17,8 @@
|
|||||||
exp_type_department = EXP_TYPE_SECURITY
|
exp_type_department = EXP_TYPE_SECURITY
|
||||||
|
|
||||||
outfit = /datum/outfit/job/hos
|
outfit = /datum/outfit/job/hos
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/hos
|
||||||
|
|
||||||
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
mind_traits = list(TRAIT_LAW_ENFORCEMENT_METABOLISM)
|
||||||
|
|
||||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,
|
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
selection_color = "#bbe291"
|
selection_color = "#bbe291"
|
||||||
|
|
||||||
outfit = /datum/outfit/job/janitor
|
outfit = /datum/outfit/job/janitor
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/janitor
|
||||||
|
|
||||||
access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
|
access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
|
||||||
minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_JANITOR, ACCESS_MAINT_TUNNELS, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
var/lawyers = 0 //Counts lawyer amount
|
var/lawyers = 0 //Counts lawyer amount
|
||||||
|
|
||||||
outfit = /datum/outfit/job/lawyer
|
outfit = /datum/outfit/job/lawyer
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/bar //yes, this is correct, there's no 'lawyer' plasmeme outfit
|
||||||
|
|
||||||
access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
|
access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
|
||||||
minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
|
minimal_access = list(ACCESS_LAWYER, ACCESS_COURT, ACCESS_SEC_DOORS)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
selection_color = "#74b5e0"
|
selection_color = "#74b5e0"
|
||||||
|
|
||||||
outfit = /datum/outfit/job/doctor
|
outfit = /datum/outfit/job/doctor
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/medical
|
||||||
|
|
||||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
|
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
|
||||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
selection_color = "#dddddd"
|
selection_color = "#dddddd"
|
||||||
|
|
||||||
outfit = /datum/outfit/job/mime
|
outfit = /datum/outfit/job/mime
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/mime
|
||||||
|
|
||||||
access = list(ACCESS_THEATRE)
|
access = list(ACCESS_THEATRE)
|
||||||
minimal_access = list(ACCESS_THEATRE)
|
minimal_access = list(ACCESS_THEATRE)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
exp_type = EXP_TYPE_CREW
|
exp_type = EXP_TYPE_CREW
|
||||||
|
|
||||||
outfit = /datum/outfit/job/rd
|
outfit = /datum/outfit/job/rd
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/rd
|
||||||
|
|
||||||
access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE,
|
access = list(ACCESS_RD, ACCESS_HEADS, ACCESS_TOX, ACCESS_GENETICS, ACCESS_MORGUE,
|
||||||
ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS,
|
ACCESS_TOX_STORAGE, ACCESS_TELEPORTER, ACCESS_SEC_DOORS,
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
exp_type = EXP_TYPE_CREW
|
exp_type = EXP_TYPE_CREW
|
||||||
|
|
||||||
outfit = /datum/outfit/job/roboticist
|
outfit = /datum/outfit/job/roboticist
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/robotics
|
||||||
|
|
||||||
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS)
|
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM, ACCESS_XENOBIOLOGY, ACCESS_GENETICS)
|
||||||
minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_ROBOTICS, ACCESS_TECH_STORAGE, ACCESS_MORGUE, ACCESS_RESEARCH, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
exp_type = EXP_TYPE_CREW
|
exp_type = EXP_TYPE_CREW
|
||||||
|
|
||||||
outfit = /datum/outfit/job/scientist
|
outfit = /datum/outfit/job/scientist
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/science
|
||||||
|
|
||||||
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS)
|
access = list(ACCESS_ROBOTICS, ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM, ACCESS_TECH_STORAGE, ACCESS_GENETICS)
|
||||||
minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_TOX, ACCESS_TOX_STORAGE, ACCESS_RESEARCH, ACCESS_XENOBIOLOGY, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
exp_type = EXP_TYPE_CREW
|
exp_type = EXP_TYPE_CREW
|
||||||
|
|
||||||
outfit = /datum/outfit/job/security
|
outfit = /datum/outfit/job/security
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/security
|
||||||
|
|
||||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
||||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access()
|
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/officer/get_access()
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
|
|
||||||
outfit = /datum/outfit/job/miner
|
outfit = /datum/outfit/job/miner
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/mining
|
||||||
|
|
||||||
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING,
|
access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_MINING,
|
||||||
ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
|
ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
exp_type = EXP_TYPE_CREW
|
exp_type = EXP_TYPE_CREW
|
||||||
|
|
||||||
outfit = /datum/outfit/job/engineer
|
outfit = /datum/outfit/job/engineer
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/engineering
|
||||||
|
|
||||||
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
access = list(ACCESS_ENGINE, ACCESS_ENGINE_EQUIP, ACCESS_TECH_STORAGE, ACCESS_MAINT_TUNNELS,
|
||||||
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CONSTRUCTION, ACCESS_ATMOSPHERICS, ACCESS_TCOMSAT, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
exp_requirements = 60
|
exp_requirements = 60
|
||||||
|
|
||||||
outfit = /datum/outfit/job/virologist
|
outfit = /datum/outfit/job/virologist
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/viro
|
||||||
|
|
||||||
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
access = list(ACCESS_MEDICAL, ACCESS_MORGUE, ACCESS_SURGERY, ACCESS_CHEMISTRY, ACCESS_VIROLOGY, ACCESS_GENETICS, ACCESS_CLONING, ACCESS_MINERAL_STOREROOM)
|
||||||
minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
|
minimal_access = list(ACCESS_MEDICAL, ACCESS_VIROLOGY, ACCESS_MINERAL_STOREROOM)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
exp_type = EXP_TYPE_CREW
|
exp_type = EXP_TYPE_CREW
|
||||||
|
|
||||||
outfit = /datum/outfit/job/warden
|
outfit = /datum/outfit/job/warden
|
||||||
|
plasma_outfit = /datum/outfit/plasmaman/warden
|
||||||
|
|
||||||
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_MAINT_TUNNELS, ACCESS_MORGUE, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_FORENSICS_LOCKERS, ACCESS_MINERAL_STOREROOM)
|
||||||
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access()
|
minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_BRIG, ACCESS_ARMORY, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_ENTER_GENPOP, ACCESS_LEAVE_GENPOP, ACCESS_MINERAL_STOREROOM) // See /datum/job/warden/get_access()
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
/datum/sprite_accessory/mam_tails/shark/datashark
|
/datum/sprite_accessory/tails/mam_tails/shark/datashark
|
||||||
name = "DataShark"
|
name = "DataShark"
|
||||||
icon_state = "datashark"
|
icon_state = "datashark"
|
||||||
ckeys_allowed = list("rubyflamewing")
|
ckeys_allowed = list("rubyflamewing")
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/shark/datashark
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/shark/datashark
|
||||||
name = "DataShark"
|
name = "DataShark"
|
||||||
icon_state = "datashark"
|
icon_state = "datashark"
|
||||||
ckeys_allowed = list("rubyflamewing")
|
ckeys_allowed = list("rubyflamewing")
|
||||||
@@ -14,19 +14,19 @@
|
|||||||
ckeys_allowed = list("rubyflamewing")
|
ckeys_allowed = list("rubyflamewing")
|
||||||
|
|
||||||
//Sabresune
|
//Sabresune
|
||||||
/datum/sprite_accessory/mam_ears/sabresune
|
/datum/sprite_accessory/ears/mam_ears/sabresune
|
||||||
name = "Sabresune"
|
name = "Sabresune"
|
||||||
icon_state = "sabresune"
|
icon_state = "sabresune"
|
||||||
ckeys_allowed = list("poojawa")
|
ckeys_allowed = list("poojawa")
|
||||||
extra = TRUE
|
extra = TRUE
|
||||||
extra_color_src = MUTCOLORS3
|
extra_color_src = MUTCOLORS3
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/sabresune
|
/datum/sprite_accessory/tails/mam_tails/sabresune
|
||||||
name = "Sabresune"
|
name = "Sabresune"
|
||||||
icon_state = "sabresune"
|
icon_state = "sabresune"
|
||||||
ckeys_allowed = list("poojawa")
|
ckeys_allowed = list("poojawa")
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/sabresune
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/sabresune
|
||||||
name = "Sabresune"
|
name = "Sabresune"
|
||||||
icon_state = "sabresune"
|
icon_state = "sabresune"
|
||||||
ckeys_allowed = list("poojawa")
|
ckeys_allowed = list("poojawa")
|
||||||
@@ -37,17 +37,17 @@
|
|||||||
ckeys_allowed = list("poojawa")
|
ckeys_allowed = list("poojawa")
|
||||||
|
|
||||||
//Lunasune
|
//Lunasune
|
||||||
/datum/sprite_accessory/mam_ears/lunasune
|
/datum/sprite_accessory/ears/mam_ears/lunasune
|
||||||
name = "lunasune"
|
name = "lunasune"
|
||||||
icon_state = "lunasune"
|
icon_state = "lunasune"
|
||||||
ckeys_allowed = list("invader4352")
|
ckeys_allowed = list("invader4352")
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/lunasune
|
/datum/sprite_accessory/tails/mam_tails/lunasune
|
||||||
name = "lunasune"
|
name = "lunasune"
|
||||||
icon_state = "lunasune"
|
icon_state = "lunasune"
|
||||||
ckeys_allowed = list("invader4352")
|
ckeys_allowed = list("invader4352")
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/lunasune
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/lunasune
|
||||||
name = "lunasune"
|
name = "lunasune"
|
||||||
icon_state = "lunasune"
|
icon_state = "lunasune"
|
||||||
ckeys_allowed = list("invader4352")
|
ckeys_allowed = list("invader4352")
|
||||||
|
|||||||
@@ -76,6 +76,9 @@
|
|||||||
//For soft-restricting markings to species IDs
|
//For soft-restricting markings to species IDs
|
||||||
var/list/recommended_species
|
var/list/recommended_species
|
||||||
|
|
||||||
|
/datum/sprite_accessory/proc/is_not_visible(var/mob/living/carbon/human/H, var/tauric) //return if the accessory shouldn't be shown
|
||||||
|
return FALSE
|
||||||
|
|
||||||
/datum/sprite_accessory/underwear
|
/datum/sprite_accessory/underwear
|
||||||
icon = 'icons/mob/clothing/underwear.dmi'
|
icon = 'icons/mob/clothing/underwear.dmi'
|
||||||
var/has_color = FALSE
|
var/has_color = FALSE
|
||||||
|
|||||||
@@ -7,6 +7,9 @@
|
|||||||
mutant_part_string = "xenodorsal"
|
mutant_part_string = "xenodorsal"
|
||||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/xeno_dorsal/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return (!H.dna.features["xenodorsal"] || H.dna.features["xenodorsal"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)))
|
||||||
|
|
||||||
/datum/sprite_accessory/xeno_dorsal/standard
|
/datum/sprite_accessory/xeno_dorsal/standard
|
||||||
name = "Standard"
|
name = "Standard"
|
||||||
icon_state = "standard"
|
icon_state = "standard"
|
||||||
@@ -27,6 +30,9 @@
|
|||||||
mutant_part_string = "tail"
|
mutant_part_string = "tail"
|
||||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/xeno_tail/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return (!H.dna.features["xenotail"] || H.dna.features["xenotail"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
|
||||||
|
|
||||||
/datum/sprite_accessory/xeno_tail/none
|
/datum/sprite_accessory/xeno_tail/none
|
||||||
name = "None"
|
name = "None"
|
||||||
relevant_layers = null
|
relevant_layers = null
|
||||||
@@ -43,6 +49,10 @@
|
|||||||
mutant_part_string = "xhead"
|
mutant_part_string = "xhead"
|
||||||
relevant_layers = list(BODY_ADJ_LAYER)
|
relevant_layers = list(BODY_ADJ_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/xeno_head/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||||
|
return (!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||||
|
|
||||||
/datum/sprite_accessory/xeno_head/standard
|
/datum/sprite_accessory/xeno_head/standard
|
||||||
name = "Standard"
|
name = "Standard"
|
||||||
icon_state = "standard"
|
icon_state = "standard"
|
||||||
|
|||||||
@@ -224,6 +224,9 @@
|
|||||||
color_src = 0
|
color_src = 0
|
||||||
relevant_layers = list(BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_FRONT_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/insect_fluff/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return (!H.dna.features["insect_fluff"] || H.dna.features["insect_fluff"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
|
||||||
|
|
||||||
/datum/sprite_accessory/insect_fluff/none
|
/datum/sprite_accessory/insect_fluff/none
|
||||||
name = "None"
|
name = "None"
|
||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
mutant_part_string = "ears"
|
mutant_part_string = "ears"
|
||||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||||
|
return (!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||||
|
|
||||||
/datum/sprite_accessory/ears/none
|
/datum/sprite_accessory/ears/none
|
||||||
name = "None"
|
name = "None"
|
||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
@@ -175,50 +179,54 @@
|
|||||||
*************** Furry Ears ****************
|
*************** Furry Ears ****************
|
||||||
*******************************************/
|
*******************************************/
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears
|
/datum/sprite_accessory/ears/mam_ears
|
||||||
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
|
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
|
||||||
color_src = MATRIXED
|
color_src = MATRIXED
|
||||||
mutant_part_string = "ears"
|
mutant_part_string = "ears"
|
||||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/none
|
/datum/sprite_accessory/ears/mam_ears/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||||
|
return (!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/ears/mam_ears/none
|
||||||
name = "None"
|
name = "None"
|
||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
relevant_layers = null
|
relevant_layers = null
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/axolotl
|
/datum/sprite_accessory/ears/mam_ears/axolotl
|
||||||
name = "Axolotl"
|
name = "Axolotl"
|
||||||
icon_state = "axolotl"
|
icon_state = "axolotl"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/bat
|
/datum/sprite_accessory/ears/mam_ears/bat
|
||||||
name = "Bat"
|
name = "Bat"
|
||||||
icon_state = "bat"
|
icon_state = "bat"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/bear
|
/datum/sprite_accessory/ears/mam_ears/bear
|
||||||
name = "Bear"
|
name = "Bear"
|
||||||
icon_state = "bear"
|
icon_state = "bear"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/bigwolf
|
/datum/sprite_accessory/ears/mam_ears/bigwolf
|
||||||
name = "Big Wolf"
|
name = "Big Wolf"
|
||||||
icon_state = "bigwolf"
|
icon_state = "bigwolf"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/bigwolfinner
|
/datum/sprite_accessory/ears/mam_ears/bigwolfinner
|
||||||
name = "Big Wolf (ALT)"
|
name = "Big Wolf (ALT)"
|
||||||
icon_state = "bigwolfinner"
|
icon_state = "bigwolfinner"
|
||||||
extra = TRUE
|
extra = TRUE
|
||||||
extra_color_src = NONE
|
extra_color_src = NONE
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/bigwolfdark
|
/datum/sprite_accessory/ears/mam_ears/bigwolfdark
|
||||||
name = "Dark Big Wolf"
|
name = "Dark Big Wolf"
|
||||||
icon_state = "bigwolfdark"
|
icon_state = "bigwolfdark"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/bigwolfinnerdark
|
/datum/sprite_accessory/ears/mam_ears/bigwolfinnerdark
|
||||||
name = "Dark Big Wolf (ALT)"
|
name = "Dark Big Wolf (ALT)"
|
||||||
icon_state = "bigwolfinnerdark"
|
icon_state = "bigwolfinnerdark"
|
||||||
extra = TRUE
|
extra = TRUE
|
||||||
extra_color_src = NONE
|
extra_color_src = NONE
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/cat
|
/datum/sprite_accessory/ears/mam_ears/cat
|
||||||
name = "Cat"
|
name = "Cat"
|
||||||
icon_state = "cat"
|
icon_state = "cat"
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
@@ -226,100 +234,100 @@
|
|||||||
extra = TRUE
|
extra = TRUE
|
||||||
extra_color_src = NONE
|
extra_color_src = NONE
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/catbig
|
/datum/sprite_accessory/ears/mam_ears/catbig
|
||||||
name = "Cat, Big"
|
name = "Cat, Big"
|
||||||
icon_state = "catbig"
|
icon_state = "catbig"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/cow
|
/datum/sprite_accessory/ears/mam_ears/cow
|
||||||
name = "Cow"
|
name = "Cow"
|
||||||
icon_state = "cow"
|
icon_state = "cow"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/curled
|
/datum/sprite_accessory/ears/mam_ears/curled
|
||||||
name = "Curled Horn"
|
name = "Curled Horn"
|
||||||
icon_state = "horn1"
|
icon_state = "horn1"
|
||||||
color_src = MUTCOLORS3
|
color_src = MUTCOLORS3
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/deer
|
/datum/sprite_accessory/ears/mam_ears/deer
|
||||||
name = "Deer"
|
name = "Deer"
|
||||||
icon_state = "deer"
|
icon_state = "deer"
|
||||||
color_src = MUTCOLORS3
|
color_src = MUTCOLORS3
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/eevee
|
/datum/sprite_accessory/ears/mam_ears/eevee
|
||||||
name = "Eevee"
|
name = "Eevee"
|
||||||
icon_state = "eevee"
|
icon_state = "eevee"
|
||||||
|
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/elf
|
/datum/sprite_accessory/ears/mam_ears/elf
|
||||||
name = "Elf"
|
name = "Elf"
|
||||||
icon_state = "elf"
|
icon_state = "elf"
|
||||||
color_src = MUTCOLORS3
|
color_src = MUTCOLORS3
|
||||||
|
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/elephant
|
/datum/sprite_accessory/ears/mam_ears/elephant
|
||||||
name = "Elephant"
|
name = "Elephant"
|
||||||
icon_state = "elephant"
|
icon_state = "elephant"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/fennec
|
/datum/sprite_accessory/ears/mam_ears/fennec
|
||||||
name = "Fennec"
|
name = "Fennec"
|
||||||
icon_state = "fennec"
|
icon_state = "fennec"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/fish
|
/datum/sprite_accessory/ears/mam_ears/fish
|
||||||
name = "Fish"
|
name = "Fish"
|
||||||
icon_state = "fish"
|
icon_state = "fish"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/fox
|
/datum/sprite_accessory/ears/mam_ears/fox
|
||||||
name = "Fox"
|
name = "Fox"
|
||||||
icon_state = "fox"
|
icon_state = "fox"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/husky
|
/datum/sprite_accessory/ears/mam_ears/husky
|
||||||
name = "Husky"
|
name = "Husky"
|
||||||
icon_state = "wolf"
|
icon_state = "wolf"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/kangaroo
|
/datum/sprite_accessory/ears/mam_ears/kangaroo
|
||||||
name = "kangaroo"
|
name = "kangaroo"
|
||||||
icon_state = "kangaroo"
|
icon_state = "kangaroo"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/jellyfish
|
/datum/sprite_accessory/ears/mam_ears/jellyfish
|
||||||
name = "Jellyfish"
|
name = "Jellyfish"
|
||||||
icon_state = "jellyfish"
|
icon_state = "jellyfish"
|
||||||
color_src = HAIR
|
color_src = HAIR
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/lab
|
/datum/sprite_accessory/ears/mam_ears/lab
|
||||||
name = "Dog, Long"
|
name = "Dog, Long"
|
||||||
icon_state = "lab"
|
icon_state = "lab"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/murid
|
/datum/sprite_accessory/ears/mam_ears/murid
|
||||||
name = "Murid"
|
name = "Murid"
|
||||||
icon_state = "murid"
|
icon_state = "murid"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/otie
|
/datum/sprite_accessory/ears/mam_ears/otie
|
||||||
name = "Otusian"
|
name = "Otusian"
|
||||||
icon_state = "otie"
|
icon_state = "otie"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/squirrel
|
/datum/sprite_accessory/ears/mam_ears/squirrel
|
||||||
name = "Squirrel"
|
name = "Squirrel"
|
||||||
icon_state = "squirrel"
|
icon_state = "squirrel"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/pede
|
/datum/sprite_accessory/ears/mam_ears/pede
|
||||||
name = "Scolipede"
|
name = "Scolipede"
|
||||||
icon_state = "pede"
|
icon_state = "pede"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/rabbit
|
/datum/sprite_accessory/ears/mam_ears/rabbit
|
||||||
name = "Rabbit"
|
name = "Rabbit"
|
||||||
icon_state = "rabbit"
|
icon_state = "rabbit"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/sergal
|
/datum/sprite_accessory/ears/mam_ears/sergal
|
||||||
name = "Sergal"
|
name = "Sergal"
|
||||||
icon_state = "sergal"
|
icon_state = "sergal"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/skunk
|
/datum/sprite_accessory/ears/mam_ears/skunk
|
||||||
name = "skunk"
|
name = "skunk"
|
||||||
icon_state = "skunk"
|
icon_state = "skunk"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/wolf
|
/datum/sprite_accessory/ears/mam_ears/wolf
|
||||||
name = "Wolf"
|
name = "Wolf"
|
||||||
icon_state = "wolf"
|
icon_state = "wolf"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_ears/bunny
|
/datum/sprite_accessory/ears/mam_ears/bunny
|
||||||
name = "Bunny"
|
name = "Bunny"
|
||||||
icon_state = "bunny"
|
icon_state = "bunny"
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
relevant_layers = list(BODY_ADJ_LAYER)
|
relevant_layers = list(BODY_ADJ_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/frills/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||||
|
return (!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||||
|
|
||||||
/datum/sprite_accessory/frills/none
|
/datum/sprite_accessory/frills/none
|
||||||
name = "None"
|
name = "None"
|
||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
color_src = HORNCOLOR
|
color_src = HORNCOLOR
|
||||||
relevant_layers = list(HORNS_LAYER)
|
relevant_layers = list(HORNS_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/horns/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||||
|
return (!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||||
|
|
||||||
/datum/sprite_accessory/horns/none
|
/datum/sprite_accessory/horns/none
|
||||||
name = "None"
|
name = "None"
|
||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
|
|||||||
@@ -30,6 +30,9 @@
|
|||||||
var/alt_taur_mode = NONE //Same as above.
|
var/alt_taur_mode = NONE //Same as above.
|
||||||
var/hide_legs = USE_QUADRUPED_CLIP_MASK
|
var/hide_legs = USE_QUADRUPED_CLIP_MASK
|
||||||
|
|
||||||
|
/datum/sprite_accessory/taur/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return (!tauric || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)))
|
||||||
|
|
||||||
/datum/sprite_accessory/taur/New()
|
/datum/sprite_accessory/taur/New()
|
||||||
switch(hide_legs)
|
switch(hide_legs)
|
||||||
if(USE_QUADRUPED_CLIP_MASK)
|
if(USE_QUADRUPED_CLIP_MASK)
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
mutant_part_string = "snout"
|
mutant_part_string = "snout"
|
||||||
relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||||
|
return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||||
|
|
||||||
/datum/sprite_accessory/snouts/sharp
|
/datum/sprite_accessory/snouts/sharp
|
||||||
name = "Sharp"
|
name = "Sharp"
|
||||||
icon_state = "sharp"
|
icon_state = "sharp"
|
||||||
@@ -150,136 +154,140 @@
|
|||||||
************** Mammal Snouts **************
|
************** Mammal Snouts **************
|
||||||
*******************************************/
|
*******************************************/
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts
|
/datum/sprite_accessory/snouts/mam_snouts
|
||||||
color_src = MATRIXED
|
color_src = MATRIXED
|
||||||
icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
|
icon = 'modular_citadel/icons/mob/mam_snouts.dmi'
|
||||||
recommended_species = list("mammal", "slimeperson", "insect", "podweak")
|
recommended_species = list("mammal", "slimeperson", "insect", "podweak")
|
||||||
mutant_part_string = "snout"
|
mutant_part_string = "snout"
|
||||||
relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/none
|
/datum/sprite_accessory/snouts/mam_snouts/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||||
|
return ((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/snouts/mam_snouts/none
|
||||||
name = "None"
|
name = "None"
|
||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
recommended_species = null
|
recommended_species = null
|
||||||
relevant_layers = null
|
relevant_layers = null
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/bird
|
/datum/sprite_accessory/snouts/mam_snouts/bird
|
||||||
name = "Beak"
|
name = "Beak"
|
||||||
icon_state = "bird"
|
icon_state = "bird"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/bigbeak
|
/datum/sprite_accessory/snouts/mam_snouts/bigbeak
|
||||||
name = "Big Beak"
|
name = "Big Beak"
|
||||||
icon_state = "bigbeak"
|
icon_state = "bigbeak"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/bug
|
/datum/sprite_accessory/snouts/mam_snouts/bug
|
||||||
name = "Bug"
|
name = "Bug"
|
||||||
icon_state = "bug"
|
icon_state = "bug"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
extra2 = TRUE
|
extra2 = TRUE
|
||||||
extra2_color_src = MUTCOLORS3
|
extra2_color_src = MUTCOLORS3
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/elephant
|
/datum/sprite_accessory/snouts/mam_snouts/elephant
|
||||||
name = "Elephant"
|
name = "Elephant"
|
||||||
icon_state = "elephant"
|
icon_state = "elephant"
|
||||||
extra = TRUE
|
extra = TRUE
|
||||||
extra_color_src = MUTCOLORS3
|
extra_color_src = MUTCOLORS3
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/skulldog
|
/datum/sprite_accessory/snouts/mam_snouts/skulldog
|
||||||
name = "Skulldog"
|
name = "Skulldog"
|
||||||
icon_state = "skulldog"
|
icon_state = "skulldog"
|
||||||
extra = TRUE
|
extra = TRUE
|
||||||
extra_color_src = MATRIXED
|
extra_color_src = MATRIXED
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/lcanid
|
/datum/sprite_accessory/snouts/mam_snouts/lcanid
|
||||||
name = "Mammal, Long"
|
name = "Mammal, Long"
|
||||||
icon_state = "lcanid"
|
icon_state = "lcanid"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/lcanidalt
|
/datum/sprite_accessory/snouts/mam_snouts/lcanidalt
|
||||||
name = "Mammal, Long ALT"
|
name = "Mammal, Long ALT"
|
||||||
icon_state = "lcanidalt"
|
icon_state = "lcanidalt"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/scanid
|
/datum/sprite_accessory/snouts/mam_snouts/scanid
|
||||||
name = "Mammal, Short"
|
name = "Mammal, Short"
|
||||||
icon_state = "scanid"
|
icon_state = "scanid"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/scanidalt
|
/datum/sprite_accessory/snouts/mam_snouts/scanidalt
|
||||||
name = "Mammal, Short ALT"
|
name = "Mammal, Short ALT"
|
||||||
icon_state = "scanidalt"
|
icon_state = "scanidalt"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/scanidalt2
|
/datum/sprite_accessory/snouts/mam_snouts/scanidalt2
|
||||||
name = "Mammal, Short ALT 2"
|
name = "Mammal, Short ALT 2"
|
||||||
icon_state = "scanidalt2"
|
icon_state = "scanidalt2"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/wolf
|
/datum/sprite_accessory/snouts/mam_snouts/wolf
|
||||||
name = "Mammal, Thick"
|
name = "Mammal, Thick"
|
||||||
icon_state = "wolf"
|
icon_state = "wolf"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/wolfalt
|
/datum/sprite_accessory/snouts/mam_snouts/wolfalt
|
||||||
name = "Mammal, Thick ALT"
|
name = "Mammal, Thick ALT"
|
||||||
icon_state = "wolfalt"
|
icon_state = "wolfalt"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/redpanda
|
/datum/sprite_accessory/snouts/mam_snouts/redpanda
|
||||||
name = "WahCoon"
|
name = "WahCoon"
|
||||||
icon_state = "wah"
|
icon_state = "wah"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/redpandaalt
|
/datum/sprite_accessory/snouts/mam_snouts/redpandaalt
|
||||||
name = "WahCoon ALT"
|
name = "WahCoon ALT"
|
||||||
icon_state = "wahalt"
|
icon_state = "wahalt"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/rhino
|
/datum/sprite_accessory/snouts/mam_snouts/rhino
|
||||||
name = "Horn"
|
name = "Horn"
|
||||||
icon_state = "rhino"
|
icon_state = "rhino"
|
||||||
extra = TRUE
|
extra = TRUE
|
||||||
extra = MUTCOLORS3
|
extra = MUTCOLORS3
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/rodent
|
/datum/sprite_accessory/snouts/mam_snouts/rodent
|
||||||
name = "Rodent"
|
name = "Rodent"
|
||||||
icon_state = "rodent"
|
icon_state = "rodent"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/husky
|
/datum/sprite_accessory/snouts/mam_snouts/husky
|
||||||
name = "Husky"
|
name = "Husky"
|
||||||
icon_state = "husky"
|
icon_state = "husky"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/otie
|
/datum/sprite_accessory/snouts/mam_snouts/otie
|
||||||
name = "Otie"
|
name = "Otie"
|
||||||
icon_state = "otie"
|
icon_state = "otie"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/pede
|
/datum/sprite_accessory/snouts/mam_snouts/pede
|
||||||
name = "Scolipede"
|
name = "Scolipede"
|
||||||
icon_state = "pede"
|
icon_state = "pede"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/sergal
|
/datum/sprite_accessory/snouts/mam_snouts/sergal
|
||||||
name = "Sergal"
|
name = "Sergal"
|
||||||
icon_state = "sergal"
|
icon_state = "sergal"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/shark
|
/datum/sprite_accessory/snouts/mam_snouts/shark
|
||||||
name = "Shark"
|
name = "Shark"
|
||||||
icon_state = "shark"
|
icon_state = "shark"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/hshark
|
/datum/sprite_accessory/snouts/mam_snouts/hshark
|
||||||
name = "hShark"
|
name = "hShark"
|
||||||
icon_state = "hshark"
|
icon_state = "hshark"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/toucan
|
/datum/sprite_accessory/snouts/mam_snouts/toucan
|
||||||
name = "Toucan"
|
name = "Toucan"
|
||||||
icon_state = "toucan"
|
icon_state = "toucan"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/sharp
|
/datum/sprite_accessory/snouts/mam_snouts/sharp
|
||||||
name = "Sharp"
|
name = "Sharp"
|
||||||
icon_state = "sharp"
|
icon_state = "sharp"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/round
|
/datum/sprite_accessory/snouts/mam_snouts/round
|
||||||
name = "Round"
|
name = "Round"
|
||||||
icon_state = "round"
|
icon_state = "round"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/sharplight
|
/datum/sprite_accessory/snouts/mam_snouts/sharplight
|
||||||
name = "Sharp + Light"
|
name = "Sharp + Light"
|
||||||
icon_state = "sharplight"
|
icon_state = "sharplight"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/roundlight
|
/datum/sprite_accessory/snouts/mam_snouts/roundlight
|
||||||
name = "Round + Light"
|
name = "Round + Light"
|
||||||
icon_state = "roundlight"
|
icon_state = "roundlight"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
@@ -289,109 +297,109 @@
|
|||||||
**************** Snouts *******************
|
**************** Snouts *******************
|
||||||
*************but higher up*****************/
|
*************but higher up*****************/
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fbird
|
/datum/sprite_accessory/snouts/mam_snouts/fbird
|
||||||
name = "Beak (Top)"
|
name = "Beak (Top)"
|
||||||
icon_state = "fbird"
|
icon_state = "fbird"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fbigbeak
|
/datum/sprite_accessory/snouts/mam_snouts/fbigbeak
|
||||||
name = "Big Beak (Top)"
|
name = "Big Beak (Top)"
|
||||||
icon_state = "fbigbeak"
|
icon_state = "fbigbeak"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fbug
|
/datum/sprite_accessory/snouts/mam_snouts/fbug
|
||||||
name = "Bug (Top)"
|
name = "Bug (Top)"
|
||||||
icon_state = "fbug"
|
icon_state = "fbug"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
extra2 = TRUE
|
extra2 = TRUE
|
||||||
extra2_color_src = MUTCOLORS3
|
extra2_color_src = MUTCOLORS3
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/felephant
|
/datum/sprite_accessory/snouts/mam_snouts/felephant
|
||||||
name = "Elephant (Top)"
|
name = "Elephant (Top)"
|
||||||
icon_state = "felephant"
|
icon_state = "felephant"
|
||||||
extra = TRUE
|
extra = TRUE
|
||||||
extra_color_src = MUTCOLORS3
|
extra_color_src = MUTCOLORS3
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/flcanid
|
/datum/sprite_accessory/snouts/mam_snouts/flcanid
|
||||||
name = "Mammal, Long (Top)"
|
name = "Mammal, Long (Top)"
|
||||||
icon_state = "flcanid"
|
icon_state = "flcanid"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/flcanidalt
|
/datum/sprite_accessory/snouts/mam_snouts/flcanidalt
|
||||||
name = "Mammal, Long ALT (Top)"
|
name = "Mammal, Long ALT (Top)"
|
||||||
icon_state = "flcanidalt"
|
icon_state = "flcanidalt"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fscanid
|
/datum/sprite_accessory/snouts/mam_snouts/fscanid
|
||||||
name = "Mammal, Short (Top)"
|
name = "Mammal, Short (Top)"
|
||||||
icon_state = "fscanid"
|
icon_state = "fscanid"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fscanidalt
|
/datum/sprite_accessory/snouts/mam_snouts/fscanidalt
|
||||||
name = "Mammal, Short ALT (Top)"
|
name = "Mammal, Short ALT (Top)"
|
||||||
icon_state = "fscanidalt"
|
icon_state = "fscanidalt"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fscanidalt2
|
/datum/sprite_accessory/snouts/mam_snouts/fscanidalt2
|
||||||
name = "Mammal, Short ALT 2 (Top)"
|
name = "Mammal, Short ALT 2 (Top)"
|
||||||
icon_state = "fscanidalt2"
|
icon_state = "fscanidalt2"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fwolf
|
/datum/sprite_accessory/snouts/mam_snouts/fwolf
|
||||||
name = "Mammal, Thick (Top)"
|
name = "Mammal, Thick (Top)"
|
||||||
icon_state = "fwolf"
|
icon_state = "fwolf"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fwolfalt
|
/datum/sprite_accessory/snouts/mam_snouts/fwolfalt
|
||||||
name = "Mammal, Thick ALT (Top)"
|
name = "Mammal, Thick ALT (Top)"
|
||||||
icon_state = "fwolfalt"
|
icon_state = "fwolfalt"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fredpanda
|
/datum/sprite_accessory/snouts/mam_snouts/fredpanda
|
||||||
name = "WahCoon (Top)"
|
name = "WahCoon (Top)"
|
||||||
icon_state = "fwah"
|
icon_state = "fwah"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/frhino
|
/datum/sprite_accessory/snouts/mam_snouts/frhino
|
||||||
name = "Horn (Top)"
|
name = "Horn (Top)"
|
||||||
icon_state = "frhino"
|
icon_state = "frhino"
|
||||||
extra = TRUE
|
extra = TRUE
|
||||||
extra = MUTCOLORS3
|
extra = MUTCOLORS3
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/frodent
|
/datum/sprite_accessory/snouts/mam_snouts/frodent
|
||||||
name = "Rodent (Top)"
|
name = "Rodent (Top)"
|
||||||
icon_state = "frodent"
|
icon_state = "frodent"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fhusky
|
/datum/sprite_accessory/snouts/mam_snouts/fhusky
|
||||||
name = "Husky (Top)"
|
name = "Husky (Top)"
|
||||||
icon_state = "fhusky"
|
icon_state = "fhusky"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fotie
|
/datum/sprite_accessory/snouts/mam_snouts/fotie
|
||||||
name = "Otie (Top)"
|
name = "Otie (Top)"
|
||||||
icon_state = "fotie"
|
icon_state = "fotie"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fpede
|
/datum/sprite_accessory/snouts/mam_snouts/fpede
|
||||||
name = "Scolipede (Top)"
|
name = "Scolipede (Top)"
|
||||||
icon_state = "fpede"
|
icon_state = "fpede"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fsergal
|
/datum/sprite_accessory/snouts/mam_snouts/fsergal
|
||||||
name = "Sergal (Top)"
|
name = "Sergal (Top)"
|
||||||
icon_state = "fsergal"
|
icon_state = "fsergal"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fshark
|
/datum/sprite_accessory/snouts/mam_snouts/fshark
|
||||||
name = "Shark (Top)"
|
name = "Shark (Top)"
|
||||||
icon_state = "fshark"
|
icon_state = "fshark"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/ftoucan
|
/datum/sprite_accessory/snouts/mam_snouts/ftoucan
|
||||||
name = "Toucan (Top)"
|
name = "Toucan (Top)"
|
||||||
icon_state = "ftoucan"
|
icon_state = "ftoucan"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fsharp
|
/datum/sprite_accessory/snouts/mam_snouts/fsharp
|
||||||
name = "Sharp (Top)"
|
name = "Sharp (Top)"
|
||||||
icon_state = "fsharp"
|
icon_state = "fsharp"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fround
|
/datum/sprite_accessory/snouts/mam_snouts/fround
|
||||||
name = "Round (Top)"
|
name = "Round (Top)"
|
||||||
icon_state = "fround"
|
icon_state = "fround"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/fsharplight
|
/datum/sprite_accessory/snouts/mam_snouts/fsharplight
|
||||||
name = "Sharp + Light (Top)"
|
name = "Sharp + Light (Top)"
|
||||||
icon_state = "fsharplight"
|
icon_state = "fsharplight"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/froundlight
|
/datum/sprite_accessory/snouts/mam_snouts/froundlight
|
||||||
name = "Round + Light (Top)"
|
name = "Round + Light (Top)"
|
||||||
icon_state = "froundlight"
|
icon_state = "froundlight"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
|
|||||||
@@ -2,10 +2,16 @@
|
|||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER)
|
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/spines/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return (!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))
|
||||||
|
|
||||||
/datum/sprite_accessory/spines_animated
|
/datum/sprite_accessory/spines_animated
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER)
|
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/spines_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return ((!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || H.dna.species.mutant_bodyparts["tail"])
|
||||||
|
|
||||||
/datum/sprite_accessory/spines/none
|
/datum/sprite_accessory/spines/none
|
||||||
name = "None"
|
name = "None"
|
||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
//Synth snouts (This is the most important part)
|
//Synth snouts (This is the most important part)
|
||||||
/datum/sprite_accessory/mam_snouts/synthliz
|
/datum/sprite_accessory/snouts/mam_snouts/synthliz
|
||||||
recommended_species = list("synthliz")
|
recommended_species = list("synthliz")
|
||||||
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
name = "Synthetic Lizard - Snout"
|
name = "Synthetic Lizard - Snout"
|
||||||
icon_state = "synthliz_basic"
|
icon_state = "synthliz_basic"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/synthliz/synthliz_under
|
/datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_under
|
||||||
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
||||||
color_src = MATRIXED
|
color_src = MATRIXED
|
||||||
name = "Synthetic Lizard - Snout Under"
|
name = "Synthetic Lizard - Snout Under"
|
||||||
icon_state = "synthliz_under"
|
icon_state = "synthliz_under"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/synthliz/synthliz_tert
|
/datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_tert
|
||||||
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
||||||
color_src = MATRIXED
|
color_src = MATRIXED
|
||||||
name = "Synthetic Lizard - Snout Tertiary"
|
name = "Synthetic Lizard - Snout Tertiary"
|
||||||
icon_state = "synthliz_tert"
|
icon_state = "synthliz_tert"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_snouts/synthliz/synthliz_tertunder
|
/datum/sprite_accessory/snouts/mam_snouts/synthliz/synthliz_tertunder
|
||||||
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
icon = 'modular_citadel/icons/mob/synthliz_snouts.dmi'
|
||||||
color_src = MATRIXED
|
color_src = MATRIXED
|
||||||
name = "Synthetic Lizard - Snout Tertiary Under"
|
name = "Synthetic Lizard - Snout Tertiary Under"
|
||||||
@@ -42,14 +42,14 @@
|
|||||||
icon_state = "synthlizpecslight"
|
icon_state = "synthlizpecslight"
|
||||||
|
|
||||||
//Synth tails
|
//Synth tails
|
||||||
/datum/sprite_accessory/mam_tails/synthliz
|
/datum/sprite_accessory/tails/mam_tails/synthliz
|
||||||
recommended_species = list("synthliz")
|
recommended_species = list("synthliz")
|
||||||
icon = 'modular_citadel/icons/mob/synthliz_tails.dmi'
|
icon = 'modular_citadel/icons/mob/synthliz_tails.dmi'
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
name = "Synthetic Lizard"
|
name = "Synthetic Lizard"
|
||||||
icon_state = "synthliz"
|
icon_state = "synthliz"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/synthliz
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/synthliz
|
||||||
recommended_species = list("synthliz")
|
recommended_species = list("synthliz")
|
||||||
icon = 'modular_citadel/icons/mob/synthliz_tails.dmi'
|
icon = 'modular_citadel/icons/mob/synthliz_tails.dmi'
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
|
|||||||
@@ -3,6 +3,9 @@
|
|||||||
mutant_part_string = "tail"
|
mutant_part_string = "tail"
|
||||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/tails/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return ((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
||||||
|
|
||||||
/datum/sprite_accessory/tails_animated
|
/datum/sprite_accessory/tails_animated
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
mutant_part_string = "tailwag"
|
mutant_part_string = "tailwag"
|
||||||
@@ -12,6 +15,9 @@
|
|||||||
************* Lizard Tails ****************
|
************* Lizard Tails ****************
|
||||||
*******************************************/
|
*******************************************/
|
||||||
|
|
||||||
|
/datum/sprite_accessory/tails_animated/lizard/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) || H.dna.species.mutant_bodyparts["tail_lizard"])
|
||||||
|
|
||||||
/datum/sprite_accessory/tails/lizard/smooth
|
/datum/sprite_accessory/tails/lizard/smooth
|
||||||
name = "Smooth"
|
name = "Smooth"
|
||||||
icon_state = "smooth"
|
icon_state = "smooth"
|
||||||
@@ -98,6 +104,9 @@
|
|||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
relevant_layers = null
|
relevant_layers = null
|
||||||
|
|
||||||
|
/datum/sprite_accessory/tails_animated/human/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)|| H.dna.species.mutant_bodyparts["tail_human"])
|
||||||
|
|
||||||
/datum/sprite_accessory/tails/human/ailurus
|
/datum/sprite_accessory/tails/human/ailurus
|
||||||
name = "Red Panda"
|
name = "Red Panda"
|
||||||
icon_state = "wah"
|
icon_state = "wah"
|
||||||
@@ -122,22 +131,22 @@
|
|||||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||||
color_src = MATRIXED
|
color_src = MATRIXED
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/batl
|
/datum/sprite_accessory/tails/mam_tails/batl
|
||||||
name = "Bat (Long)"
|
name = "Bat (Long)"
|
||||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||||
icon_state = "batl"
|
icon_state = "batl"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/batl
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/batl
|
||||||
name = "Bat (Long)"
|
name = "Bat (Long)"
|
||||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||||
icon_state = "batl"
|
icon_state = "batl"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/bats
|
/datum/sprite_accessory/tails/mam_tails/bats
|
||||||
name = "Bat (Short)"
|
name = "Bat (Short)"
|
||||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||||
icon_state = "bats"
|
icon_state = "bats"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/bats
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/bats
|
||||||
name = "Bat (Short)"
|
name = "Bat (Short)"
|
||||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||||
icon_state = "bats"
|
icon_state = "bats"
|
||||||
@@ -518,368 +527,371 @@
|
|||||||
************** Furry Tails ****************
|
************** Furry Tails ****************
|
||||||
*******************************************/
|
*******************************************/
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails
|
/datum/sprite_accessory/tails/mam_tails
|
||||||
color_src = MATRIXED
|
color_src = MATRIXED
|
||||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||||
recommended_species = list("mammal", "slimeperson", "podweak", "felinid", "insect")
|
recommended_species = list("mammal", "slimeperson", "podweak", "felinid", "insect")
|
||||||
mutant_part_string = "tail"
|
mutant_part_string = "tail"
|
||||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/none
|
/datum/sprite_accessory/tails/mam_tails/none
|
||||||
name = "None"
|
name = "None"
|
||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
recommended_species = null
|
recommended_species = null
|
||||||
relevant_layers = null
|
relevant_layers = null
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated
|
/datum/sprite_accessory/tails_animated/mam_tails_animated
|
||||||
color_src = MATRIXED
|
color_src = MATRIXED
|
||||||
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
icon = 'modular_citadel/icons/mob/mam_tails.dmi'
|
||||||
mutant_part_string = "tailwag"
|
mutant_part_string = "tailwag"
|
||||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_BEHIND_LAYER, BODY_FRONT_LAYER)
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/none
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return (((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric) || H.dna.species.mutant_bodyparts["mam_tail"])
|
||||||
|
|
||||||
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/none
|
||||||
name = "None"
|
name = "None"
|
||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
relevant_layers = null
|
relevant_layers = null
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/ailurus
|
/datum/sprite_accessory/tails/mam_tails/ailurus
|
||||||
name = "Red Panda"
|
name = "Red Panda"
|
||||||
icon_state = "wah"
|
icon_state = "wah"
|
||||||
extra = TRUE
|
extra = TRUE
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/ailurus
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/ailurus
|
||||||
name = "Red Panda"
|
name = "Red Panda"
|
||||||
icon_state = "wah"
|
icon_state = "wah"
|
||||||
extra = TRUE
|
extra = TRUE
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/axolotl
|
/datum/sprite_accessory/tails/mam_tails/axolotl
|
||||||
name = "Axolotl"
|
name = "Axolotl"
|
||||||
icon_state = "axolotl"
|
icon_state = "axolotl"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/axolotl
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/axolotl
|
||||||
name = "Axolotl"
|
name = "Axolotl"
|
||||||
icon_state = "axolotl"
|
icon_state = "axolotl"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/batl
|
/datum/sprite_accessory/tails/mam_tails/batl
|
||||||
name = "Bat (Long)"
|
name = "Bat (Long)"
|
||||||
icon_state = "batl"
|
icon_state = "batl"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/batl
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/batl
|
||||||
name = "Bat (Long)"
|
name = "Bat (Long)"
|
||||||
icon_state = "batl"
|
icon_state = "batl"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/bats
|
/datum/sprite_accessory/tails/mam_tails/bats
|
||||||
name = "Bat (Short)"
|
name = "Bat (Short)"
|
||||||
icon_state = "bats"
|
icon_state = "bats"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/bats
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/bats
|
||||||
name = "Bat (Short)"
|
name = "Bat (Short)"
|
||||||
icon_state = "bats"
|
icon_state = "bats"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/bee
|
/datum/sprite_accessory/tails/mam_tails/bee
|
||||||
name = "Bee"
|
name = "Bee"
|
||||||
icon_state = "bee"
|
icon_state = "bee"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/bee
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/bee
|
||||||
name = "Bee"
|
name = "Bee"
|
||||||
icon_state = "bee"
|
icon_state = "bee"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/cat
|
/datum/sprite_accessory/tails/mam_tails/cat
|
||||||
name = "Cat"
|
name = "Cat"
|
||||||
icon_state = "cat"
|
icon_state = "cat"
|
||||||
color_src = HAIR
|
color_src = HAIR
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/cat
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/cat
|
||||||
name = "Cat"
|
name = "Cat"
|
||||||
icon_state = "cat"
|
icon_state = "cat"
|
||||||
color_src = HAIR
|
color_src = HAIR
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/catbig
|
/datum/sprite_accessory/tails/mam_tails/catbig
|
||||||
name = "Cat, Big"
|
name = "Cat, Big"
|
||||||
icon_state = "catbig"
|
icon_state = "catbig"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/catbig
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/catbig
|
||||||
name = "Cat, Big"
|
name = "Cat, Big"
|
||||||
icon_state = "catbig"
|
icon_state = "catbig"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/twocat
|
/datum/sprite_accessory/tails/mam_tails/twocat
|
||||||
name = "Cat, Double"
|
name = "Cat, Double"
|
||||||
icon_state = "twocat"
|
icon_state = "twocat"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/twocat
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/twocat
|
||||||
name = "Cat, Double"
|
name = "Cat, Double"
|
||||||
icon_state = "twocat"
|
icon_state = "twocat"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/corvid
|
/datum/sprite_accessory/tails/mam_tails/corvid
|
||||||
name = "Corvid"
|
name = "Corvid"
|
||||||
icon_state = "crow"
|
icon_state = "crow"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/corvid
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/corvid
|
||||||
name = "Corvid"
|
name = "Corvid"
|
||||||
icon_state = "crow"
|
icon_state = "crow"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tail/cow
|
/datum/sprite_accessory/tails/mam_tail/cow
|
||||||
name = "Cow"
|
name = "Cow"
|
||||||
icon_state = "cow"
|
icon_state = "cow"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/cow
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/cow
|
||||||
name = "Cow"
|
name = "Cow"
|
||||||
icon_state = "cow"
|
icon_state = "cow"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/eevee
|
/datum/sprite_accessory/tails/mam_tails/eevee
|
||||||
name = "Eevee"
|
name = "Eevee"
|
||||||
icon_state = "eevee"
|
icon_state = "eevee"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/eevee
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/eevee
|
||||||
name = "Eevee"
|
name = "Eevee"
|
||||||
icon_state = "eevee"
|
icon_state = "eevee"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/fennec
|
/datum/sprite_accessory/tails/mam_tails/fennec
|
||||||
name = "Fennec"
|
name = "Fennec"
|
||||||
icon_state = "fennec"
|
icon_state = "fennec"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/fennec
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/fennec
|
||||||
name = "Fennec"
|
name = "Fennec"
|
||||||
icon_state = "fennec"
|
icon_state = "fennec"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/human/fish
|
/datum/sprite_accessory/tails/mam_tails/human/fish
|
||||||
name = "Fish"
|
name = "Fish"
|
||||||
icon_state = "fish"
|
icon_state = "fish"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/human/fish
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/human/fish
|
||||||
name = "Fish"
|
name = "Fish"
|
||||||
icon_state = "fish"
|
icon_state = "fish"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/fox
|
/datum/sprite_accessory/tails/mam_tails/fox
|
||||||
name = "Fox"
|
name = "Fox"
|
||||||
icon_state = "fox"
|
icon_state = "fox"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/fox
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/fox
|
||||||
name = "Fox"
|
name = "Fox"
|
||||||
icon_state = "fox"
|
icon_state = "fox"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/hawk
|
/datum/sprite_accessory/tails/mam_tails/hawk
|
||||||
name = "Hawk"
|
name = "Hawk"
|
||||||
icon_state = "hawk"
|
icon_state = "hawk"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/hawk
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/hawk
|
||||||
name = "Hawk"
|
name = "Hawk"
|
||||||
icon_state = "hawk"
|
icon_state = "hawk"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/horse
|
/datum/sprite_accessory/tails/mam_tails/horse
|
||||||
name = "Horse"
|
name = "Horse"
|
||||||
icon_state = "horse"
|
icon_state = "horse"
|
||||||
color_src = HAIR
|
color_src = HAIR
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/horse
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/horse
|
||||||
name = "Horse"
|
name = "Horse"
|
||||||
icon_state = "horse"
|
icon_state = "horse"
|
||||||
color_src = HAIR
|
color_src = HAIR
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/husky
|
/datum/sprite_accessory/tails/mam_tails/husky
|
||||||
name = "Husky"
|
name = "Husky"
|
||||||
icon_state = "husky"
|
icon_state = "husky"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/husky
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/husky
|
||||||
name = "Husky"
|
name = "Husky"
|
||||||
icon_state = "husky"
|
icon_state = "husky"
|
||||||
|
|
||||||
datum/sprite_accessory/mam_tails/insect
|
datum/sprite_accessory/tails/mam_tails/insect
|
||||||
name = "Insect"
|
name = "Insect"
|
||||||
icon_state = "insect"
|
icon_state = "insect"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/insect
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/insect
|
||||||
name = "Insect"
|
name = "Insect"
|
||||||
icon_state = "insect"
|
icon_state = "insect"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/kangaroo
|
/datum/sprite_accessory/tails/mam_tails/kangaroo
|
||||||
name = "kangaroo"
|
name = "kangaroo"
|
||||||
icon_state = "kangaroo"
|
icon_state = "kangaroo"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/kangaroo
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/kangaroo
|
||||||
name = "kangaroo"
|
name = "kangaroo"
|
||||||
icon_state = "kangaroo"
|
icon_state = "kangaroo"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/kitsune
|
/datum/sprite_accessory/tails/mam_tails/kitsune
|
||||||
name = "Kitsune"
|
name = "Kitsune"
|
||||||
icon_state = "kitsune"
|
icon_state = "kitsune"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/kitsune
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/kitsune
|
||||||
name = "Kitsune"
|
name = "Kitsune"
|
||||||
icon_state = "kitsune"
|
icon_state = "kitsune"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/lab
|
/datum/sprite_accessory/tails/mam_tails/lab
|
||||||
name = "Lab"
|
name = "Lab"
|
||||||
icon_state = "lab"
|
icon_state = "lab"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/lab
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/lab
|
||||||
name = "Lab"
|
name = "Lab"
|
||||||
icon_state = "lab"
|
icon_state = "lab"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/murid
|
/datum/sprite_accessory/tails/mam_tails/murid
|
||||||
name = "Murid"
|
name = "Murid"
|
||||||
icon_state = "murid"
|
icon_state = "murid"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/murid
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/murid
|
||||||
name = "Murid"
|
name = "Murid"
|
||||||
icon_state = "murid"
|
icon_state = "murid"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/otie
|
/datum/sprite_accessory/tails/mam_tails/otie
|
||||||
name = "Otusian"
|
name = "Otusian"
|
||||||
icon_state = "otie"
|
icon_state = "otie"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/otie
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/otie
|
||||||
name = "Otusian"
|
name = "Otusian"
|
||||||
icon_state = "otie"
|
icon_state = "otie"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/orca
|
/datum/sprite_accessory/tails/mam_tails/orca
|
||||||
name = "Orca"
|
name = "Orca"
|
||||||
icon_state = "orca"
|
icon_state = "orca"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/orca
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/orca
|
||||||
name = "Orca"
|
name = "Orca"
|
||||||
icon_state = "orca"
|
icon_state = "orca"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/pede
|
/datum/sprite_accessory/tails/mam_tails/pede
|
||||||
name = "Scolipede"
|
name = "Scolipede"
|
||||||
icon_state = "pede"
|
icon_state = "pede"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/pede
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/pede
|
||||||
name = "Scolipede"
|
name = "Scolipede"
|
||||||
icon_state = "pede"
|
icon_state = "pede"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/rabbit
|
/datum/sprite_accessory/tails/mam_tails/rabbit
|
||||||
name = "Rabbit"
|
name = "Rabbit"
|
||||||
icon_state = "rabbit"
|
icon_state = "rabbit"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/rabbit
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/rabbit
|
||||||
name = "Rabbit"
|
name = "Rabbit"
|
||||||
icon_state = "rabbit"
|
icon_state = "rabbit"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/sergal
|
/datum/sprite_accessory/tails/mam_tails/sergal
|
||||||
name = "Sergal"
|
name = "Sergal"
|
||||||
icon_state = "sergal"
|
icon_state = "sergal"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/sergal
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/sergal
|
||||||
name = "Sergal"
|
name = "Sergal"
|
||||||
icon_state = "sergal"
|
icon_state = "sergal"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/skunk
|
/datum/sprite_accessory/tails/mam_tails/skunk
|
||||||
name = "Skunk"
|
name = "Skunk"
|
||||||
icon_state = "skunk"
|
icon_state = "skunk"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/skunk
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/skunk
|
||||||
name = "Skunk"
|
name = "Skunk"
|
||||||
icon_state = "skunk"
|
icon_state = "skunk"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/smooth
|
/datum/sprite_accessory/tails/mam_tails/smooth
|
||||||
name = "Smooth"
|
name = "Smooth"
|
||||||
icon_state = "smooth"
|
icon_state = "smooth"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/smooth
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/smooth
|
||||||
name = "Smooth"
|
name = "Smooth"
|
||||||
icon_state = "smooth"
|
icon_state = "smooth"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/spikes
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/spikes
|
||||||
name = "Spikes"
|
name = "Spikes"
|
||||||
icon_state = "spikes"
|
icon_state = "spikes"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/spikes
|
/datum/sprite_accessory/tails/mam_tails/spikes
|
||||||
name = "Spikes"
|
name = "Spikes"
|
||||||
icon_state = "spikes"
|
icon_state = "spikes"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/shark
|
/datum/sprite_accessory/tails/mam_tails/shark
|
||||||
name = "Shark"
|
name = "Shark"
|
||||||
icon_state = "shark"
|
icon_state = "shark"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/shark
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/shark
|
||||||
name = "Shark"
|
name = "Shark"
|
||||||
icon_state = "shark"
|
icon_state = "shark"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/shepherd
|
/datum/sprite_accessory/tails/mam_tails/shepherd
|
||||||
name = "Shepherd"
|
name = "Shepherd"
|
||||||
icon_state = "shepherd"
|
icon_state = "shepherd"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/shepherd
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/shepherd
|
||||||
name = "Shepherd"
|
name = "Shepherd"
|
||||||
icon_state = "shepherd"
|
icon_state = "shepherd"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/straighttail
|
/datum/sprite_accessory/tails/mam_tails/straighttail
|
||||||
name = "Straight Tail"
|
name = "Straight Tail"
|
||||||
icon_state = "straighttail"
|
icon_state = "straighttail"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/straighttail
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/straighttail
|
||||||
name = "Straight Tail"
|
name = "Straight Tail"
|
||||||
icon_state = "straighttail"
|
icon_state = "straighttail"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/squirrel
|
/datum/sprite_accessory/tails/mam_tails/squirrel
|
||||||
name = "Squirrel"
|
name = "Squirrel"
|
||||||
icon_state = "squirrel"
|
icon_state = "squirrel"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/squirrel
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/squirrel
|
||||||
name = "Squirrel"
|
name = "Squirrel"
|
||||||
icon_state = "squirrel"
|
icon_state = "squirrel"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/tamamo_kitsune
|
/datum/sprite_accessory/tails/mam_tails/tamamo_kitsune
|
||||||
name = "Tamamo Kitsune Tails"
|
name = "Tamamo Kitsune Tails"
|
||||||
icon_state = "9sune"
|
icon_state = "9sune"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/tamamo_kitsune
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/tamamo_kitsune
|
||||||
name = "Tamamo Kitsune Tails"
|
name = "Tamamo Kitsune Tails"
|
||||||
icon_state = "9sune"
|
icon_state = "9sune"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/tentacle
|
/datum/sprite_accessory/tails/mam_tails/tentacle
|
||||||
name = "Tentacle"
|
name = "Tentacle"
|
||||||
icon_state = "tentacle"
|
icon_state = "tentacle"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/tentacle
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/tentacle
|
||||||
name = "Tentacle"
|
name = "Tentacle"
|
||||||
icon_state = "tentacle"
|
icon_state = "tentacle"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/tiger
|
/datum/sprite_accessory/tails/mam_tails/tiger
|
||||||
name = "Tiger"
|
name = "Tiger"
|
||||||
icon_state = "tiger"
|
icon_state = "tiger"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/tiger
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/tiger
|
||||||
name = "Tiger"
|
name = "Tiger"
|
||||||
icon_state = "tiger"
|
icon_state = "tiger"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/dtiger
|
/datum/sprite_accessory/tails/mam_tails/dtiger
|
||||||
name = "Dark Tiger"
|
name = "Dark Tiger"
|
||||||
icon_state = "dtiger"
|
icon_state = "dtiger"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/dtiger
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/dtiger
|
||||||
name = "Dark Tiger"
|
name = "Dark Tiger"
|
||||||
icon_state = "dtiger"
|
icon_state = "dtiger"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/ltiger
|
/datum/sprite_accessory/tails/mam_tails/ltiger
|
||||||
name = "Light Tiger"
|
name = "Light Tiger"
|
||||||
icon_state = "ltiger"
|
icon_state = "ltiger"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/ltiger
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/ltiger
|
||||||
name = "Light Tiger"
|
name = "Light Tiger"
|
||||||
icon_state = "ltiger"
|
icon_state = "ltiger"
|
||||||
color_src = MUTCOLORS
|
color_src = MUTCOLORS
|
||||||
icon = 'icons/mob/mutant_bodyparts.dmi'
|
icon = 'icons/mob/mutant_bodyparts.dmi'
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails/wolf
|
/datum/sprite_accessory/tails/mam_tails/wolf
|
||||||
name = "Wolf"
|
name = "Wolf"
|
||||||
icon_state = "wolf"
|
icon_state = "wolf"
|
||||||
|
|
||||||
/datum/sprite_accessory/mam_tails_animated/wolf
|
/datum/sprite_accessory/tails_animated/mam_tails_animated/wolf
|
||||||
name = "Wolf"
|
name = "Wolf"
|
||||||
icon_state = "wolf"
|
icon_state = "wolf"
|
||||||
|
|||||||
@@ -5,10 +5,16 @@
|
|||||||
icon_state = "none"
|
icon_state = "none"
|
||||||
relevant_layers = null
|
relevant_layers = null
|
||||||
|
|
||||||
|
/datum/sprite_accessory/wings/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return (!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))))
|
||||||
|
|
||||||
/datum/sprite_accessory/wings_open
|
/datum/sprite_accessory/wings_open
|
||||||
icon = 'icons/mob/wings.dmi'
|
icon = 'icons/mob/wings.dmi'
|
||||||
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER)
|
||||||
|
|
||||||
|
/datum/sprite_accessory/wings_open/is_not_visible(var/mob/living/carbon/human/H, var/tauric)
|
||||||
|
return (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)) || H.dna.species.mutant_bodyparts["wings"])
|
||||||
|
|
||||||
/datum/sprite_accessory/wings_open/angel
|
/datum/sprite_accessory/wings_open/angel
|
||||||
name = "Angel"
|
name = "Angel"
|
||||||
icon_state = "angel"
|
icon_state = "angel"
|
||||||
|
|||||||
@@ -642,106 +642,19 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
|||||||
if(!mutant_bodyparts)
|
if(!mutant_bodyparts)
|
||||||
return
|
return
|
||||||
|
|
||||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
|
||||||
var/tauric = mutant_bodyparts["taur"] && H.dna.features["taur"] && H.dna.features["taur"] != "None"
|
var/tauric = mutant_bodyparts["taur"] && H.dna.features["taur"] && H.dna.features["taur"] != "None"
|
||||||
|
|
||||||
if(mutant_bodyparts["tail_lizard"])
|
for(var/mutant_part in mutant_bodyparts)
|
||||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
var/reference_list = GLOB.mutant_reference_list[mutant_part]
|
||||||
bodyparts_to_add -= "tail_lizard"
|
if(reference_list)
|
||||||
|
var/datum/sprite_accessory/S
|
||||||
if(mutant_bodyparts["waggingtail_lizard"])
|
var/transformed_part = GLOB.mutant_transform_list[mutant_part]
|
||||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
if(transformed_part)
|
||||||
bodyparts_to_add -= "waggingtail_lizard"
|
S = reference_list[H.dna.features[transformed_part]]
|
||||||
else if (mutant_bodyparts["tail_lizard"])
|
else
|
||||||
bodyparts_to_add -= "waggingtail_lizard"
|
S = reference_list[H.dna.features[mutant_part]]
|
||||||
|
if(!S || S.is_not_visible(H, tauric))
|
||||||
if(mutant_bodyparts["tail_human"])
|
bodyparts_to_add -= mutant_part
|
||||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
|
||||||
bodyparts_to_add -= "tail_human"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["waggingtail_human"])
|
|
||||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
|
||||||
bodyparts_to_add -= "waggingtail_human"
|
|
||||||
else if (mutant_bodyparts["tail_human"])
|
|
||||||
bodyparts_to_add -= "waggingtail_human"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["spines"])
|
|
||||||
if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))
|
|
||||||
bodyparts_to_add -= "spines"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["waggingspines"])
|
|
||||||
if(!H.dna.features["spines"] || H.dna.features["spines"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR))
|
|
||||||
bodyparts_to_add -= "waggingspines"
|
|
||||||
else if (mutant_bodyparts["tail"])
|
|
||||||
bodyparts_to_add -= "waggingspines"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["snout"]) //Take a closer look at that snout!
|
|
||||||
if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
|
|
||||||
bodyparts_to_add -= "snout"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["frills"])
|
|
||||||
if(!H.dna.features["frills"] || H.dna.features["frills"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || !HD || HD.status == BODYPART_ROBOTIC)
|
|
||||||
bodyparts_to_add -= "frills"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["horns"])
|
|
||||||
if(!H.dna.features["horns"] || H.dna.features["horns"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
|
|
||||||
bodyparts_to_add -= "horns"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["ears"])
|
|
||||||
if(!H.dna.features["ears"] || H.dna.features["ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
|
|
||||||
bodyparts_to_add -= "ears"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["wings"])
|
|
||||||
if(!H.dna.features["wings"] || H.dna.features["wings"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception))))
|
|
||||||
bodyparts_to_add -= "wings"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["wings_open"])
|
|
||||||
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))
|
|
||||||
bodyparts_to_add -= "wings_open"
|
|
||||||
else if (mutant_bodyparts["wings"])
|
|
||||||
bodyparts_to_add -= "wings_open"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["insect_fluff"])
|
|
||||||
if(!H.dna.features["insect_fluff"] || H.dna.features["insect_fluff"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
|
|
||||||
bodyparts_to_add -= "insect_fluff"
|
|
||||||
|
|
||||||
//CITADEL EDIT
|
|
||||||
//Race specific bodyparts:
|
|
||||||
//Xenos
|
|
||||||
if(mutant_bodyparts["xenodorsal"])
|
|
||||||
if(!H.dna.features["xenodorsal"] || H.dna.features["xenodorsal"] == "None" || (H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT)))
|
|
||||||
bodyparts_to_add -= "xenodorsal"
|
|
||||||
if(mutant_bodyparts["xenohead"])//This is an overlay for different castes using different head crests
|
|
||||||
if(!H.dna.features["xenohead"] || H.dna.features["xenohead"] == "None" || H.head && (H.head.flags_inv & HIDEHAIR) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEHAIR)) || !HD || HD.status == BODYPART_ROBOTIC)
|
|
||||||
bodyparts_to_add -= "xenohead"
|
|
||||||
if(mutant_bodyparts["xenotail"])
|
|
||||||
if(!H.dna.features["xenotail"] || H.dna.features["xenotail"] == "None" || H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
|
|
||||||
bodyparts_to_add -= "xenotail"
|
|
||||||
|
|
||||||
//Other Races
|
|
||||||
if(mutant_bodyparts["mam_tail"])
|
|
||||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
|
||||||
bodyparts_to_add -= "mam_tail"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["mam_waggingtail"])
|
|
||||||
if((H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)) || tauric)
|
|
||||||
bodyparts_to_add -= "mam_waggingtail"
|
|
||||||
else if (mutant_bodyparts["mam_tail"])
|
|
||||||
bodyparts_to_add -= "mam_waggingtail"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["mam_ears"])
|
|
||||||
if(!H.dna.features["mam_ears"] || H.dna.features["mam_ears"] == "None" || H.head && (H.head.flags_inv & HIDEEARS) || (H.wear_mask && (H.wear_mask.flags_inv & HIDEEARS)) || !HD || HD.status == BODYPART_ROBOTIC)
|
|
||||||
bodyparts_to_add -= "mam_ears"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["mam_snouts"]) //Take a closer look at that snout!
|
|
||||||
if((H.wear_mask && (H.wear_mask.flags_inv & HIDESNOUT)) || (H.head && (H.head.flags_inv & HIDESNOUT)) || !HD || HD.status == BODYPART_ROBOTIC)
|
|
||||||
bodyparts_to_add -= "mam_snouts"
|
|
||||||
|
|
||||||
if(mutant_bodyparts["taur"])
|
|
||||||
if(!tauric || (H.wear_suit && (H.wear_suit.flags_inv & HIDETAUR)))
|
|
||||||
bodyparts_to_add -= "taur"
|
|
||||||
|
|
||||||
//END EDIT
|
|
||||||
|
|
||||||
//Digitigrade legs are stuck in the phantom zone between true limbs and mutant bodyparts. Mainly it just needs more agressive updating than most limbs.
|
//Digitigrade legs are stuck in the phantom zone between true limbs and mutant bodyparts. Mainly it just needs more agressive updating than most limbs.
|
||||||
var/update_needed = FALSE
|
var/update_needed = FALSE
|
||||||
@@ -778,76 +691,22 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
|||||||
var/list/dna_feature_as_text_string = list()
|
var/list/dna_feature_as_text_string = list()
|
||||||
|
|
||||||
for(var/bodypart in bodyparts_to_add)
|
for(var/bodypart in bodyparts_to_add)
|
||||||
var/datum/sprite_accessory/S
|
var/reference_list = GLOB.mutant_reference_list[bodypart]
|
||||||
switch(bodypart)
|
if(reference_list)
|
||||||
if("tail_lizard")
|
var/datum/sprite_accessory/S
|
||||||
S = GLOB.tails_list_lizard[H.dna.features["tail_lizard"]]
|
var/transformed_part = GLOB.mutant_transform_list[bodypart]
|
||||||
if("waggingtail_lizard")
|
if(transformed_part)
|
||||||
S = GLOB.animated_tails_list_lizard[H.dna.features["tail_lizard"]]
|
S = reference_list[H.dna.features[transformed_part]]
|
||||||
if("tail_human")
|
else
|
||||||
S = GLOB.tails_list_human[H.dna.features["tail_human"]]
|
S = reference_list[H.dna.features[bodypart]]
|
||||||
if("waggingtail_human")
|
|
||||||
S = GLOB.animated_tails_list_human[H.dna.features["tail_human"]]
|
|
||||||
if("spines")
|
|
||||||
S = GLOB.spines_list[H.dna.features["spines"]]
|
|
||||||
if("waggingspines")
|
|
||||||
S = GLOB.animated_spines_list[H.dna.features["spines"]]
|
|
||||||
if("snout")
|
|
||||||
S = GLOB.snouts_list[H.dna.features["snout"]]
|
|
||||||
if("frills")
|
|
||||||
S = GLOB.frills_list[H.dna.features["frills"]]
|
|
||||||
if("horns")
|
|
||||||
S = GLOB.horns_list[H.dna.features["horns"]]
|
|
||||||
if("ears")
|
|
||||||
S = GLOB.ears_list[H.dna.features["ears"]]
|
|
||||||
if("body_markings")
|
|
||||||
S = GLOB.body_markings_list[H.dna.features["body_markings"]]
|
|
||||||
if("wings")
|
|
||||||
S = GLOB.wings_list[H.dna.features["wings"]]
|
|
||||||
if("wingsopen")
|
|
||||||
S = GLOB.wings_open_list[H.dna.features["wings"]]
|
|
||||||
if("deco_wings")
|
|
||||||
S = GLOB.deco_wings_list[H.dna.features["deco_wings"]]
|
|
||||||
if("legs")
|
|
||||||
S = GLOB.legs_list[H.dna.features["legs"]]
|
|
||||||
if("insect_wings")
|
|
||||||
S = GLOB.insect_wings_list[H.dna.features["insect_wings"]]
|
|
||||||
if("insect_fluff")
|
|
||||||
S = GLOB.insect_fluffs_list[H.dna.features["insect_fluff"]]
|
|
||||||
if("insect_markings")
|
|
||||||
S = GLOB.insect_markings_list[H.dna.features["insect_markings"]]
|
|
||||||
if("caps")
|
|
||||||
S = GLOB.caps_list[H.dna.features["caps"]]
|
|
||||||
if("ipc_screen")
|
|
||||||
S = GLOB.ipc_screens_list[H.dna.features["ipc_screen"]]
|
|
||||||
if("ipc_antenna")
|
|
||||||
S = GLOB.ipc_antennas_list[H.dna.features["ipc_antenna"]]
|
|
||||||
if("mam_tail")
|
|
||||||
S = GLOB.mam_tails_list[H.dna.features["mam_tail"]]
|
|
||||||
if("mam_waggingtail")
|
|
||||||
S = GLOB.mam_tails_animated_list[H.dna.features["mam_tail"]]
|
|
||||||
if("mam_body_markings")
|
|
||||||
S = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
|
|
||||||
if("mam_ears")
|
|
||||||
S = GLOB.mam_ears_list[H.dna.features["mam_ears"]]
|
|
||||||
if("mam_snouts")
|
|
||||||
S = GLOB.mam_snouts_list[H.dna.features["mam_snouts"]]
|
|
||||||
if("taur")
|
|
||||||
S = GLOB.taur_list[H.dna.features["taur"]]
|
|
||||||
if("xenodorsal")
|
|
||||||
S = GLOB.xeno_dorsal_list[H.dna.features["xenodorsal"]]
|
|
||||||
if("xenohead")
|
|
||||||
S = GLOB.xeno_head_list[H.dna.features["xenohead"]]
|
|
||||||
if("xenotail")
|
|
||||||
S = GLOB.xeno_tail_list[H.dna.features["xenotail"]]
|
|
||||||
|
|
||||||
if(!S || S.icon_state == "none")
|
if(!S || S.icon_state == "none")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
for(var/L in S.relevant_layers)
|
for(var/L in S.relevant_layers)
|
||||||
LAZYADD(relevant_layers["[L]"], S)
|
LAZYADD(relevant_layers["[L]"], S)
|
||||||
if(!S.mutant_part_string)
|
if(!S.mutant_part_string)
|
||||||
dna_feature_as_text_string[S] = bodypart
|
dna_feature_as_text_string[S] = bodypart
|
||||||
|
|
||||||
var/static/list/layer_text = list(
|
var/static/list/layer_text = list(
|
||||||
"[BODY_BEHIND_LAYER]" = "BEHIND",
|
"[BODY_BEHIND_LAYER]" = "BEHIND",
|
||||||
@@ -2046,17 +1905,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
|||||||
return
|
return
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
* The human species version of [/mob/living/carbon/proc/get_biological_state]. Depends on the HAS_FLESH and HAS_BONE species traits, having bones lets you have bone wounds, having flesh lets you have burn, slash, and piercing wounds
|
* The human species version of [/mob/living/carbon/proc/get_biological_state]. Depends on the HAS_FLESH and HAS_BONE species traits, having bones lets you have bone wounds, having flesh lets you have burn, slash, and piercing wounds
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/datum/species/proc/get_biological_state(mob/living/carbon/human/H)
|
/datum/species/proc/get_biological_state(mob/living/carbon/human/H)
|
||||||
. = BIO_INORGANIC
|
. = BIO_INORGANIC
|
||||||
if(HAS_FLESH in species_traits)
|
if(HAS_FLESH in species_traits)
|
||||||
@@ -2072,7 +1922,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
|||||||
if(HAS_TRAIT(H, TRAIT_NOBREATH))
|
if(HAS_TRAIT(H, TRAIT_NOBREATH))
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
|
|
||||||
/datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H)
|
/datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/H)
|
||||||
if(!environment)
|
if(!environment)
|
||||||
return
|
return
|
||||||
@@ -2264,7 +2113,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
|||||||
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
|
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
|
||||||
if(H)
|
if(H)
|
||||||
stop_wagging_tail(H)
|
stop_wagging_tail(H)
|
||||||
|
|
||||||
. = stunmod * H.physiology.stun_mod * amount
|
. = stunmod * H.physiology.stun_mod * amount
|
||||||
|
|
||||||
//////////////
|
//////////////
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
// Cold temperatures hurt faster as it is harder to move with out the heat energy
|
// Cold temperatures hurt faster as it is harder to move with out the heat energy
|
||||||
bodytemp_cold_damage_limit = (T20C - 10) // about 10c
|
bodytemp_cold_damage_limit = (T20C - 10) // about 10c
|
||||||
*/
|
*/
|
||||||
hair_color = "fixedmutcolor"
|
hair_color = "mutcolor"
|
||||||
hair_alpha = 140
|
hair_alpha = 140
|
||||||
var/current_color
|
var/current_color
|
||||||
var/EMPeffect = FALSE
|
var/EMPeffect = FALSE
|
||||||
|
|||||||
@@ -504,7 +504,7 @@
|
|||||||
else if (select_alteration == "Ears")
|
else if (select_alteration == "Ears")
|
||||||
var/list/snowflake_ears_list = list("Normal" = null)
|
var/list/snowflake_ears_list = list("Normal" = null)
|
||||||
for(var/path in GLOB.mam_ears_list)
|
for(var/path in GLOB.mam_ears_list)
|
||||||
var/datum/sprite_accessory/mam_ears/instance = GLOB.mam_ears_list[path]
|
var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[path]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
|
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
|
||||||
@@ -518,7 +518,7 @@
|
|||||||
else if (select_alteration == "Snout")
|
else if (select_alteration == "Snout")
|
||||||
var/list/snowflake_snouts_list = list("Normal" = null)
|
var/list/snowflake_snouts_list = list("Normal" = null)
|
||||||
for(var/path in GLOB.mam_snouts_list)
|
for(var/path in GLOB.mam_snouts_list)
|
||||||
var/datum/sprite_accessory/mam_snouts/instance = GLOB.mam_snouts_list[path]
|
var/datum/sprite_accessory/snouts/mam_snouts/instance = GLOB.mam_snouts_list[path]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
|
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
|
||||||
@@ -549,7 +549,7 @@
|
|||||||
else if (select_alteration == "Tail")
|
else if (select_alteration == "Tail")
|
||||||
var/list/snowflake_tails_list = list("Normal" = null)
|
var/list/snowflake_tails_list = list("Normal" = null)
|
||||||
for(var/path in GLOB.mam_tails_list)
|
for(var/path in GLOB.mam_tails_list)
|
||||||
var/datum/sprite_accessory/mam_tails/instance = GLOB.mam_tails_list[path]
|
var/datum/sprite_accessory/tails/mam_tails/instance = GLOB.mam_tails_list[path]
|
||||||
if(istype(instance, /datum/sprite_accessory))
|
if(istype(instance, /datum/sprite_accessory))
|
||||||
var/datum/sprite_accessory/S = instance
|
var/datum/sprite_accessory/S = instance
|
||||||
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
|
if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(H.client.ckey)))
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
mutanttail = /obj/item/organ/tail/lizard
|
mutanttail = /obj/item/organ/tail/lizard
|
||||||
coldmod = 1.5
|
coldmod = 1.5
|
||||||
heatmod = 0.67
|
heatmod = 0.67
|
||||||
mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "snout" = "Round",
|
mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round",
|
||||||
"horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None",
|
"horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None",
|
||||||
"legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None")
|
"legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None")
|
||||||
attack_verb = "slash"
|
attack_verb = "slash"
|
||||||
|
|||||||
@@ -57,89 +57,10 @@
|
|||||||
..()
|
..()
|
||||||
|
|
||||||
/datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
|
/datum/species/plasmaman/before_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
|
||||||
var/current_job = J?.title
|
|
||||||
var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman
|
var/datum/outfit/plasmaman/O = new /datum/outfit/plasmaman
|
||||||
switch(current_job)
|
if(J)
|
||||||
if("Chaplain")
|
if(J.plasma_outfit)
|
||||||
O = new /datum/outfit/plasmaman/chaplain
|
O = new J.plasma_outfit
|
||||||
|
|
||||||
if("Curator")
|
|
||||||
O = new /datum/outfit/plasmaman/curator
|
|
||||||
|
|
||||||
if("Janitor")
|
|
||||||
O = new /datum/outfit/plasmaman/janitor
|
|
||||||
|
|
||||||
if("Botanist")
|
|
||||||
O = new /datum/outfit/plasmaman/botany
|
|
||||||
|
|
||||||
if("Bartender", "Lawyer")
|
|
||||||
O = new /datum/outfit/plasmaman/bar
|
|
||||||
|
|
||||||
if("Cook")
|
|
||||||
O = new /datum/outfit/plasmaman/chef
|
|
||||||
|
|
||||||
if("Security Officer")
|
|
||||||
O = new /datum/outfit/plasmaman/security
|
|
||||||
|
|
||||||
if("Detective")
|
|
||||||
O = new /datum/outfit/plasmaman/detective
|
|
||||||
|
|
||||||
if("Warden")
|
|
||||||
O = new /datum/outfit/plasmaman/warden
|
|
||||||
|
|
||||||
if("Cargo Technician", "Quartermaster")
|
|
||||||
O = new /datum/outfit/plasmaman/cargo
|
|
||||||
|
|
||||||
if("Shaft Miner")
|
|
||||||
O = new /datum/outfit/plasmaman/mining
|
|
||||||
|
|
||||||
if("Medical Doctor")
|
|
||||||
O = new /datum/outfit/plasmaman/medical
|
|
||||||
|
|
||||||
if("Chemist")
|
|
||||||
O = new /datum/outfit/plasmaman/chemist
|
|
||||||
|
|
||||||
if("Geneticist")
|
|
||||||
O = new /datum/outfit/plasmaman/genetics
|
|
||||||
|
|
||||||
if("Roboticist")
|
|
||||||
O = new /datum/outfit/plasmaman/robotics
|
|
||||||
|
|
||||||
if("Virologist")
|
|
||||||
O = new /datum/outfit/plasmaman/viro
|
|
||||||
|
|
||||||
if("Scientist")
|
|
||||||
O = new /datum/outfit/plasmaman/science
|
|
||||||
|
|
||||||
if("Station Engineer")
|
|
||||||
O = new /datum/outfit/plasmaman/engineering
|
|
||||||
|
|
||||||
if("Atmospheric Technician")
|
|
||||||
O = new /datum/outfit/plasmaman/atmospherics
|
|
||||||
|
|
||||||
if("Captain")
|
|
||||||
O = new /datum/outfit/plasmaman/captain
|
|
||||||
|
|
||||||
if("Head of Personnel")
|
|
||||||
O = new /datum/outfit/plasmaman/hop
|
|
||||||
|
|
||||||
if("Head of Security")
|
|
||||||
O = new /datum/outfit/plasmaman/hos
|
|
||||||
|
|
||||||
if("Chief Engineer")
|
|
||||||
O = new /datum/outfit/plasmaman/ce
|
|
||||||
|
|
||||||
if("Chief Medical Officer")
|
|
||||||
O = new /datum/outfit/plasmaman/cmo
|
|
||||||
|
|
||||||
if("Research Director")
|
|
||||||
O = new /datum/outfit/plasmaman/rd
|
|
||||||
|
|
||||||
if("Mime")
|
|
||||||
O = new /datum/outfit/plasmaman/mime
|
|
||||||
|
|
||||||
if("Clown")
|
|
||||||
O = new /datum/outfit/plasmaman/clown
|
|
||||||
|
|
||||||
H.equipOutfit(O, visualsOnly)
|
H.equipOutfit(O, visualsOnly)
|
||||||
H.internal = H.get_item_for_held_index(2)
|
H.internal = H.get_item_for_held_index(2)
|
||||||
|
|||||||
@@ -82,13 +82,11 @@
|
|||||||
M.AddSpell(SW)
|
M.AddSpell(SW)
|
||||||
shadowwalk = SW
|
shadowwalk = SW
|
||||||
|
|
||||||
|
|
||||||
/obj/item/organ/brain/nightmare/Remove(special = FALSE)
|
/obj/item/organ/brain/nightmare/Remove(special = FALSE)
|
||||||
if(shadowwalk && owner)
|
if(shadowwalk && owner)
|
||||||
owner.RemoveSpell(shadowwalk)
|
owner.RemoveSpell(shadowwalk)
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
|
||||||
/obj/item/organ/heart/nightmare
|
/obj/item/organ/heart/nightmare
|
||||||
name = "heart of darkness"
|
name = "heart of darkness"
|
||||||
desc = "An alien organ that twists and writhes when exposed to light."
|
desc = "An alien organ that twists and writhes when exposed to light."
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
burnmod = 1
|
burnmod = 1
|
||||||
..()
|
..()
|
||||||
|
|
||||||
/datum/species/skeleton/greater/check_roundstart_eligible()
|
/datum/species/skeleton/check_roundstart_eligible()
|
||||||
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
|
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
|
||||||
return TRUE
|
return TRUE
|
||||||
return ..()
|
return ..()
|
||||||
|
|||||||
@@ -100,14 +100,12 @@
|
|||||||
else
|
else
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
|
||||||
/datum/species/synth/handle_body(mob/living/carbon/human/H)
|
/datum/species/synth/handle_body(mob/living/carbon/human/H)
|
||||||
if(fake_species)
|
if(fake_species)
|
||||||
fake_species.handle_body(H)
|
fake_species.handle_body(H)
|
||||||
else
|
else
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
|
|
||||||
/datum/species/synth/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
|
/datum/species/synth/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
|
||||||
if(fake_species)
|
if(fake_species)
|
||||||
fake_species.handle_body(H,forced_colour)
|
fake_species.handle_body(H,forced_colour)
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user