diff --git a/citadel.dme b/citadel.dme
index 4753414dfa2..99726d10667 100644
--- a/citadel.dme
+++ b/citadel.dme
@@ -2639,7 +2639,6 @@
#include "code\modules\mob\logout.dm"
#include "code\modules\mob\mob.dm"
#include "code\modules\mob\mob_defines.dm"
-#include "code\modules\mob\mob_defines_vr.dm"
#include "code\modules\mob\mob_grab.dm"
#include "code\modules\mob\mob_grab_specials.dm"
#include "code\modules\mob\mob_helpers.dm"
@@ -2807,6 +2806,7 @@
#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin.dm"
#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_abilities.dm"
#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_hud.dm"
+#include "code\modules\mob\living\carbon\human\species\shadekin\shadekin_traits.dm"
#include "code\modules\mob\living\carbon\human\species\station\adherent.dm"
#include "code\modules\mob\living\carbon\human\species\station\alraune.dm"
#include "code\modules\mob\living\carbon\human\species\station\custom_species.dm"
diff --git a/code/__DEFINES/carbon/organs.dm b/code/__DEFINES/carbon/organs.dm
index 218657bccf3..faf8546084f 100644
--- a/code/__DEFINES/carbon/organs.dm
+++ b/code/__DEFINES/carbon/organs.dm
@@ -150,13 +150,13 @@
//* ADHERENT EXTERNAL ORGANS *//
-#define BP_COOLING_FINS "cooling fins"
-#define BP_FLOAT "floatation disc"
+#define O_COOLING_FINS "cooling fins"
+#define O_FLOAT "floatation disc"
#define BP_JETS "maneuvering jets"
/// List of all Adherent body parts.
#define BP_ALL_ADHERENT list( \
- BP_COOLING_FINS, \
- BP_FLOAT, \
+ O_COOLING_FINS, \
+ O_FLOAT, \
BP_JETS)
diff --git a/code/__DEFINES/controllers/_subsystems.dm b/code/__DEFINES/controllers/_subsystems.dm
index f7432be32d8..8e2ece86edd 100644
--- a/code/__DEFINES/controllers/_subsystems.dm
+++ b/code/__DEFINES/controllers/_subsystems.dm
@@ -164,7 +164,6 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G
#define FIRE_PRIORITY_SHUTTLES 5
#define FIRE_PRIORITY_NIGHTSHIFT 6
#define FIRE_PRIORITY_PLANTS 5
-#define FIRE_PRIORITY_ORBIT 8
#define FIRE_PRIORITY_VOTE 9
#define FIRE_PRIORITY_AI 10
#define FIRE_PRIORITY_VIS 10
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
index b9a935fd6af..b1c32e24978 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
@@ -77,7 +77,7 @@
///? return this if you want to block printing this message to this person, if you want to print your own (does not affect the other person's message)
////#define COMSIG_BLOCK_EYECONTACT (1<<0)
/// From base of /mob/update_sight(): ()
-////#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight"
+#define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight"
//// From /mob/living/say(): ()
////#define COMSIG_MOB_SAY "mob_say"
////#define COMPONENT_UPPERCASE_SPEECH (1<<0)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 6aaaed2f3da..60a2a493c02 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -255,7 +255,7 @@ GLOBAL_LIST_EMPTY(mannequins)
wing_styles_list[path] = instance
// Custom species traits
- paths = typesof(/datum/trait) - /datum/trait
+ paths = typesof(/datum/trait) - /datum/trait - /datum/trait/negative - /datum/trait/neutral - /datum/trait/positive
for(var/path in paths)
var/datum/trait/instance = new path()
if(!instance.name)
@@ -303,11 +303,13 @@ var/global/list/hexNums = list("0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
//* Custom Species Lists *//
GLOBAL_LIST_EMPTY(custom_species_bases)
-//Traits
+//! ## Traits
/// Negative custom species traits, indexed by path.
var/global/list/negative_traits = list()
/// Neutral custom species traits, indexed by path.
var/global/list/neutral_traits = list()
+/// Neutral traits available to all species, indexed by path.
+var/global/list/everyone_traits = list()
/// Positive custom species traits, indexed by path.
var/global/list/positive_traits = list()
/// Just path = cost list, saves time in char setup.
@@ -750,6 +752,8 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
negative_traits[path] = instance
if(0)
neutral_traits[path] = instance
+ if(!(instance.custom_only))
+ everyone_traits[path] = instance
if(0.1 to INFINITY)
positive_traits[path] = instance
diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm
index d2e442e87ef..688ad0755f2 100644
--- a/code/_globalvars/bitfields.dm
+++ b/code/_globalvars/bitfields.dm
@@ -76,7 +76,7 @@ GLOBAL_LIST_INIT(bitfields, generate_bitfields())
"AMOUNT_VISIBLE" = AMOUNT_VISIBLE,
"NO_REACT" = NO_REACT,
),
-/*
+
"sight" = list(
"SEE_INFRA" = SEE_INFRA,
"SEE_SELF" = SEE_SELF,
@@ -88,7 +88,7 @@ GLOBAL_LIST_INIT(bitfields, generate_bitfields())
"SEE_BLACKNESS" = SEE_BLACKNESS,
"BLIND" = BLIND
),
-*/
+
"obj_flags" = list(
"EMAGGED" = EMAGGED,
"CAN_BE_HIT" = CAN_BE_HIT
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 5cf61d423d4..179516431a3 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -164,8 +164,7 @@
#define ui_spell_master "EAST-2:16,NORTH-1:26"
#define ui_genetic_master "EAST-1:16,NORTH-3:16"
-#define ui_shadekin_dark_display "EAST-1:28,CENTER-3:15"
-#define ui_shadekin_energy_display "EAST-1:28,CENTER-4:15"
+#define ui_shadekin_display "EAST-1:28,CENTER-3:15"
#define ui_xenochimera_danger_display "EAST-1:28,CENTER-3:15"
// Ghost ones
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 0ea9a800104..a7c19438964 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -309,15 +309,10 @@
mymob.hydration_icon.screen_loc = ui_nutrition_small
hud_elements |= mymob.hydration_icon
- mymob.shadekin_dark_display = new /atom/movable/screen/shadekin/darkness()
- mymob.shadekin_dark_display.screen_loc = ui_shadekin_dark_display
- mymob.shadekin_dark_display.icon_state = "dark"
- hud_elements |= mymob.shadekin_dark_display
-
- mymob.shadekin_energy_display = new /atom/movable/screen/shadekin/energy()
- mymob.shadekin_energy_display.screen_loc = ui_shadekin_energy_display
- mymob.shadekin_energy_display.icon_state = "energy0"
- hud_elements |= mymob.shadekin_energy_display
+ mymob.shadekin_display = new /atom/movable/screen/shadekin()
+ mymob.shadekin_display.screen_loc = ui_shadekin_display
+ mymob.shadekin_display.icon_state = "shadekin"
+ hud_elements |= mymob.shadekin_display
mymob.xenochimera_danger_display = new /atom/movable/screen/xenochimera/danger_level()
mymob.xenochimera_danger_display.screen_loc = ui_xenochimera_danger_display
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index d5cb7078bcc..f376ffe7a59 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -201,23 +201,9 @@ var/global/list/datum/gene/dna_genes[0]
// Technically custom_species is not part of the UI, but this place avoids merge problems.
src.custom_species = character.custom_species
- if(istype(character.species,/datum/species/custom))
- var/datum/species/custom/CS = character.species
- src.species_traits = CS.traits.Copy()
- src.base_species = CS.base_species
- src.blood_color = CS.blood_color
-
- if(istype(character.species,/datum/species/shapeshifter/xenochimera))
- var/datum/species/shapeshifter/xenochimera/CS = character.species
- //src.species_traits = CS.traits.Copy() //No traits
- src.base_species = CS.base_species
- src.blood_color = CS.blood_color
-
- if(istype(character.species,/datum/species/alraune))
- var/datum/species/alraune/CS = character.species
- //src.species_traits = CS.traits.Copy() //No traits
- src.base_species = CS.base_species
- src.blood_color = CS.blood_color
+ src.base_species = character.species.base_species
+ src.blood_color = character.species.blood_color
+ src.species_traits = character.species.traits.Copy()
src.custom_say = character.custom_say
src.custom_ask = character.custom_ask
@@ -225,10 +211,10 @@ var/global/list/datum/gene/dna_genes[0]
src.custom_exclaim = character.custom_exclaim
// +1 to account for the none-of-the-above possibility
- SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1)
- SetUIValueRange(DNA_UI_TAIL_STYLE, tail_style + 1, tail_styles_list.len + 1, 1)
- SetUIValueRange(DNA_UI_PLAYERSCALE, size_multiplier, player_sizes_list.len, 1)
- SetUIValueRange(DNA_UI_WING_STYLE, wing_style + 1, wing_styles_list.len + 1, 1)
+ SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1)
+ SetUIValueRange(DNA_UI_TAIL_STYLE, tail_style + 1, tail_styles_list.len + 1, 1)
+ SetUIValueRange(DNA_UI_PLAYERSCALE, size_multiplier, player_sizes_list.len, 1)
+ SetUIValueRange(DNA_UI_WING_STYLE, wing_style + 1, wing_styles_list.len + 1, 1)
SetUIValueRange(DNA_UI_TAIL_R, character.r_tail, 255, 1)
SetUIValueRange(DNA_UI_TAIL_G, character.g_tail, 255, 1)
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 59fc0c47e31..8bc45e5b37d 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -238,24 +238,13 @@
H.custom_ask = dna.custom_ask
H.custom_whisper = dna.custom_whisper
H.custom_exclaim = dna.custom_exclaim
- if(istype(H.species,/datum/species/custom))
- var/datum/species/custom/CS = H.species
- CS.copy_from(dna.base_species, dna.species_traits, src)
- CS.blood_color = dna.blood_color
+ H.species.blood_color = dna.blood_color
+ var/datum/species/S = H.species
+ S.copy_from(dna.base_species, dna.species_traits, H)
- if(istype(H.species,/datum/species/shapeshifter/xenochimera))
- var/datum/species/shapeshifter/xenochimera/CS = H.species
- CS.copy_from(dna.base_species,dna.species_traits,src)
- CS.blood_color = dna.blood_color
- H.regenerate_icons()
-
- if(istype(H.species,/datum/species/alraune))
- var/datum/species/alraune/CS = H.species
- CS.copy_from(dna.base_species,dna.species_traits,src)
- CS.blood_color = dna.blood_color
H.force_update_organs()
H.force_update_limbs()
- //H.update_body(0) // Done in force_update_limbs already
+ //H.update_icons_body(0) // Done in force_update_limbs already
H.update_eyes()
H.update_hair()
@@ -264,8 +253,7 @@
return FALSE
/mob/living/carbon/human/proc/force_update_organs()
- for(var/organ in organs + internal_organs)
- var/obj/item/organ/O = organ
+ for(var/obj/item/organ/O as anything in organs + internal_organs)
O.species = species
/// Used below, simple injection modifier.
diff --git a/code/modules/client/preference_setup/vore/08_traits.dm b/code/modules/client/preference_setup/vore/08_traits.dm
index 07dafd3cef1..0d3ae788e5a 100644
--- a/code/modules/client/preference_setup/vore/08_traits.dm
+++ b/code/modules/client/preference_setup/vore/08_traits.dm
@@ -72,21 +72,21 @@
if(pref.species != SPECIES_CUSTOM)
pref.pos_traits.Cut()
- pref.neu_traits.Cut()
pref.neg_traits.Cut()
- else
- // Clean up positive traits
- for(var/path in pref.pos_traits)
- if(!(path in positive_traits))
- pref.pos_traits -= path
- //Neutral traits
- for(var/path in pref.neu_traits)
- if(!(path in neutral_traits))
- pref.neu_traits -= path
- //Negative traits
- for(var/path in pref.neg_traits)
- if(!(path in negative_traits))
- pref.neg_traits -= path
+ // Clean up positive traits
+ for(var/path in pref.pos_traits)
+ if(!(path in positive_traits))
+ pref.pos_traits -= path
+ //Neutral traits
+ for(var/path in pref.neu_traits)
+ if(!(path in neutral_traits))
+ pref.neu_traits -= path
+ if(!(pref.species == SPECIES_CUSTOM) && !(path in everyone_traits))
+ pref.neu_traits -= path
+ //Negative traits
+ for(var/path in pref.neg_traits)
+ if(!(path in negative_traits))
+ pref.neg_traits -= path
var/datum/species/selected_species = pref.character_static_species_meta()
if(selected_species.selects_bodytype)
@@ -99,27 +99,28 @@
pref.custom_ask = lowertext(trim(pref.custom_ask))
pref.custom_exclaim = lowertext(trim(pref.custom_exclaim))
-/datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character)
- character.custom_species = pref.custom_species
- character.custom_say = lowertext(trim(pref.custom_say))
- character.custom_ask = lowertext(trim(pref.custom_ask))
- character.custom_whisper = lowertext(trim(pref.custom_whisper))
- character.custom_exclaim = lowertext(trim(pref.custom_exclaim))
- var/datum/species/selected_species = pref.character_static_species_meta()
- if(selected_species.selects_bodytype)
- var/datum/species/custom/CS = character.species
- var/S = pref.custom_base ? pref.custom_base : SPECIES_HUMAN
- CS.copy_from(S, pref.pos_traits + pref.neu_traits + pref.neg_traits, character)
- //Any additional non-trait settings can be applied here
- CS.blood_color = pref.blood_color
+/datum/category_item/player_setup_item/vore/traits/copy_to_mob(mob/living/carbon/human/character)
+ character.custom_species = pref.custom_species
+ character.custom_say = lowertext(trim(pref.custom_say))
+ character.custom_ask = lowertext(trim(pref.custom_ask))
+ character.custom_whisper = lowertext(trim(pref.custom_whisper))
+ character.custom_exclaim = lowertext(trim(pref.custom_exclaim))
- if(pref.species == SPECIES_CUSTOM)
- //Statistics for this would be nice
- var/english_traits = english_list(CS.traits, and_text = ";", comma_text = ";")
- log_game("TRAITS [pref.client_ckey]/([character]) with: [english_traits]") //Terrible 'fake' key_name()... but they aren't in the same entity yet
+ var/datum/species/S = character.species
+ var/SB = S.selects_bodytype ? pref.custom_base : pref.character_static_species_meta()
+ var/datum/species/new_S = S.copy_from(SB, pref.pos_traits + pref.neu_traits + pref.neg_traits, character)
-/datum/category_item/player_setup_item/vore/traits/content(var/mob/user)
+ //Any additional non-trait settings can be applied here
+ new_S.blood_color = pref.blood_color
+
+ if(pref.species == SPECIES_CUSTOM)
+ //Statistics for this would be nice
+ var/english_traits = english_list(new_S.traits, and_text = ";", comma_text = ";")
+ log_game("TRAITS [pref.client_ckey]/([character]) with: [english_traits]") //Terrible 'fake' key_name()... but they aren't in the same entity yet
+
+
+/datum/category_item/player_setup_item/vore/traits/content(mob/user)
. += "Custom Species Name: "
. += "[pref.custom_species ? pref.custom_species : "-Input Name-"]
"
@@ -128,15 +129,15 @@
. += "Icon Base: "
. += "[pref.custom_base ? pref.custom_base : SPECIES_HUMAN]
"
+ var/traits_left = pref.max_traits
+ . += "Traits Left: [traits_left]
"
if(pref.species == SPECIES_CUSTOM)
var/points_left = pref.starting_trait_points
- var/traits_left = pref.max_traits
for(var/T in pref.pos_traits + pref.neg_traits)
points_left -= traits_costs[T]
traits_left--
. += "Points Left: [points_left]
"
- . += "Traits Left: [traits_left]
"
if(points_left < 0 || traits_left < 0 || !pref.custom_species)
. += "^ Fix things! ^
"
@@ -147,19 +148,20 @@
. += "
- [trait.name] ([trait.cost])"
. += ""
- . += "Neutral Trait +
"
- . += ""
-
. += "Negative Trait +
"
. += ""
+
+ . += "Neutral Trait +
"
+ . += ""
+
. += "Blood Color: " //People that want to use a certain species to have that species traits (xenochimera/promethean/spider) should be able to set their own blood color.
. += "Set Color"
. += "R
"
@@ -266,8 +268,12 @@
picklist = positive_traits.Copy() - pref.pos_traits
mylist = pref.pos_traits
if(NEUTRAL_MODE)
- picklist = neutral_traits.Copy() - pref.neu_traits
- mylist = pref.neu_traits
+ if(pref.species == SPECIES_CUSTOM)
+ picklist = neutral_traits.Copy() - pref.neu_traits
+ mylist = pref.neu_traits
+ else
+ picklist = everyone_traits.Copy() - pref.neu_traits
+ mylist = pref.neu_traits
if(NEGATIVE_MODE)
picklist = negative_traits.Copy() - pref.neg_traits
mylist = pref.neg_traits
@@ -313,6 +319,13 @@
var/conflict = FALSE
+ // if(pref.species in instance.banned_species)
+ // tgui_alert_async(usr, "The trait you've selected cannot be taken by the species you've chosen!", "Error")
+ // return TOPIC_REFRESH
+
+ if( LAZYLEN(instance.allowed_species) && !(pref.species in instance.allowed_species))
+ tgui_alert_async(usr, "The trait you've selected cannot be taken by the species you've chosen!", "Error")
+ return TOPIC_REFRESH
if(trait_choice in pref.pos_traits + pref.neu_traits + pref.neg_traits)
conflict = instance.name
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 6d4cd68e043..b7f202448de 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -3,91 +3,157 @@
GLOBAL_LIST_EMPTY(preferences_datums)
/datum/preferences
- //doohickeys for savefiles
+//! ## Doohickeys For Savefiles
var/path
- var/default_slot = 1 //Holder so it doesn't default to slot 1, rather the last one used
+ /// Holder so it doesn't default to slot 1, rather the last one used.
+ var/default_slot = 1
var/savefile_version = 0
- //non-preference stuff
+//! ## Non-Preference Stuff
var/warns = 0
var/muted = 0
var/last_ip
var/last_id
- //Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another
+//! ## Cooldowns for saving/loading.
+//? ## These are four are all separate due to loading code calling these one after another.
var/saveprefcooldown
var/loadprefcooldown
var/savecharcooldown
var/loadcharcooldown
- //game-preferences
+//! ## Game Preferences
var/tgui_fancy = TRUE
var/tgui_lock = TRUE
- var/lastchangelog = "" //Saved changlog filesize to detect if there was a change
- var/ooccolor = "#010000" //Whatever this is set to acts as 'reset' color and is thus unusable as an actual custom color
- var/be_special = 0 //Special role selection
- /// Event role prefs flag
+ /// Saved changlog filesize to detect if there was a change.
+ var/lastchangelog = ""
+ /// Whatever this is set to acts as 'reset' color and is thus unusable as an actual custom color.
+ var/ooccolor = "#010000"
+ /// Special role selection.
+ var/be_special = 0
+ /// Event role prefs flag.
var/be_event_role = NONE
var/UI_style = UI_STYLE_DEFAULT
var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255
- var/tooltipstyle = "Midnight" //Style for popup tooltips
+ /// Style for popup tooltips.
+ var/tooltipstyle = "Midnight"
var/client_fps = 0
- //character preferences
- var/real_name //our character's name
- var/be_random_name = 0 //whether we are a random name every round
- var/nickname //our character's nickname
- var/age = 30 //age of character
- var/spawnpoint = "Arrivals Shuttle" //where this character will spawn (0-2).
- var/b_type = "A+" //blood type (not-chooseable)
- var/backbag = 2 //backpack type
- var/pdachoice = 1 //PDA type
- var/h_style = "Bald" //Hair type
- var/r_hair = 0 //Hair color
- var/g_hair = 0 //Hair color
- var/b_hair = 0 //Hair color
- var/grad_style = "None" //Gradient style
- var/r_grad = 0 //Gradient color
- var/g_grad = 0 //Gradient color
- var/b_grad = 0 //Gradient color
- var/grad_wingstyle = "None" //Gradient style
- var/f_style = "Shaved" //Face hair type
- var/r_facial = 0 //Face hair color
- var/g_facial = 0 //Face hair color
- var/b_facial = 0 //Face hair color
- var/s_tone = 0 //Skin tone
- var/r_skin = 238 //Skin color
- var/g_skin = 206 //Skin color
- var/b_skin = 179 //Skin color
- var/s_base = "" //For Adherent
- var/r_eyes = 0 //Eye color
- var/g_eyes = 0 //Eye color
- var/b_eyes = 0 //Eye color
- var/species = SPECIES_HUMAN //Species datum to use.
- var/species_preview //Used for the species selection window.
- var/list/alternate_languages = list() //Secondary language(s)
- var/list/language_prefixes = list() //Kanguage prefix keys
- var/list/gear //Left in for Legacy reasons, will no longer save.
- var/list/gear_list = list() //Custom/fluff item loadouts.
- var/gear_slot = 1 //The current gear save slot
- var/list/traits //Traits which modifier characters for better or worse (mostly worse).
- var/synth_color = 0 //Lets normally uncolorable synth parts be colorable.
- var/r_synth //Used with synth_color to color synth parts that normaly can't be colored.
- var/g_synth //Same as above
- var/b_synth //Same as above
- var/synth_markings = 1 //Enable/disable markings on synth parts.
+//! ## Character Preferences
+ /// Our character's name
+ var/real_name
+ /// Whether we are a random name every round
+ var/be_random_name = 0
+ /// Our character's nickname
+ var/nickname
+ /// Age of character
+ var/age = 30
+ /// Where this character will spawn. (0-2)
+ var/spawnpoint = "Arrivals Shuttle"
+ /// Blood type. (not-chooseable)
+ var/b_type = "A+"
+ /// Backpack type.
+ var/backbag = 2
+ /// PDA type.
+ var/pdachoice = 1
+ /// Hair type.
+ var/h_style = "Bald"
+ /// Hair color.
+ var/r_hair = 0
+ /// Hair color.
+ var/g_hair = 0
+ /// Hair color.
+ var/b_hair = 0
+ /// Gradient style.
+ var/grad_style = "None"
+ /// Gradient color.
+ var/r_grad = 0
+ /// Gradient color.
+ var/g_grad = 0
+ /// Gradient color.
+ var/b_grad = 0
+ /// Gradient style.
+ var/grad_wingstyle = "None"
+ /// Face hair type.
+ var/f_style = "Shaved"
+ /// Face hair color.
+ var/r_facial = 0
+ /// Face hair color.
+ var/g_facial = 0
+ /// Face hair color.
+ var/b_facial = 0
+ /// Skin tone.
+ var/s_tone = 0
+ /// Skin color.
+ var/r_skin = 238
+ /// Skin color.
+ var/g_skin = 206
+ /// Skin color.
+ var/b_skin = 179
+ /// For Adherent.
+ var/s_base = ""
+ /// Eye color.
+ var/r_eyes = 0
+ /// Eye color.
+ var/g_eyes = 0
+ /// Eye color.
+ var/b_eyes = 0
+ /// Species datum to use.
+ var/species = SPECIES_HUMAN
+ /// Used for the species selection window.
+ var/species_preview
+ /// Secondary language(s)
+ var/list/alternate_languages = list()
+ /// Language prefix keys.
+ var/list/language_prefixes = list()
+ /// Left in for Legacy reasons, will no longer save.
+ var/list/gear
+ /// Custom/fluff item loadouts.
+ var/list/gear_list = list()
+ /// The current gear save slot.
+ var/gear_slot = 1
+ /// Traits which modifier characters for better or worse (mostly worse).
+ var/list/traits
+ /// Lets normally uncolorable synth parts be colorable.
+ var/synth_color = 0
+ /// Used with synth_color to color synth parts that normaly can't be colored.
+ var/r_synth
+ /// Used with synth_color to color synth parts that normaly can't be colored.
+ var/g_synth
+ /// Used with synth_color to color synth parts that normaly can't be colored.
+ var/b_synth
+ /// Enable/disable markings on synth parts.
+ var/synth_markings = 1
- //Some faction information.
- var/home_system = "Unset" //System of birth.
- var/citizenship = "None" //Current home system.
- var/faction = "None" //General associated faction.
- var/religion = "None" //Religious association.
- var/antag_faction = "None" //Antag associated faction.
- var/antag_vis = "Hidden" //How visible antag association is to others.
+//! ## Background Preferences
+ ///System of birth.
+ var/home_system = "Unset"
+ ///Current home system.
+ var/citizenship = "None"
+ ///General associated faction.
+ var/faction = "None"
+ ///Religious association.
+ var/religion = "None"
+ ///Antag associated faction.
+ var/antag_faction = "None"
+ ///How visible antag association is to others.
+ var/antag_vis = "Hidden"
- //Mob preview
- var/list/char_render_holders //Should only be a key-value list of north/south/east/west = atom/movable/screen.
+ var/med_record = ""
+ var/sec_record = ""
+ var/gen_record = ""
+ var/exploit_record = ""
+ var/disabilities = 0
+ var/mirror = TRUE
+
+ var/economic_status = "Average"
+
+ var/uplinklocation = "PDA"
+
+//! ## Mob Preview
+ /// Should only be a key-value list of north/south/east/west = atom/movable/screen.
+ var/list/char_render_holders
var/static/list/preview_screen_locs = list(
"1" = "character_preview_map:2,7",
"2" = "character_preview_map:2,5",
@@ -96,7 +162,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
"BG" = "character_preview_map:1,1 to 3,8"
)
- //Jobs, uses bitflags
+//! ## Job Preferences
+//? ## Uses bitflags.
var/job_civilian_high = 0
var/job_civilian_med = 0
var/job_civilian_low = 0
@@ -113,72 +180,68 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/job_talon_med = 0
var/job_talon_low = 0
- //Keeps track of preferrence for not getting any wanted jobs
+ /// Keeps track of preferrence for not getting any wanted jobs.
var/alternate_option = 1
+//! ## Skills Preferences - Depricated.
var/used_skillpoints = 0
var/skill_specialization = null
- var/list/skills = list() // skills can range from 0 to 3
+ /// Skills can range from 0 to 3.
+ var/list/skills = list()
- // maps each organ to either null(intact), "cyborg" or "amputated"
- // will probably not be able to do this for head and torso ;)
+//! ## Body Preferences
+ /// Maps each organ to either null(intact), "cyborg" or "amputated"
+ /// will probably not be able to do this for head and torso ;)
var/list/organ_data = list()
var/list/rlimb_data = list()
- var/regen_limbs = 0 //set to 1 when altering limb states. fix for prosthetic > normal changes not working on preview.
- var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor"
+ /// Set to 1 when altering limb states. fix for prosthetic > normal changes not working on preview.
+ var/regen_limbs = 0
+ /// The default name of a job like "Medical Doctor".
+ var/list/player_alt_titles = new()
- var/list/body_markings = list() // "name" = "#rgbcolor"
+ var/list/body_markings = list() //? "name" = "#rgbcolor"
var/list/flavor_texts = list()
var/list/flavour_texts_robot = list()
var/list/body_descriptors = list()
- var/med_record = ""
- var/sec_record = ""
- var/gen_record = ""
- var/exploit_record = ""
- var/disabilities = 0
- var/mirror = TRUE
-
- var/economic_status = "Average"
-
- var/uplinklocation = "PDA"
-
- // OOC Metadata:
+//! ## OOC Metadata
var/metadata = ""
var/list/ignored_players = list()
var/client/client = null
var/client_ckey = null
- // Communicator identity data
+ /// Communicator identity data.
var/communicator_visibility = 0
- // Default ringtone for character; if blank, use job default
+ /// Default ringtone for character; if blank, use job default.
var/ringtone = null
var/datum/category_collection/player_setup_collection/player_setup
var/datum/browser/panel
- var/lastnews // Hash of last seen lobby news content.
+ /// Hash of last seen lobby news content.
+ var/lastnews
- //Character Directory Stuff
- ///Should we show in Character Directory
+//! ## Character Directory Stuff
+ /// Should we show in Character Directory.
var/show_in_directory = 1
- ///Sorting tag to use for vore-prefs
+ /// Sorting tag to use for vore-prefs.
var/directory_tag = "Unset"
- ///Sorting tag to use for erp-prefs
+ /// Sorting tag to use for erp-prefs.
var/directory_erptag = "Unset"
- ///Advertisement stuff to show in character directory.
+ /// Advertisement stuff to show in character directory.
var/directory_ad = ""
- ///Set character's suit sensor level
+ /// Set character's suit sensor level.
var/sensorpref = 5
- ///Should we automatically fit the viewport?
+ /// Should we automatically fit the viewport?
var/auto_fit_viewport = TRUE
- ///Should we be in the widescreen mode set by the config?
+
+ /// Should we be in the widescreen mode set by the config?
var/widescreenpref = FALSE // Doesn't exist... Yet.
/datum/preferences/New(client/C)
diff --git a/code/modules/lighting/lighting_turf.dm b/code/modules/lighting/lighting_turf.dm
index fc9cd0336d9..f2507af6809 100644
--- a/code/modules/lighting/lighting_turf.dm
+++ b/code/modules/lighting/lighting_turf.dm
@@ -60,7 +60,7 @@
#undef OPERATE
// Used to get a scaled lumcount.
-/turf/proc/get_lumcount(var/minlum = 0, var/maxlum = 1)
+/turf/proc/get_lumcount(minlum = 0, maxlum = 1)
if(!lighting_object)
return 1
diff --git a/code/modules/mob/_modifiers/modifiers.dm b/code/modules/mob/_modifiers/modifiers.dm
index 7d1de3088e9..f92babe82a4 100644
--- a/code/modules/mob/_modifiers/modifiers.dm
+++ b/code/modules/mob/_modifiers/modifiers.dm
@@ -1,54 +1,101 @@
-// This is a datum that tells the mob that something is affecting them.
-// The advantage of using this datum verses just setting a variable on the mob directly, is that there is no risk of two different procs overwriting
-// each other, or other weirdness. An excellent example is adjusting max health.
-
+/**
+ * This is a datum that tells the mob that something is affecting them.
+ * The advantage of using this datum verses just setting a variable on the mob directly, is that there is no risk of two different procs overwriting
+ * each other, or other weirdness. An excellent example is adjusting max health.
+ */
/datum/modifier
- var/name = null // Mostly used to organize, might show up on the UI in the Future(tm)
- var/desc = null // Ditto.
- var/icon_state = null // See above.
- var/mob/living/holder = null // The mob that this datum is affecting.
- var/datum/weakref/origin = null // A weak reference to whatever caused the modifier to appear. THIS NEEDS TO BE A MOB/LIVING. It's a weakref to not interfere with qdel().
- var/expire_at = null // world.time when holder's Life() will remove the datum. If null, it lasts forever or until it gets deleted by something else.
- var/on_created_text = null // Text to show to holder upon being created.
- var/on_expired_text = null // Text to show to holder when it expires.
- var/hidden = FALSE // If true, it will not show up on the HUD in the Future(tm)
- var/stacks = MODIFIER_STACK_FORBID // If true, attempts to add a second instance of this type will refresh expire_at instead.
- var/flags = 0 // Flags for the modifier, see mobs.dm defines for more details.
+ /// Mostly used to organize, might show up on the UI in the Future(tm)
+ var/name = null
+ /// Ditto.
+ var/desc = null
+ /// See above.
+ var/icon_state = null
+ /// The mob that this datum is affecting.
+ var/mob/living/holder = null
+ /// A weak reference to whatever caused the modifier to appear. THIS NEEDS TO BE A MOB/LIVING. It's a weakref to not interfere with qdel().
+ var/datum/weakref/origin = null
+ /// world.time when holder's Life() will remove the datum. If null, it lasts forever or until it gets deleted by something else.
+ var/expire_at = null
+ /// Text to show to holder upon being created.
+ var/on_created_text = null
+ /// Text to show to holder when it expires.
+ var/on_expired_text = null
+ /// If true, it will not show up on the HUD in the Future(tm)
+ var/hidden = FALSE
+ /// If true, attempts to add a second instance of this type will refresh expire_at instead.
+ var/stacks = MODIFIER_STACK_FORBID
+ /// Flags for the modifier, see mobs.dm defines for more details.
+ var/flags = 0
- var/light_color = null // If set, the mob possessing the modifier will glow in this color. Not implemented yet.
- var/light_range = null // How far the light for the above var goes. Not implemented yet.
- var/light_intensity = null // Ditto. Not implemented yet.
- var/mob_overlay_state = null // Icon_state for an overlay to apply to a (human) mob while this exists. This is actually implemented.
- var/client_color = null // If set, the client will have the world be shown in this color, from their perspective.
- var/wire_colors_replace = null // If set, the client will have wires replaced by the given replacement list. For colorblindness.
+ /// If set, the mob possessing the modifier will glow in this color. Not implemented yet.
+ var/light_color = null
+ /// How far the light for the above var goes. Not implemented yet.
+ var/light_range = null
+ /// Ditto. Not implemented yet.
+ var/light_intensity = null
+ /// Icon_state for an overlay to apply to a (human) mob while this exists. This is actually implemented.
+ var/mob_overlay_state = null
+ /// If set, the client will have the world be shown in this color, from their perspective.
+ var/client_color = null
+ /// If set, the client will have wires replaced by the given replacement list. For colorblindness.
+ var/wire_colors_replace = null
- // Now for all the different effects.
- // Percentage modifiers are expressed as a multipler. (e.g. +25% damage should be written as 1.25)
- var/max_health_flat // Adjusts max health by a flat (e.g. +20) amount. Note this is added to base health.
- var/max_health_percent // Adjusts max health by a percentage (e.g. -30%).
- var/disable_duration_percent // Adjusts duration of 'disables' (stun, weaken, paralyze, confusion, sleep, halloss, etc) Setting to 0 will grant immunity.
- var/incoming_damage_percent // Adjusts all incoming damage.
- var/incoming_brute_damage_percent // Only affects bruteloss.
- var/incoming_fire_damage_percent // Only affects fireloss.
- var/incoming_tox_damage_percent // Only affects toxloss.
- var/incoming_oxy_damage_percent // Only affects oxyloss.
- var/incoming_clone_damage_percent // Only affects cloneloss.
- var/incoming_hal_damage_percent // Only affects halloss.
- var/incoming_healing_percent // Adjusts amount of healing received.
- var/outgoing_melee_damage_percent // Adjusts melee damage inflicted by holder by a percentage. Affects attacks by melee weapons and hand-to-hand.
- var/slowdown // Negative numbers speed up, positive numbers slow down movement.
- var/haste // If set to 1, the mob will be 'hasted', which makes it ignore slowdown and go really fast.
- var/evasion // Positive numbers reduce the odds of being hit. Negative numbers increase the odds.
- var/bleeding_rate_percent // Adjusts amount of blood lost when bleeding.
- var/accuracy // Positive numbers makes hitting things with guns easier, negatives make it harder.
- var/accuracy_dispersion // Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
- var/metabolism_percent // Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
- var/icon_scale_x_percent // Makes the holder's icon get scaled wider or thinner.
- var/icon_scale_y_percent // Makes the holder's icon get scaled taller or shorter.
- var/attack_speed_percent // Makes the holder's 'attack speed' (click delay) shorter or longer.
- var/pain_immunity // Makes the holder not care about pain while this is on. Only really useful to human mobs.
- var/pulse_modifier // Modifier for pulse, will be rounded on application, then added to the normal 'pulse' multiplier which ranges between 0 and 5 normally. Only applied if they're living.
- var/pulse_set_level // Positive number. If this is non-null, it will hard-set the pulse level to this. Pulse ranges from 0 to 5 normally.
+//! Now for all the different effects.
+//! Percentage modifiers are expressed as a multipler. (e.g. +25% damage should be written as 1.25)
+
+ /// Adjusts max health by a flat (e.g. +20) amount. Note this is added to base health.
+ var/max_health_flat
+ /// Adjusts max health by a percentage (e.g. -30%).
+ var/max_health_percent
+ /// Adjusts duration of 'disables' (stun, weaken, paralyze, confusion, sleep, halloss, etc) Setting to 0 will grant immunity.
+ var/disable_duration_percent
+ /// Adjusts all incoming damage.
+ var/incoming_damage_percent
+ /// Only affects bruteloss.
+ var/incoming_brute_damage_percent
+ /// Only affects fireloss.
+ var/incoming_fire_damage_percent
+ /// Only affects toxloss.
+ var/incoming_tox_damage_percent
+ /// Only affects oxyloss.
+ var/incoming_oxy_damage_percent
+ /// Only affects cloneloss.
+ var/incoming_clone_damage_percent
+ /// Only affects halloss.
+ var/incoming_hal_damage_percent
+ /// Adjusts amount of healing received.
+ var/incoming_healing_percent
+ /// Adjusts melee damage inflicted by holder by a percentage. Affects attacks by melee weapons and hand-to-hand.
+ var/outgoing_melee_damage_percent
+ /// Negative numbers speed up, positive numbers slow down movement.
+ var/slowdown
+ /// If set to 1, the mob will be 'hasted', which makes it ignore slowdown and go really fast.
+ var/haste
+ /// Positive numbers reduce the odds of being hit. Negative numbers increase the odds.
+ var/evasion
+ /// Adjusts amount of blood lost when bleeding.
+ var/bleeding_rate_percent
+ /// Positive numbers makes hitting things with guns easier, negatives make it harder.
+ var/accuracy
+ /// Positive numbers make gun firing cover a wider tile range, and therefore more inaccurate. Negatives help negate dispersion penalties.
+ var/accuracy_dispersion
+ /// Adjusts the mob's metabolic rate, which affects reagent processing. Won't affect mobs without reagent processing.
+ var/metabolism_percent
+ /// Makes the holder's icon get scaled wider or thinner.
+ var/icon_scale_x_percent
+ /// Makes the holder's icon get scaled taller or shorter.
+ var/icon_scale_y_percent
+ /// Makes the holder's 'attack speed' (click delay) shorter or longer.
+ var/attack_speed_percent
+ /// Makes the holder not care about pain while this is on. Only really useful to human mobs.
+ var/pain_immunity
+ /// Modifier for pulse, will be rounded on application, then added to the normal 'pulse' multiplier which ranges between 0 and 5 normally. Only applied if they're living.
+ var/pulse_modifier
+ /// Positive number. If this is non-null, it will hard-set the pulse level to this. Pulse ranges from 0 to 5 normally.
+ var/pulse_set_level
+
+ /// Vision flags to add to the mob. SEE_MOB, SEE_OBJ, etc.
+ var/vision_flags
/datum/modifier/New(var/new_holder, var/new_origin)
holder = new_holder
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 019de5aeb28..7eaf4f395be 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -222,7 +222,7 @@
return(prob_slip)
// Handle footstep sounds
-/mob/living/carbon/human/handle_footstep(var/turf/T)
+/mob/living/carbon/human/handle_footstep(turf/T)
if(is_incorporeal())
return
if(!config_legacy.footstep_volume || !T.footstep_sounds || !T.footstep_sounds.len)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 6dd15fb7d66..652d711db36 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -1471,6 +1471,10 @@
if(!druggy)
SetSeeInvisibleSelf(SEE_INVISIBLE_LEVEL_TWO)
+ for(var/datum/modifier/M in modifiers)
+ if(!isnull(M.vision_flags))
+ AddSightSelf(M.vision_flags)
+
if(!glasses_processed && nif)
var/datum/nifsoft/vision_soft
for(var/datum/nifsoft/NS in nif.nifsofts)
diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm
index 9b202f9b49a..e556e1d439a 100644
--- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm
+++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin.dm
@@ -4,7 +4,7 @@
icobase = 'icons/mob/human_races/r_shadekin_vr.dmi'
deform = 'icons/mob/human_races/r_shadekin_vr.dmi'
tail = "tail"
- icobase_tail = 1
+ icobase_tail = TRUE
blurb = "Very little is known about these creatures. They appear to be largely mammalian in appearance. \
Seemingly very rare to encounter, there have been widespread myths of these creatures the galaxy over, \
but next to no verifiable evidence to their existence. However, they have recently been more verifiably \
@@ -25,7 +25,7 @@
/datum/unarmed_attack/bite/sharp/shadekin
)
- rarity_value = 15 //INTERDIMENSIONAL FLUFFERS
+ rarity_value = 15 //INTERDIMENSIONAL FLUFFERS
siemens_coefficient = 1
darksight = 10
@@ -33,8 +33,8 @@
slowdown = -0.5
item_slowdown_mod = 0.5
- brute_mod = 0.7 // Naturally sturdy.
- burn_mod = 1.2 // Furry
+ brute_mod = 0.7 // Naturally sturdy.
+ burn_mod = 1.2 // Furry
warning_low_pressure = 50
hazard_low_pressure = -1
@@ -42,11 +42,11 @@
warning_high_pressure = 300
hazard_high_pressure = INFINITY
- cold_level_1 = -1 //Immune to cold
+ cold_level_1 = -1 //Immune to cold
cold_level_2 = -1
cold_level_3 = -1
- heat_level_1 = 850 //Resistant to heat
+ heat_level_1 = 850 //Resistant to heat
heat_level_2 = 1000
heat_level_3 = 1150
@@ -62,6 +62,7 @@
has_glowing_eyes = TRUE
+ death_message = "phases to somewhere far away!"
male_cough_sounds = null
female_cough_sounds = null
male_sneeze_sound = null
@@ -82,64 +83,70 @@
move_trail = /obj/effect/decal/cleanable/blood/tracks/paw
has_organ = list(
- O_HEART = /obj/item/organ/internal/heart,
- O_VOICE = /obj/item/organ/internal/voicebox,
- O_LIVER = /obj/item/organ/internal/liver,
- O_KIDNEYS = /obj/item/organ/internal/kidneys,
- O_BRAIN = /obj/item/organ/internal/brain/shadekin,
- O_EYES = /obj/item/organ/internal/eyes,
- O_STOMACH = /obj/item/organ/internal/stomach,
- O_INTESTINE = /obj/item/organ/internal/intestine
- )
+ O_HEART = /obj/item/organ/internal/heart,
+ O_VOICE = /obj/item/organ/internal/voicebox,
+ O_LIVER = /obj/item/organ/internal/liver,
+ O_KIDNEYS = /obj/item/organ/internal/kidneys,
+ O_BRAIN = /obj/item/organ/internal/brain/shadekin,
+ O_EYES = /obj/item/organ/internal/eyes,
+ O_STOMACH = /obj/item/organ/internal/stomach,
+ O_INTESTINE = /obj/item/organ/internal/intestine
+ )
has_limbs = list(
- BP_TORSO = list("path" = /obj/item/organ/external/chest),
- BP_GROIN = list("path" = /obj/item/organ/external/groin),
- BP_HEAD = list("path" = /obj/item/organ/external/head/vr/shadekin),
- BP_L_ARM = list("path" = /obj/item/organ/external/arm),
- BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
- BP_L_LEG = list("path" = /obj/item/organ/external/leg),
- BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
+ BP_TORSO = list("path" = /obj/item/organ/external/chest),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin),
+ BP_HEAD = list("path" = /obj/item/organ/external/head/vr/shadekin),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
BP_L_HAND = list("path" = /obj/item/organ/external/hand),
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
- )
+ )
//SHADEKIN-UNIQUE STUFF GOES HERE
- var/list/shadekin_abilities = list(/datum/power/shadekin/phase_shift,
- /datum/power/shadekin/regenerate_other,
- /datum/power/shadekin/create_shade)
+ var/list/shadekin_abilities = list(
+ /datum/power/shadekin/phase_shift,
+ /datum/power/shadekin/regenerate_other,
+ /datum/power/shadekin/create_shade,
+ )
var/list/shadekin_ability_datums = list()
+ var/kin_type
+ var/energy_light = 0.25
+ var/energy_dark = 0.75
/datum/species/shadekin/New()
..()
- inherent_verbs += list(
- /mob/living/proc/shred_limb,
- /mob/living/proc/eat_trash,
- /mob/living/carbon/human/proc/lick_wounds
- )
for(var/power in shadekin_abilities)
var/datum/power/shadekin/SKP = new power(src)
shadekin_ability_datums.Add(SKP)
+/datum/species/shadekin/handle_death(mob/living/carbon/human/H)
+ spawn(1)
+ for(var/obj/item/W in H)
+ H.drop_from_inventory(W)
+ qdel(H)
+
/datum/species/shadekin/get_bodytype()
return SPECIES_SHADEKIN
/datum/species/shadekin/get_random_name()
return "shadekin"
-/datum/species/shadekin/handle_environment_special(var/mob/living/carbon/human/H)
+/datum/species/shadekin/handle_environment_special(mob/living/carbon/human/H)
handle_shade(H)
/datum/species/shadekin/can_breathe_water()
return TRUE //they dont quite breathe
-/datum/species/shadekin/add_inherent_verbs(var/mob/living/carbon/human/H)
+/datum/species/shadekin/add_inherent_verbs(mob/living/carbon/human/H)
..()
add_shadekin_abilities(H)
-/datum/species/shadekin/proc/add_shadekin_abilities(var/mob/living/carbon/human/H)
+/datum/species/shadekin/proc/add_shadekin_abilities(mob/living/carbon/human/H)
if(!H.ability_master || !istype(H.ability_master, /atom/movable/screen/movable/ability_master/shadekin))
H.ability_master = null
H.ability_master = new /atom/movable/screen/movable/ability_master/shadekin(H)
@@ -147,14 +154,14 @@
if(!(P.verbpath in H.verbs))
H.verbs += P.verbpath
H.ability_master.add_shadekin_ability(
- object_given = H,
- verb_given = P.verbpath,
- name_given = P.name,
- ability_icon_given = P.ability_icon_state,
- arguments = list()
- )
+ object_given = H,
+ verb_given = P.verbpath,
+ name_given = P.name,
+ ability_icon_given = P.ability_icon_state,
+ arguments = list()
+ )
-/datum/species/shadekin/proc/handle_shade(var/mob/living/carbon/human/H)
+/datum/species/shadekin/proc/handle_shade(mob/living/carbon/human/H)
//Shifted kin don't gain/lose energy (and save time if we're at the cap)
var/darkness = 1
var/dark_gains = 0
@@ -166,94 +173,95 @@
var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
darkness = 1-brightness //Invert
+ var/is_dark = (darkness <= 0.5)
if(H.ability_flags & AB_PHASE_SHIFTED)
dark_gains = 0
else
//Heal (very) slowly in good darkness
- if(darkness >= 0.75)
- H.adjustFireLoss(-0.05)
- H.adjustBruteLoss(-0.05)
- H.adjustToxLoss(-0.05)
- dark_gains = 0.75
+ if(is_dark)
+ H.adjustFireLoss((-0.10)*darkness)
+ H.adjustBruteLoss((-0.10)*darkness)
+ H.adjustToxLoss((-0.10)*darkness)
+ //energy_dark and energy_light are set by the shadekin eye traits.
+ //These are balanced around their playstyles and 2 planned new aggressive abilities
+ dark_gains = energy_dark
else
- dark_gains = 0.25
+ dark_gains = energy_light
set_energy(H, get_energy(H) + dark_gains)
//Update huds
update_shadekin_hud(H)
-/datum/species/shadekin/proc/get_energy(var/mob/living/carbon/human/H)
+/datum/species/shadekin/proc/get_energy(mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
-
if(!istype(shade_organ))
- return 0
+ return FALSE
return shade_organ.dark_energy
-/datum/species/shadekin/proc/get_max_energy(var/mob/living/carbon/human/H)
+/datum/species/shadekin/proc/get_max_energy(mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
-
if(!istype(shade_organ))
- return 0
+ return FALSE
return shade_organ.max_dark_energy
-/datum/species/shadekin/proc/set_energy(var/mob/living/carbon/human/H, var/new_energy)
+/datum/species/shadekin/proc/set_energy(mob/living/carbon/human/H, new_energy)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
-
if(!istype(shade_organ))
return
shade_organ.dark_energy = clamp(new_energy, 0, get_max_energy(H))
-/datum/species/shadekin/proc/set_max_energy(var/mob/living/carbon/human/H, var/new_max_energy)
+/datum/species/shadekin/proc/set_max_energy(mob/living/carbon/human/H, new_max_energy)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
-
if(!istype(shade_organ))
- return 0
+ return FALSE
shade_organ.max_dark_energy = new_max_energy
-/datum/species/shadekin/proc/check_infinite_energy(var/mob/living/carbon/human/H)
+/datum/species/shadekin/proc/check_infinite_energy(mob/living/carbon/human/H)
var/obj/item/organ/internal/brain/shadekin/shade_organ = H.internal_organs_by_name[O_BRAIN]
-
if(!istype(shade_organ))
- return 0
+ return FALSE
return shade_organ.dark_energy_infinite
-/datum/species/shadekin/proc/update_shadekin_hud(var/mob/living/carbon/human/H)
+/datum/species/shadekin/proc/update_shadekin_hud(mob/living/carbon/human/H)
var/turf/T = get_turf(H)
- if(!T)
- return
- if(H.shadekin_energy_display)
- H.shadekin_energy_display.invisibility = 0
+ if(H.shadekin_display)
+ var/l_icon = 0
+ var/e_icon = 0
+
+ H.shadekin_display.invisibility = 0
+ if(T)
+ var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
+ var/darkness = 1-brightness //Invert
+ switch(darkness)
+ if(0.80 to 1.00)
+ l_icon = 0
+ if(0.60 to 0.80)
+ l_icon = 1
+ if(0.40 to 0.60)
+ l_icon = 2
+ if(0.20 to 0.40)
+ l_icon = 3
+ if(0.00 to 0.20)
+ l_icon = 4
+
switch(get_energy(H))
- if(80 to INFINITY)
- H.shadekin_energy_display.icon_state = "energy0"
- if(60 to 80)
- H.shadekin_energy_display.icon_state = "energy1"
- if(40 to 60)
- H.shadekin_energy_display.icon_state = "energy2"
- if(20 to 40)
- H.shadekin_energy_display.icon_state = "energy3"
- if(0 to 20)
- H.shadekin_energy_display.icon_state = "energy4"
- if(H.shadekin_dark_display)
- H.shadekin_dark_display.invisibility = 0
- var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
- var/darkness = 1-brightness //Invert
- switch(darkness)
- if(0.80 to 1.00)
- H.shadekin_dark_display.icon_state = "dark2"
- if(0.60 to 0.80)
- H.shadekin_dark_display.icon_state = "dark1"
- if(0.40 to 0.60)
- H.shadekin_dark_display.icon_state = "dark"
- if(0.20 to 0.40)
- H.shadekin_dark_display.icon_state = "dark-1"
- if(0.00 to 0.20)
- H.shadekin_dark_display.icon_state = "dark-2"
+ if(0 to 24)
+ e_icon = 0
+ if(25 to 49)
+ e_icon = 1
+ if(50 to 74)
+ e_icon = 2
+ if(75 to 99)
+ e_icon = 3
+ if(100 to INFINITY)
+ e_icon = 4
+
+ H.shadekin_display.icon_state = "shadekin-[l_icon]-[e_icon]"
return
diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm
index 329e4e35620..986e73df472 100644
--- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm
+++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm
@@ -24,7 +24,7 @@
name = "Phase Shift (100)"
desc = "Shift yourself out of alignment with realspace to travel quickly to different areas."
verbpath = /mob/living/carbon/human/proc/phase_shift
- ability_icon_state = "tech_passwall"
+ ability_icon_state = "wiz_jaunt"
/mob/living/carbon/human/proc/phase_shift()
set name = "Phase Shift (100)"
@@ -33,24 +33,44 @@
var/ability_cost = 100
+ var/darkness = 1
+ var/turf/T = get_turf(src)
+ if(!T)
+ to_chat(src, SPAN_WARNING("You can't use that here!"))
+ return FALSE
+
+ var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0
+ darkness = 1-brightness //Invert
+
+ var/watcher = 0
+ for(var/mob/living/carbon/human/watchers in oview(7,src )) // If we can see them...
+ if(watchers in oviewers(7,src)) // And they can see us...
+ if(!(watchers.stat) && !isbelly(watchers.loc) && !istype(watchers.loc, /obj/item/holder)) // And they are alive and not being held by someone...
+ watcher++ // They are watching us!
+
+ ability_cost = clamp(ability_cost/(0.01+darkness*2),50, 80)//This allows for 1 watcher in full light
+ if(watcher>0)
+ ability_cost = ability_cost + ( 15 * watcher )
+ if(!(ability_flags & AB_PHASE_SHIFTED))
+ log_debug("[src] attempted to shift with [watcher] visible Carbons with a cost of [ability_cost] in a darkness level of [darkness]")
+
var/datum/species/shadekin/SK = species
if(!istype(SK))
- to_chat(src, "Only a shadekin can use that!")
+ to_chat(src, SPAN_WARNING("Only a shadekin can use that!"))
return FALSE
else if(stat)
- to_chat(src, "Can't use that ability in your state!")
+ to_chat(src, SPAN_WARNING("Can't use that ability in your state!"))
return FALSE
else if(shadekin_get_energy() < ability_cost && !(ability_flags & AB_PHASE_SHIFTED))
- to_chat(src, "Not enough energy for that ability!")
+ to_chat(src, SPAN_WARNING("Not enough energy for that ability!"))
return FALSE
if(!(ability_flags & AB_PHASE_SHIFTED))
shadekin_adjust_energy(-ability_cost)
- playsound(src, 'sound/effects/stealthoff.ogg', 75, 1)
+ playsound(src, 'sound/effects/stealthoff.ogg', 75, TRUE)
- var/turf/T = get_turf(src)
if(!T.CanPass(src,T) || loc != T)
- to_chat(src,"You can't use that here!")
+ to_chat(src, SPAN_WARNING("You can't use that here!"))
return FALSE
forceMove(T)
@@ -67,6 +87,7 @@
//Shifting in
if(ability_flags & AB_PHASE_SHIFTED)
ability_flags &= ~AB_PHASE_SHIFTED
+ mouse_opacity = 2
name = real_name
for(var/belly in vore_organs)
var/obj/belly/B = belly
@@ -85,9 +106,12 @@
phaseanim.dir = dir
alpha = 0
custom_emote(1,"phases in!")
+ remove_a_modifier_of_type(/datum/modifier/shadekin_phase_vision)
+ RemoveSightSelf(SEE_THRU)
sleep(5) //The duration of the TP animation
canmove = original_canmove
alpha = initial(alpha)
+
// probably replace with a trait later.
set_movement_type(GROUND)
@@ -98,7 +122,7 @@
var/mob/living/target = pick(potentials)
if(istype(target) && vore_selected)
target.forceMove(vore_selected)
- to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!")
+ to_chat(target, SPAN_WARNING("\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!"))
//Affect nearby lights
var/destroy_lights = 0
@@ -115,16 +139,17 @@
//Shifting out
else
ability_flags |= AB_PHASE_SHIFTED
+ mouse_opacity = 0
custom_emote(1,"phases out!")
name = "Something"
- for(var/belly in vore_organs)
- var/obj/belly/B = belly
+ for(var/obj/belly/B as anything in vore_organs)
B.escapable = FALSE
var/obj/effect/temp_visual/shadekin/phase_out/phaseanim = new /obj/effect/temp_visual/shadekin/phase_out(src.loc)
phaseanim.dir = dir
alpha = 0
+ add_modifier(/datum/modifier/shadekin_phase_vision)
sleep(5)
invisibility = INVISIBILITY_LEVEL_TWO
see_invisible = INVISIBILITY_LEVEL_TWO
@@ -140,46 +165,9 @@
density = FALSE
force_max_speed = TRUE
-/mob/living/carbon/human/UnarmedAttack()
- if(shadekin_phasing_check())
- return FALSE //Nope.
-
- . = ..()
-
-/mob/living/carbon/human/can_fall()
- if(shadekin_phasing_check())
- return FALSE //Nope!
-
- return ..()
-
-/mob/living/carbon/human/zMove(direction)
- if(shadekin_phasing_check())
- var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src)
- if(destination)
- forceMove(destination)
- return TRUE //Yup.
-
- return ..()
-
-/mob/proc/shadekin_phasing_check()
- var/mob/living/simple_mob/shadekin/s_SK = src
- if(istype(s_SK))
- if(s_SK.ability_flags & AB_PHASE_SHIFTED)
- return TRUE
- var/mob/living/carbon/human/h_SK = src
- if(istype(h_SK))
- if(h_SK.ability_flags & AB_PHASE_SHIFTED)
- return TRUE
- return FALSE
-
-/*
-/mob/living/carbon/human/MouseDrop_T(atom/dropping, mob/user)
- if(ability_flags & AB_PHASE_SHIFTED)
- return FALSE //Nope!
-
- return ..()
-*/
-
+/datum/modifier/shadekin_phase_vision
+ name = "Shadekin Phase Vision"
+ vision_flags = SEE_THRU
//////////////////////////
/// REGENERATE OTHER ///
diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_hud.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_hud.dm
index 38b49173258..c6029da09a9 100644
--- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_hud.dm
+++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_hud.dm
@@ -1,24 +1,12 @@
/atom/movable/screen/shadekin
- icon = 'icons/mob/shadekin_hud.dmi'
+ name = "shadekin status"
+ icon = 'icons/screen/hud/common/shadekin.dmi'
invisibility = 101
-/atom/movable/screen/shadekin/darkness
- name = "darkness"
- icon_state = "dark"
- alpha = 150
-
-/atom/movable/screen/shadekin/energy
- name = "energy"
- icon_state = "energy0"
- alpha = 150
-
-
-
-
/atom/movable/screen/movable/ability_master/shadekin
name = "Shadekin Abilities"
icon = 'icons/mob/screen_spells.dmi'
- icon_state = "grey_spell_ready"
+ icon_state = "nano_spell_base"
ability_objects = list()
showing = 0
@@ -27,7 +15,7 @@
screen_loc = ui_spell_master
-/atom/movable/screen/movable/ability_master/shadekin/update_abilities(forced = 0, mob/user) //Different proc to prevent indexing
+/atom/movable/screen/movable/ability_master/shadekin/update_abilities(forced = 0, mob/user) //Different proc to prevent indexing
update_icon()
if(user && user.client)
if(!(src in user.client.screen))
@@ -36,10 +24,10 @@
ability.update_icon(forced)
/atom/movable/screen/ability/verb_based/shadekin
- icon_state = "grey_spell_base"
- background_base_state = "grey"
+ icon_state = "nano_spell_base"
+ background_base_state = "nano"
-/atom/movable/screen/movable/ability_master/proc/add_shadekin_ability(var/object_given, var/verb_given, var/name_given, var/ability_icon_given, var/arguments)
+/atom/movable/screen/movable/ability_master/proc/add_shadekin_ability(object_given, verb_given, name_given, ability_icon_given, arguments)
if(!object_given)
message_admins("ERROR: add_shadekin_ability() was not given an object in its arguments.")
if(!verb_given)
diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_traits.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_traits.dm
new file mode 100644
index 00000000000..5510f283059
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_traits.dm
@@ -0,0 +1,139 @@
+/datum/trait/kintype
+ allowed_species = list(SPECIES_SHADEKIN)
+ var/color = BLUE_EYES
+ name = "Shadekin Blue Adaptation"
+ desc = "Makes your shadekin adapted as a Blue eyed kin! This gives you decreased energy regeneration in darkness, decreased regeneration in the light amd unchanged health!"
+ cost = 0
+ custom_only = FALSE
+ var_changes = list(
+ "total_health" = 100,
+ "energy_light" = 0.5,
+ "energy_dark" = 0.5,
+ "unarmed_types" = list(
+ /datum/unarmed_attack/stomp,
+ /datum/unarmed_attack/kick,
+ /datum/unarmed_attack/claws/shadekin,
+ /datum/unarmed_attack/bite/sharp/shadekin,
+ /datum/unarmed_attack/shadekinharmbap,
+ )
+ )
+
+/datum/trait/kintype/red
+ name = "Shadekin Red Adaptation"
+ color = RED_EYES
+ desc = "Makes your shadekin adapted as a Red eyed kin! This gives you minimal energy regeneration in darkness, moderate regeneration in the light amd increased health!"
+ var_changes = list(
+ "total_health" = 200,
+ "energy_light" = -1,
+ "energy_dark" = 0.1,
+ "unarmed_types" = list(
+ /datum/unarmed_attack/stomp,
+ /datum/unarmed_attack/kick,
+ /datum/unarmed_attack/claws/shadekin,
+ /datum/unarmed_attack/bite/sharp/shadekin,
+ /datum/unarmed_attack/shadekinharmbap
+ )
+ )
+
+/datum/trait/kintype/purple
+ name = "Shadekin Purple Adaptation"
+ color = PURPLE_EYES
+ desc = "Makes your shadekin adapted as a Purple eyed kin! This gives you moderate energy regeneration in darkness, minor degeneration in the light amd increased health!"
+ var_changes = list(
+ "total_health" = 150,
+ "energy_light" = 1,
+ "energy_dark" = -0.5,
+ "unarmed_types" = list(
+ /datum/unarmed_attack/stomp,
+ /datum/unarmed_attack/kick,
+ /datum/unarmed_attack/claws/shadekin,
+ /datum/unarmed_attack/bite/sharp/shadekin,
+ /datum/unarmed_attack/shadekinharmbap
+ )
+ )
+
+/datum/trait/kintype/yellow
+ name = "Shadekin Yellow Adaptation"
+ color = YELLOW_EYES
+ desc = "Makes your shadekin adapted as a Yellow eyed kin! This gives you the highest energy regeneration in darkness, high degeneration in the light amd unchanged health!"
+ var_changes = list(
+ "total_health" = 100,
+ "energy_light" = 3,
+ "energy_dark" = -2,
+ "unarmed_types" = list(
+ /datum/unarmed_attack/stomp,
+ /datum/unarmed_attack/kick,
+ /datum/unarmed_attack/claws/shadekin,
+ /datum/unarmed_attack/bite/sharp/shadekin,
+ /datum/unarmed_attack/shadekinharmbap
+ )
+ )
+
+/datum/trait/kintype/green
+ name = "Shadekin Green Adaptation"
+ color = GREEN_EYES
+ desc = "Makes your shadekin adapted as a Green eyed kin! This gives you high energy regeneration in darkness, minor regeneration in the light amd unchanged health!"
+ var_changes = list(
+ "total_health" = 100,
+ "energy_light" = 2,
+ "energy_dark" = 0.125,
+ "unarmed_types" = list(
+ /datum/unarmed_attack/stomp,
+ /datum/unarmed_attack/kick,
+ /datum/unarmed_attack/claws/shadekin,
+ /datum/unarmed_attack/bite/sharp/shadekin,
+ /datum/unarmed_attack/shadekinharmbap
+ )
+ )
+
+/datum/trait/kintype/orange
+ name = "Shadekin Orange Adaptation"
+ color = ORANGE_EYES
+ desc = "Makes your shadekin adapted as a Orange eyed kin! This gives you minor energy regeneration in darkness, modeate degeneration in the light amd increased health!"
+ var_changes = list(
+ "total_health" = 175,
+ "energy_light" = 0.25,
+ "energy_dark" = -0.5,
+ "unarmed_types" = list(
+ /datum/unarmed_attack/stomp,
+ /datum/unarmed_attack/kick,
+ /datum/unarmed_attack/claws/shadekin,
+ /datum/unarmed_attack/bite/sharp/shadekin,
+ /datum/unarmed_attack/shadekinharmbap
+ )
+ )
+
+/datum/trait/kintype/apply(datum/species/shadekin/S, mob/living/carbon/human/H)
+ ..(S,H)
+ if(color && istype(S)) //Sanity check to see if they're actually a shadekin, otherwise just don't do anything. They shouldn't be able to spawn with the trait.
+ S.kin_type = color
+ switch(color)
+ if(BLUE_EYES)
+ H.shapeshifter_set_eye_color("0000FF")
+ if(RED_EYES)
+ H.shapeshifter_set_eye_color("FF0000")
+ if(GREEN_EYES)
+ H.shapeshifter_set_eye_color("00FF00")
+ if(PURPLE_EYES)
+ H.shapeshifter_set_eye_color("FF00FF")
+ if(YELLOW_EYES)
+ H.shapeshifter_set_eye_color("FFFF00")
+ if(ORANGE_EYES)
+ H.shapeshifter_set_eye_color("FFA500")
+
+
+/datum/unarmed_attack/shadekinharmbap
+ attack_name = "syphon strike"
+ attack_verb = list("hit", "clawed", "slashed", "scratched")
+ attack_sound = 'sound/weapons/slice.ogg'
+ miss_sound = 'sound/weapons/slashmiss.ogg'
+ shredding = FALSE
+
+/datum/unarmed_attack/shadekinharmbap/apply_effects(mob/living/carbon/human/shadekin/user, mob/living/carbon/human/target, armour, attack_damage, zone)
+ ..()
+ if(user == target) //Prevent self attack to gain energy
+ return
+ var/obj/item/organ/internal/brain/shadekin/shade_organ = user.internal_organs_by_name[O_BRAIN]
+ if(!istype(shade_organ))
+ return
+ shade_organ.dark_energy = clamp(shade_organ.dark_energy + attack_damage,0,shade_organ.max_dark_energy) //Convert Damage done to Energy Gained
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 1d8125cc9ee..674c9ae3615 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -70,7 +70,7 @@
/// Used for mob icon generation for non-32x32 species.
var/icon/icon_template
- var/mob_size = MOB_MEDIUM
+ var/mob_size = MOB_MEDIUM
var/show_ssd = "fast asleep"
var/virus_immune
/// Permanent weldervision.
@@ -127,11 +127,11 @@
//! ## Soundy emotey things.
var/scream_verb = "screams"
- var/male_scream_sound = list('sound/voice/screams/sound_voice_scream_scream_m1.ogg', 'sound/voice/screams/sound_voice_scream_scream_m2.ogg')
- var/female_scream_sound = list('sound/voice/screams/sound_voice_scream_scream_f1.ogg', 'sound/voice/screams/sound_voice_scream_scream_f2.ogg', 'sound/voice/screams/sound_voice_scream_scream_f3.ogg')
- var/male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
+ var/male_scream_sound = list('sound/voice/screams/sound_voice_scream_scream_m1.ogg', 'sound/voice/screams/sound_voice_scream_scream_m2.ogg')
+ var/female_scream_sound = list('sound/voice/screams/sound_voice_scream_scream_f1.ogg', 'sound/voice/screams/sound_voice_scream_scream_f2.ogg', 'sound/voice/screams/sound_voice_scream_scream_f3.ogg')
+ var/male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
var/female_cough_sounds = list('sound/effects/mob_effects/f_cougha.ogg','sound/effects/mob_effects/f_coughb.ogg')
- var/male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg'
+ var/male_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg'
var/female_sneeze_sound = 'sound/effects/mob_effects/f_sneeze.ogg'
//! ## Combat vars.
@@ -141,7 +141,7 @@
var/list/unarmed_types = list(
/datum/unarmed_attack,
/datum/unarmed_attack/bite
- )
+ )
/// For empty hand harm-intent attack
var/list/unarmed_attacks = null
/// Physical damage multiplier.
@@ -212,7 +212,7 @@
"You feel chilly.",
"You shiver suddenly.",
"Your chilly flesh stands out in goosebumps."
- )
+ )
//! ## Hot
/// Heat damage level 1 above this point.
@@ -235,7 +235,7 @@
"You feel sweat drip down your neck.",
"You feel uncomfortably warm.",
"Your skin prickles in the heat."
- )
+ )
/// Species will gain this much temperature every second
@@ -330,7 +330,7 @@
O_EYES = /obj/item/organ/internal/eyes,
O_STOMACH = /obj/item/organ/internal/stomach,
O_INTESTINE = /obj/item/organ/internal/intestine
- )
+ )
/// If set, this organ is required for vision. Defaults to "eyes" if the species has them.
var/vision_organ
/// If set, the species will be affected by flashbangs regardless if they have eyes or not, as they see in large areas.
@@ -348,7 +348,7 @@
BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
- )
+ )
/// Used for species that only need to change one or two entries in has_limbs.
//var/list/override_limb_types //Not used yet.
@@ -774,7 +774,7 @@ GLOBAL_LIST_INIT(species_oxygen_tank_by_gas, list(
/datum/species/proc/handle_falling(mob/living/carbon/human/H, atom/hit_atom, damage_min, damage_max, silent, planetary)
return FALSE
-/datum/species/proc/get_offset_overlay_image(var/spritesheet, var/mob_icon, var/mob_state, var/color, var/slot)
+/datum/species/proc/get_offset_overlay_image(spritesheet, mob_icon, mob_state, color, slot)
// If we don't actually need to offset this, don't bother with any of the generation/caching.
if(!spritesheet && equip_adjust.len && equip_adjust[slot] && LAZYLEN(equip_adjust[slot]))
diff --git a/code/modules/mob/living/carbon/human/species/species_getters.dm b/code/modules/mob/living/carbon/human/species/species_getters.dm
index e84c4f00fff..d4668234a1b 100644
--- a/code/modules/mob/living/carbon/human/species/species_getters.dm
+++ b/code/modules/mob/living/carbon/human/species/species_getters.dm
@@ -1,31 +1,31 @@
-/datum/species/proc/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
+/datum/species/proc/get_valid_shapeshifter_forms(mob/living/carbon/human/H)
return list()
-/datum/species/proc/get_additional_examine_text(var/mob/living/carbon/human/H)
+/datum/species/proc/get_additional_examine_text(mob/living/carbon/human/H)
return
-/datum/species/proc/get_tail(var/mob/living/carbon/human/H)
+/datum/species/proc/get_tail(mob/living/carbon/human/H)
return tail
-/datum/species/proc/get_tail_animation(var/mob/living/carbon/human/H)
+/datum/species/proc/get_tail_animation(mob/living/carbon/human/H)
return tail_animation
-/datum/species/proc/get_tail_hair(var/mob/living/carbon/human/H)
+/datum/species/proc/get_tail_hair(mob/living/carbon/human/H)
return tail_hair
-/datum/species/proc/get_blood_mask(var/mob/living/carbon/human/H)
+/datum/species/proc/get_blood_mask(mob/living/carbon/human/H)
return blood_mask
-/datum/species/proc/get_damage_overlays(var/mob/living/carbon/human/H)
+/datum/species/proc/get_damage_overlays(mob/living/carbon/human/H)
return damage_overlays
-/datum/species/proc/get_damage_mask(var/mob/living/carbon/human/H)
+/datum/species/proc/get_damage_mask(mob/living/carbon/human/H)
return damage_mask
-/datum/species/proc/get_examine_name(var/mob/living/carbon/human/H)
+/datum/species/proc/get_examine_name(mob/living/carbon/human/H)
return name
-/datum/species/proc/get_icobase(var/mob/living/carbon/human/H, var/get_deform)
+/datum/species/proc/get_icobase(mob/living/carbon/human/H, get_deform)
return (get_deform ? deform : icobase)
/datum/species/proc/get_station_variant()
@@ -34,25 +34,25 @@
// used for limb caching
// todo: rework limbs and get rid of this, numerical static keys are dumb as fuck,
// limbs should use their own types!
-/datum/species/proc/get_race_key(var/mob/living/carbon/human/H)
+/datum/species/proc/get_race_key(mob/living/carbon/human/H)
return real_race_key(H)
/datum/species/proc/real_race_key(mob/living/carbon/human/H)
return name
-/datum/species/proc/get_bodytype(var/mob/living/carbon/human/H)
+/datum/species/proc/get_bodytype(mob/living/carbon/human/H)
return name
-/datum/species/proc/get_knockout_message(var/mob/living/carbon/human/H)
+/datum/species/proc/get_knockout_message(mob/living/carbon/human/H)
return ((H && H.isSynthetic()) ? "encounters a hardware fault and suddenly reboots!" : knockout_message)
-/datum/species/proc/get_death_message(var/mob/living/carbon/human/H)
+/datum/species/proc/get_death_message(mob/living/carbon/human/H)
if(config_legacy.show_human_death_message)
return ((H && H.isSynthetic()) ? "gives one shrill beep before falling lifeless." : death_message)
else
return "no message"
-/datum/species/proc/get_ssd(var/mob/living/carbon/human/H)
+/datum/species/proc/get_ssd(mob/living/carbon/human/H)
if(H)
if(H.looksSynthetic())
return "flashing a 'system offline' light"
@@ -61,7 +61,7 @@
else
return
-/datum/species/proc/get_blood_colour(var/mob/living/carbon/human/H)
+/datum/species/proc/get_blood_colour(mob/living/carbon/human/H)
if(H)
var/datum/robolimb/company = H.isSynthetic()
if(company)
@@ -69,7 +69,7 @@
else
return blood_color
-/datum/species/proc/get_blood_name(var/mob/living/carbon/human/H)
+/datum/species/proc/get_blood_name(mob/living/carbon/human/H)
if(H)
var/datum/robolimb/company = H.isSynthetic()
if(company)
@@ -77,13 +77,13 @@
else
return blood_name
-/datum/species/proc/get_virus_immune(var/mob/living/carbon/human/H)
+/datum/species/proc/get_virus_immune(mob/living/carbon/human/H)
return ((H && H.isSynthetic()) ? 1 : virus_immune)
-/datum/species/proc/get_flesh_colour(var/mob/living/carbon/human/H)
+/datum/species/proc/get_flesh_colour(mob/living/carbon/human/H)
return ((H && H.isSynthetic()) ? SYNTH_FLESH_COLOUR : flesh_color)
-/datum/species/proc/get_environment_discomfort(var/mob/living/carbon/human/H, var/msg_type)
+/datum/species/proc/get_environment_discomfort(mob/living/carbon/human/H, msg_type)
if(!prob(5))
return
@@ -104,7 +104,7 @@
if(covered)
to_chat(H, "[pick(heat_discomfort_strings)]")
-/datum/species/proc/get_random_name(var/gender)
+/datum/species/proc/get_random_name(gender)
if(!name_language)
if(gender == FEMALE)
return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
@@ -118,12 +118,14 @@
return "unknown"
return species_language.get_random_name(gender)
-/datum/species/proc/get_vision_flags(var/mob/living/carbon/human/H)
+/datum/species/proc/get_vision_flags(mob/living/carbon/human/H)
return vision_flags
-/datum/species/proc/get_wing_hair(var/mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case.
+/datum/species/proc/get_wing_hair(mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case.
return wing_hair //Since the tail has it.
-/datum/species/proc/get_wing(var/mob/living/carbon/human/H)
+
+/datum/species/proc/get_wing(mob/living/carbon/human/H)
return wing
-/datum/species/proc/get_wing_animation(var/mob/living/carbon/human/H)
+
+/datum/species/proc/get_wing_animation(mob/living/carbon/human/H)
return wing_animation
diff --git a/code/modules/mob/living/carbon/human/species/station/adherent.dm b/code/modules/mob/living/carbon/human/species/station/adherent.dm
index da1a6c3d2ba..29ca2df8851 100644
--- a/code/modules/mob/living/carbon/human/species/station/adherent.dm
+++ b/code/modules/mob/living/carbon/human/species/station/adherent.dm
@@ -95,12 +95,12 @@
)
has_organ = list(
- BP_BRAIN = /obj/item/organ/internal/brain/adherent,
- BP_EYES = /obj/item/organ/internal/eyes/adherent,
- BP_JETS = /obj/item/organ/internal/powered/jets,
- BP_FLOAT = /obj/item/organ/internal/powered/float,
- BP_CELL = /obj/item/organ/internal/cell/adherent,
- BP_COOLING_FINS = /obj/item/organ/internal/powered/cooling_fins
+ O_BRAIN = /obj/item/organ/internal/brain/adherent,
+ O_EYES = /obj/item/organ/internal/eyes/adherent,
+ O_JETS = /obj/item/organ/internal/powered/jets,
+ O_FLOAT = /obj/item/organ/internal/powered/float,
+ O_CELL = /obj/item/organ/internal/cell/adherent,
+ O_COOLING_FINS = /obj/item/organ/internal/powered/cooling_fins
)
move_trail = /obj/effect/decal/cleanable/blood/tracks/snake
//If you wanna copy this for your mob, dont
diff --git a/code/modules/mob/living/carbon/human/traits/_trait.dm b/code/modules/mob/living/carbon/human/traits/_trait.dm
index 40631438a80..52b7953e17e 100644
--- a/code/modules/mob/living/carbon/human/traits/_trait.dm
+++ b/code/modules/mob/living/carbon/human/traits/_trait.dm
@@ -2,15 +2,22 @@
var/name
var/desc = "Contact a developer if you see this trait."
- var/cost = 0 // 0 is neutral, negative cost means negative, positive cost means positive.
- var/list/var_changes // A list to apply to the custom species vars.
- var/list/excludes // Store a list of paths of traits to exclude, but done automatically if they change the same vars.
+ /// 0 is neutral, negative cost means negative, positive cost means positive.
+ var/cost = 0
+ /// A list to apply to the custom species vars.
+ var/list/var_changes
+ /// Store a list of paths of traits to exclude, but done automatically if they change the same vars.
+ var/list/excludes
+ /// A list of species that CAN take this trait, use this if only a few species can use it. -shark
+ var/list/allowed_species
+ /// Trait only available for custom species.
+ var/custom_only = TRUE
/// list of TRAIT_*'s to apply, using ROUNDSTART_TRAIT
var/list/traits
-//Proc can be overridden lower to include special changes, make sure to call up though for the vars changes
-/datum/trait/proc/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/// Proc can be overridden lower to include special changes, make sure to call up though for the vars changes
+/datum/trait/proc/apply(datum/species/S, mob/living/carbon/human/H)
SHOULD_CALL_PARENT(TRUE)
for(var/trait in traits)
@@ -25,6 +32,6 @@
S.vars[V] = var_changes[V]
//Similar to the above, but for removing. Probably won't be called often/ever.
-/datum/trait/proc/remove(var/datum/species/S)
+/datum/trait/proc/remove(datum/species/S)
ASSERT(S)
return
diff --git a/code/modules/mob/living/carbon/human/traits/negative.dm b/code/modules/mob/living/carbon/human/traits/negative.dm
index b70c33ce803..f3bd7ff173b 100644
--- a/code/modules/mob/living/carbon/human/traits/negative.dm
+++ b/code/modules/mob/living/carbon/human/traits/negative.dm
@@ -28,7 +28,7 @@
cost = -2
var_changes = list("total_health" = 75)
- apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.setMaxHealth(S.total_health)
@@ -38,7 +38,7 @@
cost = -3 //Teshari HP. This makes the person a lot more suseptable to getting stunned, killed, etc.
var_changes = list("total_health" = 50)
- apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.setMaxHealth(S.total_health)
@@ -215,7 +215,7 @@
excludes = list(
/datum/trait/negative/blind
)
-
+
// todo: organ disability? better way to have mutual exclusion from having all 3
/datum/trait/negative/mute
name = "Mute"
@@ -224,4 +224,3 @@
traits = list(
TRAIT_MUTE
)
-
diff --git a/code/modules/mob/living/carbon/human/traits/neutral.dm b/code/modules/mob/living/carbon/human/traits/neutral.dm
index 533813e3230..a9371fde36c 100644
--- a/code/modules/mob/living/carbon/human/traits/neutral.dm
+++ b/code/modules/mob/living/carbon/human/traits/neutral.dm
@@ -37,6 +37,7 @@
name = "Autohiss (Unathi)"
desc = "You roll your S's and x's"
cost = 0
+ custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"s" = list("ss", "sss", "ssss")
@@ -52,6 +53,7 @@
name = "Autohiss (Tajaran)"
desc = "You roll your R's."
cost = 0
+ custom_only = FALSE
var_changes = list(
autohiss_basic_map = list(
"r" = list("rr", "rrr", "rrrr")
@@ -64,8 +66,9 @@
desc = "Makes you unable to gain nutrition from anything but blood. To compenstate, you get fangs that can be used to drain blood from prey."
cost = 0
var_changes = list("is_vampire" = TRUE) //The verb is given in human.dm
+ custom_only = FALSE
-/datum/trait/neutral/bloodsucker/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/bloodsucker/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/carbon/human/proc/bloodsuck
@@ -74,7 +77,7 @@
desc = "Makes you able to gain nutrition from draining prey in your grasp."
cost = 0
-/datum/trait/neutral/succubus_drain/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/succubus_drain/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/carbon/human/proc/succubus_drain
H.verbs |= /mob/living/carbon/human/proc/succubus_drain_finalize
@@ -84,6 +87,7 @@
name = "Vetalan / Vampiric"
desc = "Vampires, officially known as the Vetalan, are weaker to burns, bright lights, and must consume blood to survive. To this end, they can see near-perfectly in the darkness, possess sharp, numbing fangs, and anti-septic saliva."
cost = 0
+ custom_only = FALSE
var_changes = list(
"is_vampire" = TRUE,
"darksight" = 7,
@@ -92,7 +96,7 @@
"burn_mod" = 1.25,
"unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws, /datum/unarmed_attack/bite/sharp, /datum/unarmed_attack/bite/sharp/numbing))
-/datum/trait/neutral/vampire/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/vampire/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/carbon/human/proc/bloodsuck
H.verbs |= /mob/living/carbon/human/proc/lick_wounds
@@ -100,9 +104,10 @@
/datum/trait/neutral/hard_vore
name = "Brutal Predation"
desc = "Allows you to tear off limbs & tear out internal organs."
- cost = 0 //I would make this cost a point, since it has some in game value, but there are easier, less damaging ways to perform the same functions.
+ cost = 0
+ custom_only = FALSE
-/datum/trait/neutral/hard_vore/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/hard_vore/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/shred_limb
@@ -110,9 +115,10 @@
name = "Trash Can"
desc = "Allows you to dispose of some garbage on the go instead of having to look for a bin or littering like an animal."
cost = 0
+ custom_only = FALSE
var_changes = list("trashcan" = 1)
-/datum/trait/neutral/trashcan/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/trashcan/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/eat_trash
@@ -120,27 +126,30 @@
name = "Glowing Eyes"
desc = "Your eyes show up above darkness. SPOOKY! And kinda edgy too."
cost = 0
+ custom_only = FALSE
var_changes = list("has_glowing_eyes" = 1)
/datum/trait/neutral/glowing_body
name = "Glowing Body"
desc = "Your body glows about as much as a PDA light! Settable color and toggle in Abilities tab ingame."
cost = 0
-/datum/trait/neutral/glowing_body/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+ custom_only = FALSE
+
+/datum/trait/neutral/glowing_body/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/glow_toggle
H.verbs |= /mob/living/proc/glow_color
-// Body shape traits
+//! ## Body shape traits
/datum/trait/neutral/taller
name = "Taller"
desc = "Your body is taller than average."
cost = 0
-// custom_only = FALSE
+ custom_only = FALSE
var_changes = list("icon_scale_y" = 1.09)
excludes = list(/datum/trait/neutral/tall, /datum/trait/neutral/short, /datum/trait/neutral/shorter)
-/datum/trait/neutral/taller/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/taller/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.update_transform()
@@ -148,11 +157,11 @@
name = "Tall"
desc = "Your body is a bit taller than average."
cost = 0
-// custom_only = FALSE
+ custom_only = FALSE
var_changes = list("icon_scale_y" = 1.05)
excludes = list(/datum/trait/neutral/taller, /datum/trait/neutral/short, /datum/trait/neutral/shorter)
-/datum/trait/neutral/tall/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/tall/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.update_transform()
@@ -160,11 +169,11 @@
name = "Short"
desc = "Your body is a bit shorter than average."
cost = 0
-// custom_only = FALSE
+ custom_only = FALSE
var_changes = list("icon_scale_y" = 0.95)
excludes = list(/datum/trait/neutral/taller, /datum/trait/neutral/tall, /datum/trait/neutral/shorter)
-/datum/trait/neutral/short/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/short/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.update_transform()
@@ -172,11 +181,11 @@
name = "Shorter"
desc = "You are shorter than average."
cost = 0
-// custom_only = FALSE
+ custom_only = FALSE
var_changes = list("icon_scale_y" = 0.915)
excludes = list(/datum/trait/neutral/taller, /datum/trait/neutral/tall, /datum/trait/neutral/short)
-/datum/trait/neutral/shorter/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/shorter/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.update_transform()
@@ -184,11 +193,11 @@
name = "Overweight"
desc = "You are heavier than average."
cost = 0
-// custom_only = FALSE
+ custom_only = FALSE
var_changes = list("icon_scale_x" = 1.054)
excludes = list(/datum/trait/neutral/obese, /datum/trait/neutral/thin, /datum/trait/neutral/thinner)
-/datum/trait/neutral/fat/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/fat/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.update_transform()
@@ -196,11 +205,11 @@
name = "Obese"
desc = "You are much heavier than average."
cost = 0
-// custom_only = FALSE
+ custom_only = FALSE
var_changes = list("icon_scale_x" = 1.095)
excludes = list(/datum/trait/neutral/fat, /datum/trait/neutral/thin, /datum/trait/neutral/thinner)
-/datum/trait/neutral/obese/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/obese/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.update_transform()
@@ -208,11 +217,11 @@
name = "Thin"
desc = "You are skinnier than average."
cost = 0
-// custom_only = FALSE
+ custom_only = FALSE
var_changes = list("icon_scale_x" = 0.945)
excludes = list(/datum/trait/neutral/fat, /datum/trait/neutral/obese, /datum/trait/neutral/thinner)
-/datum/trait/neutral/thin/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/thin/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.update_transform()
@@ -220,11 +229,11 @@
name = "Very Thin"
desc = "You are much skinnier than average."
cost = 0
-// custom_only = FALSE
+ custom_only = FALSE
var_changes = list("icon_scale_x" = 0.905)
excludes = list(/datum/trait/neutral/fat, /datum/trait/neutral/obese, /datum/trait/neutral/thin)
-/datum/trait/neutral/thinner/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/thinner/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.update_transform()
@@ -232,8 +241,9 @@
name = "Antiseptic Saliva"
desc = "Your saliva has especially strong antiseptic properties that can be used to heal small wounds."
cost = 0
+ custom_only = FALSE
-/datum/trait/neutral/antiseptic_saliva/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/antiseptic_saliva/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/carbon/human/proc/lick_wounds
@@ -242,6 +252,6 @@
desc = "Lets you shift sizes by yourself. Remember that abusing size mechanics is against the rules!"
cost = 0
-/datum/trait/neutral/size_change/apply(var/datum/species/S,var/mob/living/carbon/human/H)
+/datum/trait/neutral/size_change/apply(datum/species/S, mob/living/carbon/human/H)
..(S,H)
H.verbs |= /mob/living/proc/set_size
diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm
index df24c54e53f..989746c2a59 100644
--- a/code/modules/mob/living/life.dm
+++ b/code/modules/mob/living/life.dm
@@ -190,10 +190,18 @@
return TRUE
/mob/living/proc/update_sight()
+ SEND_SIGNAL(src, COMSIG_MOB_UPDATE_SIGHT)
if(!seedarkness)
- see_invisible = SEE_INVISIBLE_NOLIGHTING
+ SetSeeInvisibleSelf(SEE_INVISIBLE_NOLIGHTING)
else
- see_invisible = initial(see_invisible)
+ SetSeeInvisibleSelf(initial(see_invisible))
+
+ sight = initial(sight)
+
+ for(var/datum/modifier/M in modifiers)
+ if(!isnull(M.vision_flags))
+ AddSightSelf(M.vision_flags)
+
return
/mob/living/proc/handle_hud_icons()
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army.dm
index 8cd7a7f088f..4c75b5e43ed 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army.dm
@@ -112,15 +112,13 @@
icon_dead = "mouse_[rank]_dead"
icon_rest = "mouse_[rank]_sleep"
-/mob/living/simple_mob/animal/space/mouse_army/Crossed(AM as mob|obj)
- var/mob/SK = AM
- if(istype(SK))
- if(SK.shadekin_phasing_check())
- return
- if( ishuman(AM) )
+/mob/living/simple_mob/animal/space/mouse_army/Crossed(atom/movable/AM as mob|obj)
+ if(AM.is_incorporeal())
+ return
+ if(ishuman(AM))
if(!stat)
var/mob/M = AM
- M.visible_message("[icon2html(thing = src, target = world)] Squeek!")
+ M.visible_message(SPAN_NOTICE("[icon2html(thing = src, target = world)] Squeek!"))
playsound(src, 'sound/effects/mouse_squeak.ogg', 35, 1)
..()
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm
index ca1a9bebe81..8825103b197 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm
@@ -19,6 +19,7 @@
//Shifting in
if(ability_flags & AB_PHASE_SHIFTED)
ability_flags &= ~AB_PHASE_SHIFTED
+ mouse_opacity = 2
name = real_name
for(var/belly in vore_organs)
var/obj/belly/B = belly
@@ -70,6 +71,7 @@
//Shifting out
else
ability_flags |= AB_PHASE_SHIFTED
+ mouse_opacity = 0
custom_emote(1,"phases out!")
real_name = name
name = "Something"
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm
index c2c43161e02..e29a3828ae8 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/shadekin.dm
@@ -6,7 +6,7 @@
icon_state = "map_example"
icon_living = "map_example"
faction = "shadekin"
- ui_icons = 'icons/mob/shadekin_hud.dmi'
+ ui_icons = 'icons/screen/hud/common/shadekin.dmi'
mob_class = MOB_CLASS_HUMANOID
mob_bump_flag = HUMAN
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index a0a6d859247..c163efc499b 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -299,3 +299,16 @@
/// A mock client, provided by tests and friends
var/datum/client_interface/mock_client
+
+//! ## Virgo Defines
+ /// Do I have the HUD enabled?
+ var/vantag_hud = FALSE
+ /// Allows flight.
+ var/flying = FALSE
+ /// For holding onto a temporary form.
+ var/mob/temporary_form
+ /// Time of client loss, set by Logout(), for timekeeping.
+ var/disconnect_time = null
+
+ var/atom/movable/screen/shadekin/shadekin_display = null
+ var/atom/movable/screen/xenochimera/danger_level/xenochimera_danger_display = null
diff --git a/code/modules/mob/mob_defines_vr.dm b/code/modules/mob/mob_defines_vr.dm
deleted file mode 100644
index d2238bd03d3..00000000000
--- a/code/modules/mob/mob_defines_vr.dm
+++ /dev/null
@@ -1,10 +0,0 @@
-/mob
- var/vantag_hud = 0 // Do I have the HUD enabled?
- var/flying = 0 // Allows flight
- var/mob/temporary_form // For holding onto a temporary form
-
- var/disconnect_time = null //Time of client loss, set by Logout(), for timekeeping
-
- var/atom/movable/screen/shadekin/darkness/shadekin_dark_display = null
- var/atom/movable/screen/shadekin/energy/shadekin_energy_display = null
- var/atom/movable/screen/xenochimera/danger_level/xenochimera_danger_display = null
diff --git a/code/modules/organs/internal/adherent.dm b/code/modules/organs/internal/adherent.dm
index 2ffb12e4c71..1df735f5a7a 100644
--- a/code/modules/organs/internal/adherent.dm
+++ b/code/modules/organs/internal/adherent.dm
@@ -117,7 +117,7 @@
name = "levitation plate"
desc = "A broad, flat disc of exotic matter. Slick to the touch."
action_button_name = "Toggle Antigravity"
- organ_tag = BP_FLOAT
+ organ_tag = O_FLOAT
parent_organ = BP_GROIN
robotic = ORGAN_CRYSTAL
icon_state = "float"
@@ -156,7 +156,7 @@
gender = PLURAL
desc = "A lacy filligree of heat-radiating fins."
action_button_name = "Toggle Cooling"
- organ_tag = BP_COOLING_FINS
+ organ_tag = O_COOLING_FINS
parent_organ = BP_GROIN
status = ORGAN_CRYSTAL
icon_state = "fins"
diff --git a/code/modules/organs/subtypes/shadekin.dm b/code/modules/organs/subtypes/shadekin.dm
index c7594dcf950..9d22d0e57d7 100644
--- a/code/modules/organs/subtypes/shadekin.dm
+++ b/code/modules/organs/subtypes/shadekin.dm
@@ -5,6 +5,9 @@
var/max_dark_energy = 100
var/dark_energy_infinite = FALSE
+
+//! Blackeyed limbs.
+
/obj/item/organ/external/chest/crewkin
min_broken_damage = 20
diff --git a/icons/mob/shadekin_hud.dmi b/icons/mob/shadekin_hud.dmi
deleted file mode 100644
index a1340290e19..00000000000
Binary files a/icons/mob/shadekin_hud.dmi and /dev/null differ
diff --git a/icons/screen/hud/common/shadekin.dmi b/icons/screen/hud/common/shadekin.dmi
new file mode 100644
index 00000000000..fd635a202cf
Binary files /dev/null and b/icons/screen/hud/common/shadekin.dmi differ