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