diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 0d10e33b49..1c0d5f2393 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -43,6 +43,11 @@ var/global/list/facial_hair_styles_male_list = list() var/global/list/facial_hair_styles_female_list = list() var/global/list/skin_styles_female_list = list() //unused var/global/list/body_marking_styles_list = list() //stores /datum/sprite_accessory/marking indexed by name +var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type +var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type +var/global/list/wing_styles_list = list() // Stores /datum/sprite_accessory/wing indexed by type + +GLOBAL_LIST_INIT(custom_species_bases, new) // Species that can be used for a Custom Species icon base //Underwear var/datum/category_collection/underwear/global_underwear = new() @@ -214,6 +219,23 @@ GLOBAL_LIST_EMPTY(mannequins) var/decl/closet_appearance/app = new T() GLOB.closet_appearances[T] = app + paths = typesof(/datum/sprite_accessory/ears) - /datum/sprite_accessory/ears + for(var/path in paths) + var/obj/item/clothing/head/instance = new path() + ear_styles_list[path] = instance + + // Custom Tails + paths = typesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail - /datum/sprite_accessory/tail/taur + for(var/path in paths) + var/datum/sprite_accessory/tail/instance = new path() + tail_styles_list[path] = instance + + // Custom Wings + paths = typesof(/datum/sprite_accessory/wing) - /datum/sprite_accessory/wing + for(var/path in paths) + var/datum/sprite_accessory/wing/instance = new path() + wing_styles_list[path] = instance + // VOREStation Add - Vore Modes! paths = typesof(/datum/digest_mode) for(var/T in paths) @@ -221,6 +243,41 @@ GLOBAL_LIST_EMPTY(mannequins) GLOB.digest_modes[DM.id] = DM // VOREStation Add End +/* + // Custom species traits + paths = typesof(/datum/trait) - /datum/trait + for(var/path in paths) + var/datum/trait/instance = new path() + if(!instance.name) + continue //A prototype or something + var/cost = instance.cost + traits_costs[path] = cost + all_traits[path] = instance + switch(cost) + if(-INFINITY to -0.1) + negative_traits[path] = instance + if(0) + neutral_traits[path] = instance + if(0.1 to INFINITY) + positive_traits[path] = instance +*/ + + // Custom species icon bases + var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //VOREStation Edit + var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID) //VOREStation Edit + for(var/species_name in GLOB.playable_species) + if(species_name in blacklisted_icons) + continue + var/datum/species/S = GLOB.all_species[species_name] + if(S.spawn_flags & SPECIES_IS_WHITELISTED) + continue + GLOB.custom_species_bases += species_name + for(var/species_name in whitelisted_icons) + GLOB.custom_species_bases += species_name + + return 1 // Hooks must return 1 + + return 1 /* // Uncomment to debug chemical reaction list. diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index d45406225c..dd75d8a62e 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -2,10 +2,7 @@ * VOREStation global lists */ -var/global/list/ear_styles_list = list() // Stores /datum/sprite_accessory/ears indexed by type var/global/list/hair_accesories_list= list()// Stores /datum/sprite_accessory/hair_accessory indexed by type -var/global/list/tail_styles_list = list() // Stores /datum/sprite_accessory/tail indexed by type -var/global/list/wing_styles_list = list() // Stores /datum/sprite_accessory/wing indexed by type var/global/list/negative_traits = list() // Negative custom species traits, indexed by path var/global/list/neutral_traits = list() // Neutral custom species traits, indexed by path var/global/list/everyone_traits = list() // Neutral traits available to all species, indexed by path @@ -16,8 +13,6 @@ var/global/list/active_ghost_pods = list() var/global/list/sensorpreflist = list("Off", "Binary", "Vitals", "Tracking", "No Preference") //TFF 5/8/19 - Suit Sensors global list -var/global/list/custom_species_bases = list() // Species that can be used for a Custom Species icon base - //stores numeric player size options indexed by name var/global/list/player_sizes_list = list( "Macro" = RESIZE_HUGE, @@ -481,24 +476,6 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, /hook/startup/proc/init_vore_datum_ref_lists() var/paths - // Custom Ears - paths = typesof(/datum/sprite_accessory/ears) - /datum/sprite_accessory/ears - for(var/path in paths) - var/obj/item/clothing/head/instance = new path() - ear_styles_list[path] = instance - - // Custom Tails - paths = typesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail - /datum/sprite_accessory/tail/taur - for(var/path in paths) - var/datum/sprite_accessory/tail/instance = new path() - tail_styles_list[path] = instance - - // Custom Wings - paths = typesof(/datum/sprite_accessory/wing) - /datum/sprite_accessory/wing - for(var/path in paths) - var/datum/sprite_accessory/wing/instance = new path() - wing_styles_list[path] = instance - // Custom Hair Accessories paths = typesof(/datum/sprite_accessory/hair_accessory) - /datum/sprite_accessory/hair_accessory for(var/path in paths) @@ -524,19 +501,6 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, if(0.1 to INFINITY) positive_traits[path] = instance - // Custom species icon bases - var/list/blacklisted_icons = list(SPECIES_CUSTOM,SPECIES_PROMETHEAN) //Just ones that won't work well. - var/list/whitelisted_icons = list(SPECIES_FENNEC,SPECIES_XENOHYBRID) //Include these anyway - for(var/species_name in GLOB.playable_species) - if(species_name in blacklisted_icons) - continue - var/datum/species/S = GLOB.all_species[species_name] - if(S.spawn_flags & SPECIES_IS_WHITELISTED) - continue - custom_species_bases += species_name - for(var/species_name in whitelisted_icons) - custom_species_bases += species_name - // Weaver recipe stuff paths = typesof(/datum/weaver_recipe/structure) - /datum/weaver_recipe/structure for(var/path in paths) diff --git a/code/_macros.dm b/code/_macros.dm index 4796f93b47..33bdf30ceb 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -37,4 +37,7 @@ #define random_id(key,min_id,max_id) uniqueness_repository.Generate(/datum/uniqueness_generator/id_random, key, min_id, max_id) -#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } \ No newline at end of file +#define ARGS_DEBUG log_debug("[__FILE__] - [__LINE__]") ; for(var/arg in args) { log_debug("\t[log_info_line(arg)]") } + +#define isitem(A) istype(A, /obj/item) +#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/_macros_vr.dm b/code/_macros_vr.dm index 6a2134fb71..2eecbe69ed 100644 --- a/code/_macros_vr.dm +++ b/code/_macros_vr.dm @@ -1,3 +1 @@ #define isbelly(A) istype(A, /obj/belly) -#define isitem(A) istype(A, /obj/item) -#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) diff --git a/code/datums/outfits/jobs/security.dm b/code/datums/outfits/jobs/security.dm index a5e058ca9c..8260d346b7 100644 --- a/code/datums/outfits/jobs/security.dm +++ b/code/datums/outfits/jobs/security.dm @@ -40,7 +40,7 @@ //VOREStation Edit - More cyberpunky /decl/hierarchy/outfit/job/security/detective/forensic name = OUTFIT_JOB_NAME("Forensic technician") - head = /obj/item/clothing/head/helmet/detective_alt + head = null suit = /datum/gear/uniform/detective_alt2 uniform = /obj/item/clothing/under/det //VOREStation Edit End diff --git a/code/datums/supplypacks/recreation_vr.dm b/code/datums/supplypacks/recreation_vr.dm index 5c2266523f..db81cd2061 100644 --- a/code/datums/supplypacks/recreation_vr.dm +++ b/code/datums/supplypacks/recreation_vr.dm @@ -20,7 +20,7 @@ /obj/item/clothing/suit/straight_jacket, /obj/item/weapon/handcuffs/legcuffs/fuzzy, /obj/item/weapon/melee/fluff/holochain/mass, - /obj/item/weapon/material/twohanded/fluff/riding_crop, + /obj/item/weapon/material/twohanded/riding_crop, /obj/item/clothing/under/fluff/latexmaid ) containertype = /obj/structure/closet/crate diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7d30b4b6a6..94121f3b65 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -786,7 +786,7 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. drop_sound = 'sound/items/drop/device.ogg' //Worn icon generation for on-mob sprites -/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) //VOREStation edit - add 'clip mask' argument. +/obj/item/proc/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer,var/icon/clip_mask = null) //Get the required information about the base icon var/icon/icon2use = get_worn_icon_file(body_type = body_type, slot_name = slot_name, default_icon = default_icon, inhands = inhands) var/state2use = get_worn_icon_state(slot_name = slot_name) @@ -816,6 +816,9 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. if(istype(clip_mask)) //VOREStation Edit - For taur bodies/tails clipping off parts of uniforms and suits. standing.filters += filter(type = "alpha", icon = clip_mask) + if(istype(clip_mask)) //For taur bodies/tails clipping off parts of uniforms and suits. + standing.filters += filter(type = "alpha", icon = clip_mask) + //Apply any special features if(!inhands) apply_blood(standing) //Some items show blood when bloodied diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index e8af0c6a5b..ec8ce78efb 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -177,4 +177,15 @@ default_material = "DEFAULT_WALL_MATERIAL" fragile = 0 sharp = 1 - edge = 0 \ No newline at end of file + edge = 0 + +/obj/item/weapon/material/twohanded/riding_crop + name = "riding crop" + desc = "A rod, a little over a foot long with a widened grip and a thick, leather patch at the end. Used since the dawn of the West to control animals." + force_divisor = 0.05 //Required in order for the X attacks Y message to pop up. + unwielded_force_divisor = 1 // One here, too. + applies_material_colour = 1 + unbreakable = 1 + base_icon = "riding_crop" + icon_state = "riding_crop0" + attack_verb = list("cropped","spanked","swatted","smacked","peppered") diff --git a/code/game/objects/items/weapons/material/twohanded_vr.dm b/code/game/objects/items/weapons/material/twohanded_vr.dm new file mode 100644 index 0000000000..f21738dd80 --- /dev/null +++ b/code/game/objects/items/weapons/material/twohanded_vr.dm @@ -0,0 +1,9 @@ +//1R1S: Malady Blanche +/obj/item/weapon/material/twohanded/riding_crop/malady + name = "Malady's riding crop" + icon = 'icons/vore/custom_items_vr.dmi' + item_icons = list( + slot_l_hand_str = 'icons/vore/custom_items_left_hand_vr.dmi', + slot_r_hand_str = 'icons/vore/custom_items_right_hand_vr.dmi', + ) + desc = "An infernum made riding crop with Malady Blanche engraved in the shaft. It's a little worn from how many butts it has spanked." diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 7cbc67735e..6236b12d07 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -6,6 +6,37 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/icon/bgstate = "000" var/list/bgstate_options = list("000", "midgrey", "FFF", "white", "steel", "techmaint", "dark", "plating", "reinforced") + var/ear_style // Type of selected ear style + var/r_ears = 30 // Ear color. + var/g_ears = 30 // Ear color + var/b_ears = 30 // Ear color + var/r_ears2 = 30 // Ear extra color. + var/g_ears2 = 30 // Ear extra color + var/b_ears2 = 30 // Ear extra color + var/r_ears3 = 30 // Ear tertiary color. + var/g_ears3 = 30 // Ear tertiary color + var/b_ears3 = 30 // Ear tertiary color + var/tail_style // Type of selected tail style + var/r_tail = 30 // Tail/Taur color + var/g_tail = 30 // Tail/Taur color + var/b_tail = 30 // Tail/Taur color + var/r_tail2 = 30 // For extra overlay. + var/g_tail2 = 30 // For extra overlay. + var/b_tail2 = 30 // For extra overlay. + var/r_tail3 = 30 // For tertiary overlay. + var/g_tail3 = 30 // For tertiary overlay. + var/b_tail3 = 30 // For tertiary overlay. + var/wing_style // Type of selected wing style + var/r_wing = 30 // Wing color + var/g_wing = 30 // Wing color + var/b_wing = 30 // Wing color + var/r_wing2 = 30 // Wing extra color + var/g_wing2 = 30 // Wing extra color + var/b_wing2 = 30 // Wing extra color + var/r_wing3 = 30 // Wing tertiary color + var/g_wing3 = 30 // Wing tertiary color + var/b_wing3 = 30 // Wing tertiary color + /datum/category_item/player_setup_item/general/body name = "Body" sort_order = 3 @@ -43,6 +74,36 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O S["synth_markings"] >> pref.synth_markings S["bgstate"] >> pref.bgstate S["body_descriptors"] >> pref.body_descriptors + S["ear_style"] >> pref.ear_style + S["r_ears"] >> pref.r_ears + S["g_ears"] >> pref.g_ears + S["b_ears"] >> pref.b_ears + S["r_ears2"] >> pref.r_ears2 + S["g_ears2"] >> pref.g_ears2 + S["b_ears2"] >> pref.b_ears2 + S["r_ears3"] >> pref.r_ears3 + S["g_ears3"] >> pref.g_ears3 + S["b_ears3"] >> pref.b_ears3 + S["tail_style"] >> pref.tail_style + S["r_tail"] >> pref.r_tail + S["g_tail"] >> pref.g_tail + S["b_tail"] >> pref.b_tail + S["r_tail2"] >> pref.r_tail2 + S["g_tail2"] >> pref.g_tail2 + S["b_tail2"] >> pref.b_tail2 + S["r_tail3"] >> pref.r_tail3 + S["g_tail3"] >> pref.g_tail3 + S["b_tail3"] >> pref.b_tail3 + S["wing_style"] >> pref.wing_style + S["r_wing"] >> pref.r_wing + S["g_wing"] >> pref.g_wing + S["b_wing"] >> pref.b_wing + S["r_wing2"] >> pref.r_wing2 + S["g_wing2"] >> pref.g_wing2 + S["b_wing2"] >> pref.b_wing2 + S["r_wing3"] >> pref.r_wing3 + S["g_wing3"] >> pref.g_wing3 + S["b_wing3"] >> pref.b_wing3 S["Wingdings"] >> pref.wingdings //YWadd start S["colorblind_mono"] >> pref.colorblind_mono S["colorblind_vulp"] >> pref.colorblind_vulp @@ -82,6 +143,36 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O S["synth_markings"] << pref.synth_markings S["bgstate"] << pref.bgstate S["body_descriptors"] << pref.body_descriptors + S["ear_style"] << pref.ear_style + S["r_ears"] << pref.r_ears + S["g_ears"] << pref.g_ears + S["b_ears"] << pref.b_ears + S["r_ears2"] << pref.r_ears2 + S["g_ears2"] << pref.g_ears2 + S["b_ears2"] << pref.b_ears2 + S["r_ears3"] << pref.r_ears3 + S["g_ears3"] << pref.g_ears3 + S["b_ears3"] << pref.b_ears3 + S["tail_style"] << pref.tail_style + S["r_tail"] << pref.r_tail + S["g_tail"] << pref.g_tail + S["b_tail"] << pref.b_tail + S["r_tail2"] << pref.r_tail2 + S["g_tail2"] << pref.g_tail2 + S["b_tail2"] << pref.b_tail2 + S["r_tail3"] << pref.r_tail3 + S["g_tail3"] << pref.g_tail3 + S["b_tail3"] << pref.b_tail3 + S["wing_style"] << pref.wing_style + S["r_wing"] << pref.r_wing + S["g_wing"] << pref.g_wing + S["b_wing"] << pref.b_wing + S["r_wing2"] << pref.r_wing2 + S["g_wing2"] << pref.g_wing2 + S["b_wing2"] << pref.b_wing2 + S["r_wing3"] << pref.r_wing3 + S["g_wing3"] << pref.g_wing3 + S["b_wing3"] << pref.b_wing3 S["Wingdings"] << pref.wingdings //YWadd start S["colorblind_mono"] << pref.colorblind_mono S["colorblind_vulp"] << pref.colorblind_vulp @@ -120,6 +211,49 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O if(!pref.bgstate || !(pref.bgstate in pref.bgstate_options)) pref.bgstate = "000" + pref.r_ears = sanitize_integer(pref.r_ears, 0, 255, initial(pref.r_ears)) + pref.g_ears = sanitize_integer(pref.g_ears, 0, 255, initial(pref.g_ears)) + pref.b_ears = sanitize_integer(pref.b_ears, 0, 255, initial(pref.b_ears)) + pref.r_ears2 = sanitize_integer(pref.r_ears2, 0, 255, initial(pref.r_ears2)) + pref.g_ears2 = sanitize_integer(pref.g_ears2, 0, 255, initial(pref.g_ears2)) + pref.b_ears2 = sanitize_integer(pref.b_ears2, 0, 255, initial(pref.b_ears2)) + pref.r_ears3 = sanitize_integer(pref.r_ears3, 0, 255, initial(pref.r_ears3)) + pref.g_ears3 = sanitize_integer(pref.g_ears3, 0, 255, initial(pref.g_ears3)) + pref.b_ears3 = sanitize_integer(pref.b_ears3, 0, 255, initial(pref.b_ears3)) + pref.r_tail = sanitize_integer(pref.r_tail, 0, 255, initial(pref.r_tail)) + pref.g_tail = sanitize_integer(pref.g_tail, 0, 255, initial(pref.g_tail)) + pref.b_tail = sanitize_integer(pref.b_tail, 0, 255, initial(pref.b_tail)) + pref.r_tail2 = sanitize_integer(pref.r_tail2, 0, 255, initial(pref.r_tail2)) + pref.g_tail2 = sanitize_integer(pref.g_tail2, 0, 255, initial(pref.g_tail2)) + pref.b_tail2 = sanitize_integer(pref.b_tail2, 0, 255, initial(pref.b_tail2)) + pref.r_tail3 = sanitize_integer(pref.r_tail3, 0, 255, initial(pref.r_tail3)) + pref.g_tail3 = sanitize_integer(pref.g_tail3, 0, 255, initial(pref.g_tail3)) + pref.b_tail3 = sanitize_integer(pref.b_tail3, 0, 255, initial(pref.b_tail3)) + pref.r_wing = sanitize_integer(pref.r_wing, 0, 255, initial(pref.r_wing)) + pref.g_wing = sanitize_integer(pref.g_wing, 0, 255, initial(pref.g_wing)) + pref.b_wing = sanitize_integer(pref.b_wing, 0, 255, initial(pref.b_wing)) + pref.r_wing2 = sanitize_integer(pref.r_wing2, 0, 255, initial(pref.r_wing2)) + pref.g_wing2 = sanitize_integer(pref.g_wing2, 0, 255, initial(pref.g_wing2)) + pref.b_wing2 = sanitize_integer(pref.b_wing2, 0, 255, initial(pref.b_wing2)) + pref.r_wing3 = sanitize_integer(pref.r_wing3, 0, 255, initial(pref.r_wing3)) + pref.g_wing3 = sanitize_integer(pref.g_wing3, 0, 255, initial(pref.g_wing3)) + pref.b_wing3 = sanitize_integer(pref.b_wing3, 0, 255, initial(pref.b_wing3)) + if(pref.ear_style) + pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style)) + var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style] + if(temp_ear_style.apply_restrictions && (!(pref.species in temp_ear_style.species_allowed))) + pref.ear_style = initial(pref.ear_style) + if(pref.tail_style) + pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style)) + var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style] + if(temp_tail_style.apply_restrictions && (!(pref.species in temp_tail_style.species_allowed))) + pref.tail_style = initial(pref.tail_style) + if(pref.wing_style) + pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style)) + var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style] + if(temp_wing_style.apply_restrictions && (!(pref.species in temp_wing_style.species_allowed))) + pref.wing_style = initial(pref.wing_style) + // Moved from /datum/preferences/proc/copy_to() /datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character) // Copy basic values @@ -157,6 +291,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O character.r_ears2 = pref.r_ears2 character.b_ears2 = pref.b_ears2 character.g_ears2 = pref.g_ears2 + character.r_ears3 = pref.r_ears3 + character.b_ears3 = pref.b_ears3 + character.g_ears3 = pref.g_ears3 character.tail_style = tail_styles_list[pref.tail_style] character.r_tail = pref.r_tail character.b_tail = pref.b_tail @@ -164,6 +301,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O character.r_tail2 = pref.r_tail2 character.b_tail2 = pref.b_tail2 character.g_tail2 = pref.g_tail2 + character.r_tail3 = pref.r_tail3 + character.b_tail3 = pref.b_tail3 + character.g_tail3 = pref.g_tail3 character.wing_style = wing_styles_list[pref.wing_style] character.r_wing = pref.r_wing character.b_wing = pref.b_wing @@ -171,6 +311,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O character.r_wing2 = pref.r_wing2 character.b_wing2 = pref.b_wing2 character.g_wing2 = pref.g_wing2 + character.r_wing3 = pref.r_wing3 + character.b_wing3 = pref.b_wing3 + character.g_wing3 = pref.g_wing3 character.set_gender( pref.biological_gender) if(pref.species == "Grey")//YWadd START character.wingdings = pref.wingdings @@ -399,6 +542,62 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "
Body Color
" . += "Change Color [color_square(pref.r_skin, pref.g_skin, pref.b_skin)]
" + . += "

Genetics Settings

" + + var/ear_display = "Normal" + if(pref.ear_style && (pref.ear_style in ear_styles_list)) + var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style] + ear_display = instance.name + + else if(pref.ear_style) + ear_display = "REQUIRES UPDATE" + . += "Ears
" + . += " Style: [ear_display]
" + if(ear_styles_list[pref.ear_style]) + var/datum/sprite_accessory/ears/ear = ear_styles_list[pref.ear_style] + if(ear.do_colouration) + . += "Change Color [color_square(pref.r_ears, pref.g_ears, pref.b_ears)]
" + if(ear.extra_overlay) + . += "Change Secondary Color [color_square(pref.r_ears2, pref.g_ears2, pref.b_ears2)]
" + if(ear.extra_overlay2) + . += "Change Tertiary Color [color_square(pref.r_ears3, pref.g_ears3, pref.b_ears3)]
" + + var/tail_display = "Normal" + if(pref.tail_style && (pref.tail_style in tail_styles_list)) + var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style] + tail_display = instance.name + else if(pref.tail_style) + tail_display = "REQUIRES UPDATE" + . += "Tail
" + . += " Style: [tail_display]
" + + if(tail_styles_list[pref.tail_style]) + var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style] + if(T.do_colouration) + . += "Change Color [color_square(pref.r_tail, pref.g_tail, pref.b_tail)]
" + if(T.extra_overlay) + . += "Change Secondary Color [color_square(pref.r_tail2, pref.g_tail2, pref.b_tail2)]
" + if(T.extra_overlay2) + . += "Change Tertiary Color [color_square(pref.r_tail3, pref.g_tail3, pref.b_tail3)]
" + + var/wing_display = "Normal" + if(pref.wing_style && (pref.wing_style in wing_styles_list)) + var/datum/sprite_accessory/wing/instance = wing_styles_list[pref.wing_style] + wing_display = instance.name + else if(pref.wing_style) + wing_display = "REQUIRES UPDATE" + . += "Wing
" + . += " Style: [wing_display]
" + + if(wing_styles_list[pref.wing_style]) + var/datum/sprite_accessory/wing/W = wing_styles_list[pref.wing_style] + if(W.do_colouration) + . += "Change Color [color_square(pref.r_wing, pref.g_wing, pref.b_wing)]
" + if(W.extra_overlay) + . += "Change Secondary Color [color_square(pref.r_wing2, pref.g_wing2, pref.b_wing2)]
" + if(W.extra_overlay2) + . += "Change Secondary Color [color_square(pref.r_wing3, pref.g_wing3, pref.b_wing3)]
" + . += "
Body Markings +
" . += "" for(var/M in pref.body_markings) @@ -910,6 +1109,132 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.bgstate = next_in_list(pref.bgstate, pref.bgstate_options) return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["ear_style"]) + // Construct the list of names allowed for this user. + var/list/pretty_ear_styles = list("Normal" = null) + for(var/path in ear_styles_list) + var/datum/sprite_accessory/ears/instance = ear_styles_list[path] + if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit + pretty_ear_styles[instance.name] = path + + // Present choice to user + var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles + if(new_ear_style) + pref.ear_style = pretty_ear_styles[new_ear_style] + + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["ear_color"]) + var/new_earc = input(user, "Choose your character's ear colour:", "Character Preference", + rgb(pref.r_ears, pref.g_ears, pref.b_ears)) as color|null + if(new_earc) + pref.r_ears = hex2num(copytext(new_earc, 2, 4)) + pref.g_ears = hex2num(copytext(new_earc, 4, 6)) + pref.b_ears = hex2num(copytext(new_earc, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["ear_color2"]) + var/new_earc2 = input(user, "Choose your character's ear colour:", "Character Preference", + rgb(pref.r_ears2, pref.g_ears2, pref.b_ears2)) as color|null + if(new_earc2) + pref.r_ears2 = hex2num(copytext(new_earc2, 2, 4)) + pref.g_ears2 = hex2num(copytext(new_earc2, 4, 6)) + pref.b_ears2 = hex2num(copytext(new_earc2, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["ear_color3"]) + var/new_earc3 = input(user, "Choose your character's tertiary ear colour:", "Character Preference", + rgb(pref.r_ears3, pref.g_ears3, pref.b_ears3)) as color|null + if(new_earc3) + pref.r_ears3 = hex2num(copytext(new_earc3, 2, 4)) + pref.g_ears3 = hex2num(copytext(new_earc3, 4, 6)) + pref.b_ears3 = hex2num(copytext(new_earc3, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_style"]) + // Construct the list of names allowed for this user. + var/list/pretty_tail_styles = list("Normal" = null) + for(var/path in tail_styles_list) + var/datum/sprite_accessory/tail/instance = tail_styles_list[path] + if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit + pretty_tail_styles[instance.name] = path + + // Present choice to user + var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles + if(new_tail_style) + pref.tail_style = pretty_tail_styles[new_tail_style] + + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_color"]) + var/new_tailc = input(user, "Choose your character's tail/taur colour:", "Character Preference", + rgb(pref.r_tail, pref.g_tail, pref.b_tail)) as color|null + if(new_tailc) + pref.r_tail = hex2num(copytext(new_tailc, 2, 4)) + pref.g_tail = hex2num(copytext(new_tailc, 4, 6)) + pref.b_tail = hex2num(copytext(new_tailc, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_color2"]) + var/new_tailc2 = input(user, "Choose your character's secondary tail/taur colour:", "Character Preference", + rgb(pref.r_tail2, pref.g_tail2, pref.b_tail2)) as color|null + if(new_tailc2) + pref.r_tail2 = hex2num(copytext(new_tailc2, 2, 4)) + pref.g_tail2 = hex2num(copytext(new_tailc2, 4, 6)) + pref.b_tail2 = hex2num(copytext(new_tailc2, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["tail_color3"]) + var/new_tailc3 = input(user, "Choose your character's tertiary tail/taur colour:", "Character Preference", + rgb(pref.r_tail3, pref.g_tail3, pref.b_tail3)) as color|null + if(new_tailc3) + pref.r_tail3 = hex2num(copytext(new_tailc3, 2, 4)) + pref.g_tail3 = hex2num(copytext(new_tailc3, 4, 6)) + pref.b_tail3 = hex2num(copytext(new_tailc3, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_style"]) + // Construct the list of names allowed for this user. + var/list/pretty_wing_styles = list("Normal" = null) + for(var/path in wing_styles_list) + var/datum/sprite_accessory/wing/instance = wing_styles_list[path] + if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, user)) //VOREStation Edit + pretty_wing_styles[instance.name] = path + + // Present choice to user + var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles + if(new_wing_style) + pref.wing_style = pretty_wing_styles[new_wing_style] + + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_color"]) + var/new_wingc = input(user, "Choose your character's wing colour:", "Character Preference", + rgb(pref.r_wing, pref.g_wing, pref.b_wing)) as color|null + if(new_wingc) + pref.r_wing = hex2num(copytext(new_wingc, 2, 4)) + pref.g_wing = hex2num(copytext(new_wingc, 4, 6)) + pref.b_wing = hex2num(copytext(new_wingc, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_color2"]) + var/new_wingc2 = input(user, "Choose your character's secondary wing colour:", "Character Preference", + rgb(pref.r_wing2, pref.g_wing2, pref.b_wing2)) as color|null + if(new_wingc2) + pref.r_wing2 = hex2num(copytext(new_wingc2, 2, 4)) + pref.g_wing2 = hex2num(copytext(new_wingc2, 4, 6)) + pref.b_wing2 = hex2num(copytext(new_wingc2, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + + else if(href_list["wing_color3"]) + var/new_wingc3 = input(user, "Choose your character's tertiary wing colour:", "Character Preference", + rgb(pref.r_wing3, pref.g_wing3, pref.b_wing3)) as color|null + if(new_wingc3) + pref.r_wing3 = hex2num(copytext(new_wingc3, 2, 4)) + pref.g_wing3 = hex2num(copytext(new_wingc3, 4, 6)) + pref.b_wing3 = hex2num(copytext(new_wingc3, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + //YW Add Start else if(href_list["wingdings"]) pref.wingdings = !pref.wingdings @@ -941,7 +1266,6 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O //YW Add End - return ..() /datum/category_item/player_setup_item/general/body/proc/reset_limbs() diff --git a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm index 136c6194ac..21abba41f2 100644 --- a/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_fluffitems_vr.dm @@ -29,7 +29,7 @@ // 0-9 CKEYS /datum/gear/fluff/malady_crop - path = /obj/item/weapon/material/twohanded/fluff/riding_crop/malady + path = /obj/item/weapon/material/twohanded/riding_crop/malady display_name = "Malady's Crop" ckeywhitelist = list("1r1s") character_name = list("Malady Blanche") diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm index aa158a1aaa..a61b2f7e0a 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm @@ -71,4 +71,14 @@ //greek thing /datum/gear/suit/chiton display_name = "chiton" - path = /obj/item/clothing/suit/chiton \ No newline at end of file + path = /obj/item/clothing/suit/chiton + + +//oversized t-shirt +/datum/gear/suit/oversize + display_name = "oversized t-shirt (colorable)" + path = /obj/item/clothing/suit/oversize + +/datum/gear/suit/oversize/New() + ..() + gear_tweaks += gear_tweak_free_color_choice \ No newline at end of file diff --git a/code/modules/client/preference_setup/vore/01_ears.dm b/code/modules/client/preference_setup/vore/01_ears.dm index dea5be0479..c9998dece0 100644 --- a/code/modules/client/preference_setup/vore/01_ears.dm +++ b/code/modules/client/preference_setup/vore/01_ears.dm @@ -3,373 +3,3 @@ name = "VORE" sort_order = 8 category_item_type = /datum/category_item/player_setup_item/vore - -// Define a place to save appearance in character setup -/datum/preferences - var/ear_style // Type of selected ear style - var/r_ears = 30 // Ear color. - var/g_ears = 30 // Ear color - var/b_ears = 30 // Ear color - var/r_ears2 = 30 // Ear extra color. - var/g_ears2 = 30 // Ear extra color - var/b_ears2 = 30 // Ear extra color - var/r_ears3 = 30 // Ear tertiary color. - var/g_ears3 = 30 // Ear tertiary color - var/b_ears3 = 30 // Ear tertiary color - var/tail_style // Type of selected tail style - var/r_tail = 30 // Tail/Taur color - var/g_tail = 30 // Tail/Taur color - var/b_tail = 30 // Tail/Taur color - var/r_tail2 = 30 // For extra overlay. - var/g_tail2 = 30 // For extra overlay. - var/b_tail2 = 30 // For extra overlay. - var/r_tail3 = 30 // For tertiary overlay. - var/g_tail3 = 30 // For tertiary overlay. - var/b_tail3 = 30 // For tertiary overlay. - var/wing_style // Type of selected wing style - var/r_wing = 30 // Wing color - var/g_wing = 30 // Wing color - var/b_wing = 30 // Wing color - var/r_wing2 = 30 // Wing extra color - var/g_wing2 = 30 // Wing extra color - var/b_wing2 = 30 // Wing extra color - var/r_wing3 = 30 // Wing tertiary color - var/g_wing3 = 30 // Wing tertiary color - var/b_wing3 = 30 // Wing tertiary color - -// Definition of the stuff for Ears -/datum/category_item/player_setup_item/vore/ears - name = "Appearance" - sort_order = 1 - -/datum/category_item/player_setup_item/vore/ears/load_character(var/savefile/S) - S["ear_style"] >> pref.ear_style - S["r_ears"] >> pref.r_ears - S["g_ears"] >> pref.g_ears - S["b_ears"] >> pref.b_ears - S["r_ears2"] >> pref.r_ears2 - S["g_ears2"] >> pref.g_ears2 - S["b_ears2"] >> pref.b_ears2 - S["r_ears3"] >> pref.r_ears3 - S["g_ears3"] >> pref.g_ears3 - S["b_ears3"] >> pref.b_ears3 - S["tail_style"] >> pref.tail_style - S["r_tail"] >> pref.r_tail - S["g_tail"] >> pref.g_tail - S["b_tail"] >> pref.b_tail - S["r_tail2"] >> pref.r_tail2 - S["g_tail2"] >> pref.g_tail2 - S["b_tail2"] >> pref.b_tail2 - S["r_tail3"] >> pref.r_tail3 - S["g_tail3"] >> pref.g_tail3 - S["b_tail3"] >> pref.b_tail3 - S["wing_style"] >> pref.wing_style - S["r_wing"] >> pref.r_wing - S["g_wing"] >> pref.g_wing - S["b_wing"] >> pref.b_wing - S["r_wing2"] >> pref.r_wing2 - S["g_wing2"] >> pref.g_wing2 - S["b_wing2"] >> pref.b_wing2 - S["r_wing3"] >> pref.r_wing3 - S["g_wing3"] >> pref.g_wing3 - S["b_wing3"] >> pref.b_wing3 - -/datum/category_item/player_setup_item/vore/ears/save_character(var/savefile/S) - S["ear_style"] << pref.ear_style - S["r_ears"] << pref.r_ears - S["g_ears"] << pref.g_ears - S["b_ears"] << pref.b_ears - S["r_ears2"] << pref.r_ears2 - S["g_ears2"] << pref.g_ears2 - S["b_ears2"] << pref.b_ears2 - S["r_ears3"] << pref.r_ears3 - S["g_ears3"] << pref.g_ears3 - S["b_ears3"] << pref.b_ears3 - S["tail_style"] << pref.tail_style - S["r_tail"] << pref.r_tail - S["g_tail"] << pref.g_tail - S["b_tail"] << pref.b_tail - S["r_tail2"] << pref.r_tail2 - S["g_tail2"] << pref.g_tail2 - S["b_tail2"] << pref.b_tail2 - S["r_tail3"] << pref.r_tail3 - S["g_tail3"] << pref.g_tail3 - S["b_tail3"] << pref.b_tail3 - S["wing_style"] << pref.wing_style - S["r_wing"] << pref.r_wing - S["g_wing"] << pref.g_wing - S["b_wing"] << pref.b_wing - S["r_wing2"] << pref.r_wing2 - S["g_wing2"] << pref.g_wing2 - S["b_wing2"] << pref.b_wing2 - S["r_wing3"] << pref.r_wing3 - S["g_wing3"] << pref.g_wing3 - S["b_wing3"] << pref.b_wing3 - -/datum/category_item/player_setup_item/vore/ears/sanitize_character() - pref.r_ears = sanitize_integer(pref.r_ears, 0, 255, initial(pref.r_ears)) - pref.g_ears = sanitize_integer(pref.g_ears, 0, 255, initial(pref.g_ears)) - pref.b_ears = sanitize_integer(pref.b_ears, 0, 255, initial(pref.b_ears)) - pref.r_ears2 = sanitize_integer(pref.r_ears2, 0, 255, initial(pref.r_ears2)) - pref.g_ears2 = sanitize_integer(pref.g_ears2, 0, 255, initial(pref.g_ears2)) - pref.b_ears2 = sanitize_integer(pref.b_ears2, 0, 255, initial(pref.b_ears2)) - pref.r_ears3 = sanitize_integer(pref.r_ears3, 0, 255, initial(pref.r_ears3)) - pref.g_ears3 = sanitize_integer(pref.g_ears3, 0, 255, initial(pref.g_ears3)) - pref.b_ears3 = sanitize_integer(pref.b_ears3, 0, 255, initial(pref.b_ears3)) - pref.r_tail = sanitize_integer(pref.r_tail, 0, 255, initial(pref.r_tail)) - pref.g_tail = sanitize_integer(pref.g_tail, 0, 255, initial(pref.g_tail)) - pref.b_tail = sanitize_integer(pref.b_tail, 0, 255, initial(pref.b_tail)) - pref.r_tail2 = sanitize_integer(pref.r_tail2, 0, 255, initial(pref.r_tail2)) - pref.g_tail2 = sanitize_integer(pref.g_tail2, 0, 255, initial(pref.g_tail2)) - pref.b_tail2 = sanitize_integer(pref.b_tail2, 0, 255, initial(pref.b_tail2)) - pref.r_tail3 = sanitize_integer(pref.r_tail3, 0, 255, initial(pref.r_tail3)) - pref.g_tail3 = sanitize_integer(pref.g_tail3, 0, 255, initial(pref.g_tail3)) - pref.b_tail3 = sanitize_integer(pref.b_tail3, 0, 255, initial(pref.b_tail3)) - pref.r_wing = sanitize_integer(pref.r_wing, 0, 255, initial(pref.r_wing)) - pref.g_wing = sanitize_integer(pref.g_wing, 0, 255, initial(pref.g_wing)) - pref.b_wing = sanitize_integer(pref.b_wing, 0, 255, initial(pref.b_wing)) - pref.r_wing2 = sanitize_integer(pref.r_wing2, 0, 255, initial(pref.r_wing2)) - pref.g_wing2 = sanitize_integer(pref.g_wing2, 0, 255, initial(pref.g_wing2)) - pref.b_wing2 = sanitize_integer(pref.b_wing2, 0, 255, initial(pref.b_wing2)) - pref.r_wing3 = sanitize_integer(pref.r_wing3, 0, 255, initial(pref.r_wing3)) - pref.g_wing3 = sanitize_integer(pref.g_wing3, 0, 255, initial(pref.g_wing3)) - pref.b_wing3 = sanitize_integer(pref.b_wing3, 0, 255, initial(pref.b_wing3)) - - if(pref.ear_style) - pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style)) - var/datum/sprite_accessory/temp_ear_style = ear_styles_list[pref.ear_style] - if(temp_ear_style.apply_restrictions && (!(pref.species in temp_ear_style.species_allowed))) - pref.ear_style = initial(pref.ear_style) - if(pref.tail_style) - pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style)) - var/datum/sprite_accessory/temp_tail_style = tail_styles_list[pref.tail_style] - if(temp_tail_style.apply_restrictions && (!(pref.species in temp_tail_style.species_allowed))) - pref.tail_style = initial(pref.tail_style) - if(pref.wing_style) - pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, initial(pref.wing_style)) - var/datum/sprite_accessory/temp_wing_style = wing_styles_list[pref.wing_style] - if(temp_wing_style.apply_restrictions && (!(pref.species in temp_wing_style.species_allowed))) - pref.wing_style = initial(pref.wing_style) - -/datum/category_item/player_setup_item/vore/ears/copy_to_mob(var/mob/living/carbon/human/character) - character.ear_style = ear_styles_list[pref.ear_style] - character.r_ears = pref.r_ears - character.b_ears = pref.b_ears - character.g_ears = pref.g_ears - character.r_ears2 = pref.r_ears2 - character.b_ears2 = pref.b_ears2 - character.g_ears2 = pref.g_ears2 - character.r_ears3 = pref.r_ears3 - character.b_ears3 = pref.b_ears3 - character.g_ears3 = pref.g_ears3 - character.tail_style = tail_styles_list[pref.tail_style] - character.r_tail = pref.r_tail - character.b_tail = pref.b_tail - character.g_tail = pref.g_tail - character.r_tail2 = pref.r_tail2 - character.b_tail2 = pref.b_tail2 - character.g_tail2 = pref.g_tail2 - character.r_tail3 = pref.r_tail3 - character.b_tail3 = pref.b_tail3 - character.g_tail3 = pref.g_tail3 - character.wing_style = wing_styles_list[pref.wing_style] - character.r_wing = pref.r_wing - character.b_wing = pref.b_wing - character.g_wing = pref.g_wing - character.r_wing2 = pref.r_wing2 - character.b_wing2 = pref.b_wing2 - character.g_wing2 = pref.g_wing2 - character.r_wing3 = pref.r_wing3 - character.b_wing3 = pref.b_wing3 - character.g_wing3 = pref.g_wing3 - - - -/datum/category_item/player_setup_item/vore/ears/content(var/mob/user) - . += "

VORE Station Settings

" - - var/ear_display = "Normal" - if(pref.ear_style && (pref.ear_style in ear_styles_list)) - var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style] - ear_display = instance.name - - else if(pref.ear_style) - ear_display = "REQUIRES UPDATE" - . += "Ears
" - . += " Style: [ear_display]
" - if(ear_styles_list[pref.ear_style]) - var/datum/sprite_accessory/ears/ear = ear_styles_list[pref.ear_style] - if(ear.do_colouration) - . += "Change Color [color_square(pref.r_ears, pref.g_ears, pref.b_ears)]
" - if(ear.extra_overlay) - . += "Change Secondary Color [color_square(pref.r_ears2, pref.g_ears2, pref.b_ears2)]
" - if(ear.extra_overlay2) - . += "Change Tertiary Color [color_square(pref.r_ears3, pref.g_ears3, pref.b_ears3)]
" - - var/tail_display = "Normal" - if(pref.tail_style && (pref.tail_style in tail_styles_list)) - var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style] - tail_display = instance.name - else if(pref.tail_style) - tail_display = "REQUIRES UPDATE" - . += "Tail
" - . += " Style: [tail_display]
" - - if(tail_styles_list[pref.tail_style]) - var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style] - if(T.do_colouration) - . += "Change Color [color_square(pref.r_tail, pref.g_tail, pref.b_tail)]
" - if(T.extra_overlay) - . += "Change Secondary Color [color_square(pref.r_tail2, pref.g_tail2, pref.b_tail2)]
" - if(T.extra_overlay2) - . += "Change Tertiary Color [color_square(pref.r_tail3, pref.g_tail3, pref.b_tail3)]
" - - var/wing_display = "Normal" - if(pref.wing_style && (pref.wing_style in wing_styles_list)) - var/datum/sprite_accessory/wing/instance = wing_styles_list[pref.wing_style] - wing_display = instance.name - else if(pref.wing_style) - wing_display = "REQUIRES UPDATE" - . += "Wing
" - . += " Style: [wing_display]
" - - if(wing_styles_list[pref.wing_style]) - var/datum/sprite_accessory/wing/W = wing_styles_list[pref.wing_style] - if (W.do_colouration) - . += "Change Color [color_square(pref.r_wing, pref.g_wing, pref.b_wing)]
" - if (W.extra_overlay) - . += "Change Secondary Color [color_square(pref.r_wing2, pref.g_wing2, pref.b_wing2)]
" - if (W.extra_overlay2) - . += "Change Secondary Color [color_square(pref.r_wing3, pref.g_wing3, pref.b_wing3)]
" - -/datum/category_item/player_setup_item/vore/ears/OnTopic(var/href,var/list/href_list, var/mob/user) - if(!CanUseTopic(user)) - return TOPIC_NOACTION - - else if(href_list["ear_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_ear_styles = list("Normal" = null) - for(var/path in ear_styles_list) - var/datum/sprite_accessory/ears/instance = ear_styles_list[path] - if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed))) - pretty_ear_styles[instance.name] = path - - // Present choice to user - var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles - if(new_ear_style) - pref.ear_style = pretty_ear_styles[new_ear_style] - - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["ear_color"]) - var/new_earc = input(user, "Choose your character's ear colour:", "Character Preference", - rgb(pref.r_ears, pref.g_ears, pref.b_ears)) as color|null - if(new_earc) - pref.r_ears = hex2num(copytext(new_earc, 2, 4)) - pref.g_ears = hex2num(copytext(new_earc, 4, 6)) - pref.b_ears = hex2num(copytext(new_earc, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["ear_color2"]) - var/new_earc2 = input(user, "Choose your character's secondary ear colour:", "Character Preference", - rgb(pref.r_ears2, pref.g_ears2, pref.b_ears2)) as color|null - if(new_earc2) - pref.r_ears2 = hex2num(copytext(new_earc2, 2, 4)) - pref.g_ears2 = hex2num(copytext(new_earc2, 4, 6)) - pref.b_ears2 = hex2num(copytext(new_earc2, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["ear_color3"]) - var/new_earc3 = input(user, "Choose your character's tertiary ear colour:", "Character Preference", - rgb(pref.r_ears3, pref.g_ears3, pref.b_ears3)) as color|null - if(new_earc3) - pref.r_ears3 = hex2num(copytext(new_earc3, 2, 4)) - pref.g_ears3 = hex2num(copytext(new_earc3, 4, 6)) - pref.b_ears3 = hex2num(copytext(new_earc3, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_tail_styles = list("Normal" = null) - for(var/path in tail_styles_list) - var/datum/sprite_accessory/tail/instance = tail_styles_list[path] - if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed))) - pretty_tail_styles[instance.name] = path - - // Present choice to user - var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles - if(new_tail_style) - pref.tail_style = pretty_tail_styles[new_tail_style] - - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_color"]) - var/new_tailc = input(user, "Choose your character's tail/taur colour:", "Character Preference", - rgb(pref.r_tail, pref.g_tail, pref.b_tail)) as color|null - if(new_tailc) - pref.r_tail = hex2num(copytext(new_tailc, 2, 4)) - pref.g_tail = hex2num(copytext(new_tailc, 4, 6)) - pref.b_tail = hex2num(copytext(new_tailc, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_color2"]) - var/new_tailc2 = input(user, "Choose your character's secondary tail/taur colour:", "Character Preference", - rgb(pref.r_tail2, pref.g_tail2, pref.b_tail2)) as color|null - if(new_tailc2) - pref.r_tail2 = hex2num(copytext(new_tailc2, 2, 4)) - pref.g_tail2 = hex2num(copytext(new_tailc2, 4, 6)) - pref.b_tail2 = hex2num(copytext(new_tailc2, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["tail_color3"]) - var/new_tailc3 = input(user, "Choose your character's tertiary tail/taur colour:", "Character Preference", - rgb(pref.r_tail3, pref.g_tail3, pref.b_tail3)) as color|null - if(new_tailc3) - pref.r_tail3 = hex2num(copytext(new_tailc3, 2, 4)) - pref.g_tail3 = hex2num(copytext(new_tailc3, 4, 6)) - pref.b_tail3 = hex2num(copytext(new_tailc3, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_wing_styles = list("Normal" = null) - for(var/path in wing_styles_list) - var/datum/sprite_accessory/wing/instance = wing_styles_list[path] - if(((!instance.ckeys_allowed) || (usr.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed))) - pretty_wing_styles[instance.name] = path - - // Present choice to user - var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles - if(new_wing_style) - pref.wing_style = pretty_wing_styles[new_wing_style] - - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_color"]) - var/new_wingc = input(user, "Choose your character's wing colour:", "Character Preference", - rgb(pref.r_wing, pref.g_wing, pref.b_wing)) as color|null - if(new_wingc) - pref.r_wing = hex2num(copytext(new_wingc, 2, 4)) - pref.g_wing = hex2num(copytext(new_wingc, 4, 6)) - pref.b_wing = hex2num(copytext(new_wingc, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_color2"]) - var/new_wingc2 = input(user, "Choose your character's secondary wing colour:", "Character Preference", - rgb(pref.r_wing2, pref.g_wing2, pref.b_wing2)) as color|null - if(new_wingc2) - pref.r_wing2 = hex2num(copytext(new_wingc2, 2, 4)) - pref.g_wing2 = hex2num(copytext(new_wingc2, 4, 6)) - pref.b_wing2 = hex2num(copytext(new_wingc2, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - else if(href_list["wing_color3"]) - var/new_wingc3 = input(user, "Choose your character's tertiary wing colour:", "Character Preference", - rgb(pref.r_wing3, pref.g_wing3, pref.b_wing3)) as color|null - if(new_wingc3) - pref.r_wing3 = hex2num(copytext(new_wingc3, 2, 4)) - pref.g_wing3 = hex2num(copytext(new_wingc3, 4, 6)) - pref.b_wing3 = hex2num(copytext(new_wingc3, 6, 8)) - return TOPIC_REFRESH_UPDATE_PREVIEW - - return ..() diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index 5a7c83ed8a..185b8047b4 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -96,7 +96,7 @@ var/datum/species/selected_species = GLOB.all_species[pref.species] if(selected_species.selects_bodytype) // Allowed! - else if(!pref.custom_base || !(pref.custom_base in custom_species_bases)) + else if(!pref.custom_base || !(pref.custom_base in GLOB.custom_species_bases)) pref.custom_base = SPECIES_HUMAN /datum/category_item/player_setup_item/vore/traits/copy_to_mob(var/mob/living/carbon/human/character) @@ -204,7 +204,7 @@ return TOPIC_REFRESH else if(href_list["custom_base"]) - var/list/choices = custom_species_bases + var/list/choices = GLOB.custom_species_bases if(pref.species != SPECIES_CUSTOM) choices = (choices | pref.species) var/text_choice = input("Pick an icon set for your species:","Icon Base") in choices diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 1b03300ddd..918294ff7f 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -744,6 +744,8 @@ slot_flags = SLOT_OCLOTHING var/blood_overlay_type = "suit" blood_sprite_state = "suitblood" //Defaults to the suit's blood overlay, so that some blood renders instead of no blood. + + var/taurized = FALSE siemens_coefficient = 0.9 w_class = ITEMSIZE_NORMAL preserve_item = 1 @@ -779,6 +781,43 @@ set_clothing_index() +/obj/item/clothing/suit/equipped(var/mob/user, var/slot) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if((taurized && !isTaurTail(H.tail_style)) || (!taurized && isTaurTail(H.tail_style))) + taurize(user) + + return ..() + +/obj/item/clothing/suit/proc/taurize(var/mob/living/carbon/human/Taur) + if(isTaurTail(Taur.tail_style)) + var/datum/sprite_accessory/tail/taur/taurtail = Taur.tail_style + if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) + icon_override = taurtail.suit_sprites + taurized = TRUE + + if(!taurized) + icon_override = initial(icon_override) + taurized = FALSE + +// Taur suits need to be shifted so its centered on their taur half. +/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) + var/image/standing = ..() + if(taurized) //Special snowflake var on suits + standing.pixel_x = -16 + standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. + return standing + +/obj/item/clothing/suit/apply_accessories(var/image/standing) + if(LAZYLEN(accessories) && taurized) + for(var/obj/item/clothing/accessory/A in accessories) + var/image/I = new(A.get_mob_overlay()) + I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. + standing.add_overlay(I) + else + return ..() + + /////////////////////////////////////////////////////////////////////// //Under clothing /obj/item/clothing/under @@ -1056,7 +1095,6 @@ to_chat(usr, "You roll down your [src]'s sleeves.") update_clothing_icon() - /obj/item/clothing/under/rank/New() sensor_mode = pick(0,1,2,3) ..() diff --git a/code/modules/clothing/clothing_vr.dm b/code/modules/clothing/clothing_vr.dm index 68df04ae22..1c4b8cd9f3 100644 --- a/code/modules/clothing/clothing_vr.dm +++ b/code/modules/clothing/clothing_vr.dm @@ -149,48 +149,11 @@ //Switch to taur sprites if a taur equips /obj/item/clothing/suit - var/taurized = FALSE //Easier than trying to 'compare icons' to see if it's a taur suit sprite_sheets = list( SPECIES_TESHARI = 'icons/mob/species/seromi/suit.dmi', SPECIES_VOX = 'icons/mob/species/vox/suit.dmi', SPECIES_WEREBEAST = 'icons/mob/species/werebeast/suit.dmi') -/obj/item/clothing/suit/equipped(var/mob/user, var/slot) - var/normalize = TRUE - - //Pyramid of doom-y. Improve somehow? - if(!taurized && slot == slot_wear_suit && ishuman(user)) - var/mob/living/carbon/human/H = user - if(isTaurTail(H.tail_style)) - var/datum/sprite_accessory/tail/taur/taurtail = H.tail_style - if(taurtail.suit_sprites && (get_worn_icon_state(slot_wear_suit_str) in cached_icon_states(taurtail.suit_sprites))) - icon_override = taurtail.suit_sprites - normalize = FALSE - taurized = TRUE - - if(normalize && taurized) - icon_override = initial(icon_override) - taurized = FALSE - - return ..() - -// Taur suits need to be shifted so its centered on their taur half. -/obj/item/clothing/suit/make_worn_icon(var/body_type,var/slot_name,var/inhands,var/default_icon,var/default_layer = 0,var/icon/clip_mask) - var/image/standing = ..() - if(taurized) //Special snowflake var on suits - standing.pixel_x = -16 - standing.layer = BODY_LAYER + 15 // 15 is above tail layer, so will not be covered by taurbody. - return standing - -/obj/item/clothing/suit/apply_accessories(var/image/standing) - if(LAZYLEN(accessories) && taurized) - for(var/obj/item/clothing/accessory/A in accessories) - var/image/I = new(A.get_mob_overlay()) - I.pixel_x = 16 //Opposite of the pixel_x on the suit (-16) from taurization to cancel it out and puts the accessory in the correct place on the body. - standing.add_overlay(I) - else - return ..() - //TFF 5/8/19 - sets Vorestation /obj/item/clothing/under sensor setting default? /obj/item/clothing/under sensor_mode = 3 diff --git a/code/modules/clothing/suits/miscellaneous_vr.dm b/code/modules/clothing/suits/miscellaneous_vr.dm index 306dfc35db..2f4ae0c5a7 100644 --- a/code/modules/clothing/suits/miscellaneous_vr.dm +++ b/code/modules/clothing/suits/miscellaneous_vr.dm @@ -4,9 +4,16 @@ /obj/item/clothing/suit/chiton name = "chiton" desc = "A traditional piece of clothing from Greece." - icon = 'icons/mob/suit_vr.dmi' + icon = 'icons/obj/clothing/suits_vr.dmi' icon_state = "chiton" - icon_override = 'icons/obj/clothing/suits_vr.dmi' //why won't it work without this WHY GOD PLEASE + icon_override = 'icons/mob/suit_vr.dmi' + +/obj/item/clothing/suit/oversize + name = "oversized t-shirt" + desc = "This ain't your daddy's shirt! Well, it might be..." + icon = 'icons/obj/clothing/suits_vr.dmi' + icon_state = "oversize" + icon_override = 'icons/mob/suit_vr.dmi' //HERE BE TAUR RELATED CLOTHES diff --git a/code/modules/mining/mineral_effect.dm b/code/modules/mining/mineral_effect.dm index 9406231c56..12781a7ea4 100644 --- a/code/modules/mining/mineral_effect.dm +++ b/code/modules/mining/mineral_effect.dm @@ -1,6 +1,6 @@ /obj/effect/mineral name = "mineral vein" - icon = 'icons/obj/mining_vr.dmi' //VOREStation Edit + icon = 'icons/obj/mining.dmi' desc = "Shiny." mouse_opacity = 0 density = 0 diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index f4508bf288..3522ce9fa0 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -500,7 +500,7 @@ message = "points to [M]." else m_type = 1 - + if("crack") if(!restrained()) message = "cracks [T.his] knuckles." @@ -903,3 +903,27 @@ HTML +="\[Done\]" HTML += "" src << browse(HTML, "window=flavor_changes;size=430x300") + +/mob/living/carbon/human/proc/toggle_tail(var/setting,var/message = 0) + if(!tail_style || !tail_style.ani_state) + if(message) + to_chat(src, "You don't have a tail that supports this.") + return 0 + + var/new_wagging = isnull(setting) ? !wagging : setting + if(new_wagging != wagging) + wagging = new_wagging + update_tail_showing() + return 1 + +/mob/living/carbon/human/proc/toggle_wing(var/setting,var/message = 0) + if(!wing_style || !wing_style.ani_state) + if(message) + to_chat(src, "You don't have a wingtype that supports this.") + return 0 + + var/new_flapping = isnull(setting) ? !flapping : setting + if(new_flapping != flapping) + flapping = setting + update_wing_showing() + return 1 diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm index a840ee18a8..44fec3246c 100644 --- a/code/modules/mob/living/carbon/human/emote_vr.dm +++ b/code/modules/mob/living/carbon/human/emote_vr.dm @@ -9,13 +9,13 @@ switch(act) if("vwag") - if(toggle_tail_vr(message = 1)) + if(toggle_tail(message = 1)) m_type = 1 message = "[wagging ? "starts" : "stops"] wagging their tail." else return 1 if("vflap") - if(toggle_wing_vr(message = 1)) + if(toggle_wing(message = 1)) m_type = 1 message = "[flapping ? "starts" : "stops"] flapping their wings." else @@ -235,30 +235,6 @@ density = original_density pass_flags = original_passflags -/mob/living/carbon/human/proc/toggle_tail_vr(var/setting,var/message = 0) - if(!tail_style || !tail_style.ani_state) - if(message) - to_chat(src, "You don't have a tail that supports this.") - return 0 - - var/new_wagging = isnull(setting) ? !wagging : setting - if(new_wagging != wagging) - wagging = new_wagging - update_tail_showing() - return 1 - -/mob/living/carbon/human/proc/toggle_wing_vr(var/setting,var/message = 0) - if(!wing_style || !wing_style.ani_state) - if(message) - to_chat(src, "You don't have a tail that supports this.") - return 0 - - var/new_flapping = isnull(setting) ? !flapping : setting - if(new_flapping != flapping) - flapping = setting - update_wing_showing() - return 1 - /mob/living/carbon/human/verb/toggle_gender_identity_vr() set name = "Set Gender Identity" set desc = "Sets the pronouns when examined and performing an emote." diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 208e1e1ffc..34b93b2573 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -118,3 +118,42 @@ inventory_panel_type = /datum/inventory_panel/human butchery_loot = list(/obj/item/stack/animalhide/human = 1) + + // Horray Furries! + var/datum/sprite_accessory/ears/ear_style = null + var/r_ears = 30 + var/g_ears = 30 + var/b_ears = 30 + var/r_ears2 = 30 + var/g_ears2 = 30 + var/b_ears2 = 30 + var/r_ears3 = 30 //Trust me, we could always use more colour. No japes. + var/g_ears3 = 30 + var/b_ears3 = 30 + var/datum/sprite_accessory/tail/tail_style = null + var/r_tail = 30 + var/g_tail = 30 + var/b_tail = 30 + var/r_tail2 = 30 + var/g_tail2 = 30 + var/b_tail2 = 30 + var/r_tail3 = 30 + var/g_tail3 = 30 + var/b_tail3 = 30 + var/datum/sprite_accessory/wing/wing_style = null + var/r_wing = 30 + var/g_wing = 30 + var/b_wing = 30 + var/r_wing2 = 30 + var/g_wing2 = 30 + var/b_wing2 = 30 + var/r_wing3 = 30 + var/g_wing3 = 30 + var/b_wing3 = 30 + + var/wagging = 0 //UGH. + var/flapping = 0 + + // Custom Species Name + var/custom_species + diff --git a/code/modules/mob/living/carbon/human/human_defines_vr.dm b/code/modules/mob/living/carbon/human/human_defines_vr.dm index 55fab1b1c4..cdd7276838 100644 --- a/code/modules/mob/living/carbon/human/human_defines_vr.dm +++ b/code/modules/mob/living/carbon/human/human_defines_vr.dm @@ -3,8 +3,6 @@ g_skin = 206 b_skin = 179 - var/wagging = 0 //UGH. - var/flapping = 0 var/vantag_pref = VANTAG_NONE //What's my status? var/impersonate_bodytype //For impersonating a bodytype var/ability_flags = 0 //Shadekin abilities/potentially other species-based? diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 7ab7fae8f4..6f6ebba1f8 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -255,6 +255,27 @@ /datum/mob_descriptor/build ) + //This is used in character setup preview generation (prefences_setup.dm) and human mob + //rendering (update_icons.dm) + var/color_mult = 0 + + //This is for overriding tail rendering with a specific icon in icobase, for static + //tails only, since tails would wag when dead if you used this + var/icobase_tail = 0 + + var/wing_hair + var/wing + var/wing_animation + var/icobase_wing + var/wikilink = null //link to wiki page for species + var/icon_height = 32 + var/agility = 20 //prob() to do agile things + +/datum/species/proc/update_attack_types() + unarmed_attacks = list() + for(var/u_type in unarmed_types) + unarmed_attacks += new u_type() + /datum/species/New() if(hud_type) hud = new hud_type() @@ -398,8 +419,9 @@ "[H] boops [target]'s nose.", \ "You boop [target] on the nose.", ) //VOREStation Edit End - else H.visible_message("[H] hugs [target] to make [t_him] feel better!", \ - "You hug [target] to make [t_him] feel better!") //End VOREStation Edit + else + H.visible_message("[H] hugs [target] to make [t_him] feel better!", \ + "You hug [target] to make [t_him] feel better!") /datum/species/proc/remove_inherent_verbs(var/mob/living/carbon/human/H) if(inherent_verbs) diff --git a/code/modules/mob/living/carbon/human/species/species_vr.dm b/code/modules/mob/living/carbon/human/species/species_vr.dm index 558924a784..fb9beed574 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -1,25 +1,10 @@ /datum/species - //This is used in character setup preview generation (prefences_setup.dm) and human mob - //rendering (update_icons.dm) - var/color_mult = 0 - - //This is for overriding tail rendering with a specific icon in icobase, for static - //tails only, since tails would wag when dead if you used this - var/icobase_tail = 0 - //This is so that if a race is using the chimera revive they can't use it more than once. //Shouldn't really be seen in play too often, but it's case an admin event happens and they give a non chimera the chimera revive. Only one person can use the chimera revive at a time per race. //var/reviving = 0 //commented out 'cause moved to mob holder_type = /obj/item/weapon/holder/micro //This allows you to pick up crew min_age = 18 descriptors = list() - var/wing_hair - var/wing - var/wing_animation - var/icobase_wing - var/wikilink = null //link to wiki page for species - var/icon_height = 32 - var/agility = 20 //prob() to do agile things var/organic_food_coeff = 1 var/synthetic_food_coeff = 0 @@ -39,11 +24,6 @@ var/list/traits = list() -/datum/species/proc/update_attack_types() - unarmed_attacks = list() - for(var/u_type in unarmed_types) - unarmed_attacks += new u_type() - /datum/species/proc/give_numbing_bite() //Holy SHIT this is hacky, but it works. Updating a mob's attacks mid game is insane. unarmed_attacks = list() unarmed_types += /datum/unarmed_attack/bite/sharp/numbing diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index ed7935e871..f876ebc24d 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -1,1175 +1,1270 @@ -/* - Global associative list for caching humanoid icons. - Index format m or f, followed by a string of 0 and 1 to represent bodyparts followed by husk fat hulk skeleton 1 or 0. -*/ -var/global/list/human_icon_cache = list() //key is incredibly complex, see update_icons_body() -var/global/list/tail_icon_cache = list() //key is [species.race_key][r_skin][g_skin][b_skin] -var/global/list/light_overlay_cache = list() //see make_worn_icon() on helmets -var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() - -//////////////////////////////////////////////////////////////////////////////////////////////// -// # Human Icon Updating System -// -// This system takes care of the "icon" for human mobs. Of course humans don't just have a single -// icon+icon_state, but a combination of dozens of little sprites including including the body, -// clothing, equipment, in-universe HUD images, etc. -// -// # Basic Operation -// Whenever you do something that should update the on-mob appearance of a worn or held item, You -// will need to call the relevant update_inv_* proc. All of these are named after the variable they -// update from. They are defined at the /mob level so you don't even need to cast to carbon/human. -// -// The new system leverages SSoverlays to actually add/remove the overlays from mob.overlays -// Since SSoverlays already manages batching updates to reduce apperance churn etc, we don't need -// to worry about that. (In short, you can call add/cut overlay as many times as you want, it will -// only get assigned to the mob once per tick.) -// As a corrolary, this means users of this system do NOT need to tell the system when you're done -// making changes. -// -// There are also these special cases: -// update_icons_body() //Handles updating your mob's icon to reflect their gender/race/complexion etc -// UpdateDamageIcon() //Handles damage overlays for brute/burn damage //(will rename this when I geta round to it) ~Carn -// update_skin() //Handles updating skin for species that have a skin overlay. -// update_bloodied() //Handles adding/clearing the blood overlays for hands & feet. Call when bloodied or cleaned. -// update_underwear() //Handles updating the sprite for underwear. -// update_hair() //Handles updating your hair and eyes overlay -// update_mutations() //Handles updating your appearance for certain mutations. e.g TK head-glows -// update_fire() //Handles overlay from being on fire. -// update_water() //Handles overlay from being submerged. -// update_surgery() //Handles overlays from open external organs. -// -// # History (i.e. I'm used to the old way, what is different?) -// You used to have to call update_icons(FALSE) if you planned to make more changes, and call update_icons(TRUE) -// on the final update. All that is gone, just call update_inv_whatever() and it handles the rest. -// -//////////////////////////////////////////////////////////////////////////////////////////////// - -//Add an entry to overlays, assuming it exists -/mob/living/carbon/human/proc/apply_layer(cache_index) - if((. = overlays_standing[cache_index])) - add_overlay(.) - -//Remove an entry from overlays, and from the list -/mob/living/carbon/human/proc/remove_layer(cache_index) - var/I = overlays_standing[cache_index] - if(I) - cut_overlay(I) - overlays_standing[cache_index] = null - -// These are used as the layers for the icons, as well as indexes in a list that holds onto them. -// Technically the layers used are all -100+layer to make them FLOAT_LAYER overlays. -//Human Overlays Indexes///////// -#define MUTATIONS_LAYER 1 //Mutations like fat, and lasereyes -#define SKIN_LAYER 2 //Skin things added by a call on species -#define BLOOD_LAYER 3 //Bloodied hands/feet/anything else -#define DAMAGE_LAYER 4 //Injury overlay sprites like open wounds -#define SURGERY_LAYER 5 //Overlays for open surgical sites -#define UNDERWEAR_LAYER 6 //Underwear/bras/etc -#define SHOES_LAYER_ALT 7 //Shoe-slot item (when set to be under uniform via verb) -#define UNIFORM_LAYER 8 //Uniform-slot item -#define ID_LAYER 9 //ID-slot item -#define SHOES_LAYER 10 //Shoe-slot item -#define GLOVES_LAYER 11 //Glove-slot item -#define BELT_LAYER 12 //Belt-slot item -#define SUIT_LAYER 13 //Suit-slot item -#define TAIL_LAYER 14 //Some species have tails to render -#define GLASSES_LAYER 15 //Eye-slot item -#define BELT_LAYER_ALT 16 //Belt-slot item (when set to be above suit via verb) -#define SUIT_STORE_LAYER 17 //Suit storage-slot item -#define BACK_LAYER 18 //Back-slot item -#define HAIR_LAYER 19 //The human's hair -#define HAIR_ACCESSORY_LAYER 20 //VOREStation edit. Simply move this up a number if things are added. -#define EARS_LAYER 21 //Both ear-slot items (combined image) -#define EYES_LAYER 22 //Mob's eyes (used for glowing eyes) -#define FACEMASK_LAYER 23 //Mask-slot item -#define HEAD_LAYER 24 //Head-slot item -#define HANDCUFF_LAYER 25 //Handcuffs, if the human is handcuffed, in a secret inv slot -#define LEGCUFF_LAYER 26 //Same as handcuffs, for legcuffs -#define L_HAND_LAYER 27 //Left-hand item -#define R_HAND_LAYER 28 //Right-hand item -#define WING_LAYER 29 //VOREStation edit. Simply move this up a number if things are added. -#define TAIL_LAYER_ALT 30 //VOREStation edit. Simply move this up a number if things are added. -#define MODIFIER_EFFECTS_LAYER 31 //Effects drawn by modifiers -#define FIRE_LAYER 32 //'Mob on fire' overlay layer -#define WATER_LAYER 33 //'Mob submerged' overlay layer -#define TARGETED_LAYER 34 //'Aimed at' overlay layer -#define TOTAL_LAYERS 34 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. -////////////////////////////////// - -/mob/living/carbon/human - var/list/overlays_standing[TOTAL_LAYERS] - var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed - -//UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING -//I'll work on removing that stuff by rewriting some of the cloaking stuff at a later date. -/mob/living/carbon/human/update_icons() - if(QDESTROYING(src)) - return - - crash_with("CANARY: Old human update_icons was called.") - - update_hud() //TODO: remove the need for this - - //Do any species specific layering updates, such as when hiding. - update_icon_special() - -/mob/living/carbon/human/update_icons_layers() - crash_with("CANARY: Old human update_icons_layers was called.") - -/mob/living/carbon/human/update_icons_all() - crash_with("CANARY: Old human update_icons_all was called.") - -/mob/living/carbon/human/update_icons_huds() - crash_with("CANARY: Old human update_icons_huds was called.") - -/mob/living/carbon/human/update_transform() - /* VOREStation Edit START - // First, get the correct size. - var/desired_scale_x = icon_scale_x - var/desired_scale_y = icon_scale_y - - desired_scale_x *= species.icon_scale_x - desired_scale_y *= species.icon_scale_y - - for(var/datum/modifier/M in modifiers) - if(!isnull(M.icon_scale_x_percent)) - desired_scale_x *= M.icon_scale_x_percent - if(!isnull(M.icon_scale_y_percent)) - desired_scale_y *= M.icon_scale_y_percent - */ - var/desired_scale_x = size_multiplier * icon_scale_x - var/desired_scale_y = size_multiplier * icon_scale_y - desired_scale_x *= species.icon_scale_x - desired_scale_y *= species.icon_scale_y - appearance_flags |= PIXEL_SCALE - if(fuzzy) - appearance_flags &= ~PIXEL_SCALE - //VOREStation Edit End - - // Regular stuff again. - var/matrix/M = matrix() - var/anim_time = 3 - - //Due to some involuntary means, you're laying now - if(lying && !resting && !sleeping) - anim_time = 1 //Thud - - if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone. - M.Turn(90) - M.Scale(desired_scale_y, desired_scale_x)//VOREStation Edit - if(species.icon_height == 64)//VOREStation Edit - M.Translate(13,-22) - else - M.Translate(1,-6) - layer = MOB_LAYER -0.01 // Fix for a byond bug where turf entry order no longer matters - else - M.Scale(desired_scale_x, desired_scale_y)//VOREStation Edit - M.Translate(0, (vis_height/2)*(desired_scale_y-1)) //VOREStation edit - layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters - - animate(src, transform = M, time = anim_time) - update_icon_special() //May contain transform-altering things - - -//DAMAGE OVERLAYS -//constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists -/mob/living/carbon/human/UpdateDamageIcon() - if(QDESTROYING(src)) - return - - remove_layer(DAMAGE_LAYER) - - // first check whether something actually changed about damage appearance - var/damage_appearance = "" - - for(var/obj/item/organ/external/O in organs) - if(isnull(O) || O.is_stump()) - continue - damage_appearance += O.damage_state - - if(damage_appearance == previous_damage_appearance) - // nothing to do here - return - - previous_damage_appearance = damage_appearance - - var/image/standing_image = image(icon = species.damage_overlays, icon_state = "00", layer = BODY_LAYER+DAMAGE_LAYER) - - // blend the individual damage states with our icons - for(var/obj/item/organ/external/O in organs) - if(isnull(O) || O.is_stump()) - continue - - O.update_icon() - if(O.damage_state == "00") continue - var/icon/DI - var/cache_index = "[O.damage_state]/[O.icon_name]/[species.get_blood_colour(src)]/[species.get_bodytype(src)]" - if(damage_icon_parts[cache_index] == null) - DI = icon(species.get_damage_overlays(src), O.damage_state) // the damage icon for whole human - DI.Blend(icon(species.get_damage_mask(src), O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels - DI.Blend(species.get_blood_colour(src), ICON_MULTIPLY) - damage_icon_parts[cache_index] = DI - else - DI = damage_icon_parts[cache_index] - - standing_image.overlays += DI - - overlays_standing[DAMAGE_LAYER] = standing_image - apply_layer(DAMAGE_LAYER) - -//BASE MOB SPRITE -/mob/living/carbon/human/update_icons_body() - if(QDESTROYING(src)) - return - - var/husk_color_mod = rgb(96,88,80) - var/hulk_color_mod = rgb(48,224,40) - - var/husk = (HUSK in src.mutations) - var/fat = (FAT in src.mutations) - var/hulk = (HULK in src.mutations) - var/skeleton = (SKELETON in src.mutations) - - robolimb_count = 0 //TODO, here, really tho? - robobody_count = 0 - - //CACHING: Generate an index key from visible bodyparts. - //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. - - //Create a new, blank icon for our mob to use. - var/icon/stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") - - var/g = (gender == MALE ? "male" : "female") - var/icon_key = "[species.get_race_key(src)][g][s_tone][r_skin][g_skin][b_skin]" - if(lip_style) - icon_key += "[lip_style]" - else - icon_key += "nolips" - var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES] - if(eyes) - icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]" - else - icon_key += "[r_eyes], [g_eyes], [b_eyes]" - var/obj/item/organ/external/head/head = organs_by_name[BP_HEAD] - if(head) - if(!istype(head, /obj/item/organ/external/stump)) - icon_key += "[head.eye_icon]" - for(var/organ_tag in species.has_limbs) - var/obj/item/organ/external/part = organs_by_name[organ_tag] - if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. - icon_key += "0" - continue - if(part) - icon_key += "[part.species.get_race_key(part.owner)]" - icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]" - icon_key += "[part.s_tone]" - if(part.s_col && part.s_col.len >= 3) - icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]" - if(part.body_hair && part.h_col && part.h_col.len >= 3) - icon_key += "[rgb(part.h_col[1],part.h_col[2],part.h_col[3])]" - //VOREStation Edit - Different way of tracking add/mult species - if(species.color_mult) - icon_key += "[ICON_MULTIPLY]" - else - icon_key += "[ICON_ADD]" - //VOREStation Edit End - else - icon_key += "#000000" - for(var/M in part.markings) - icon_key += "[M][part.markings[M]["color"]]" - - if(part.robotic >= ORGAN_ROBOT) - icon_key += "2[part.model ? "-[part.model]": ""]" - robolimb_count++ - if((part.robotic == ORGAN_ROBOT || part.robotic == ORGAN_LIFELIKE) && (part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN)) //VOREStation Edit - Not for nanoform parts - robobody_count ++ - else if(part.status & ORGAN_DEAD) - icon_key += "3" - else - icon_key += "1" - if(part.transparent) //VOREStation Edit. For better slime limbs. Avoids using solid var due to limb dropping. - icon_key += "_t" //VOREStation Edit. - - if(istype(tail_style, /datum/sprite_accessory/tail/taur)) - if(tail_style.clip_mask) //VOREStation Edit. - icon_key += tail_style.clip_mask_state - - icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" - var/icon/base_icon - if(human_icon_cache[icon_key]) - base_icon = human_icon_cache[icon_key] - else - //BEGIN CACHED ICON GENERATION. - var/obj/item/organ/external/chest = get_organ(BP_TORSO) - base_icon = chest.get_icon() - - var/icon/Cutter = null - - if(istype(tail_style, /datum/sprite_accessory/tail/taur)) // Tail icon 'cookie cutters' are filled in where icons are preserved. We need to invert that. - if(tail_style.clip_mask) //VOREStation Edit. - Cutter = new(icon = tail_style.icon, icon_state = tail_style.clip_mask_state) - - Cutter.Blend("#000000", ICON_MULTIPLY) // Make it all black. - - Cutter.SwapColor("#00000000", "#FFFFFFFF") // Everywhere empty, make white. - Cutter.SwapColor("#000000FF", "#00000000") // Everywhere black, make empty. - - Cutter.Blend("#000000", ICON_MULTIPLY) // Black again. - - for(var/obj/item/organ/external/part in organs) - if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. - continue - var/icon/temp = part.get_icon(skeleton) - - if((part.organ_tag in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) && Cutter) - temp.Blend(Cutter, ICON_AND, x = -16) - - //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST - //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) - if(part.icon_position & (LEFT | RIGHT)) - var/icon/temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") //VOREStation Edit. - temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) - temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) - if(!(part.icon_position & LEFT)) - temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) - if(!(part.icon_position & RIGHT)) - temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) - base_icon.Blend(temp2, ICON_OVERLAY) - if(part.icon_position & LEFT) - temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) - if(part.icon_position & RIGHT) - temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) - base_icon.Blend(temp2, ICON_UNDERLAY) - else if(part.icon_position & UNDER) - base_icon.Blend(temp, ICON_UNDERLAY) - else - base_icon.Blend(temp, ICON_OVERLAY) - - if(!skeleton) - if(husk) - base_icon.ColorTone(husk_color_mod) - else if(hulk) - var/list/tone = ReadRGB(hulk_color_mod) - base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3])) - - //Handle husk overlay. - if(husk && ("overlay_husk" in cached_icon_states(species.icobase))) - var/icon/mask = new(base_icon) - var/icon/husk_over = new(species.icobase,"overlay_husk") - mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) - husk_over.Blend(mask, ICON_ADD) - base_icon.Blend(husk_over, ICON_OVERLAY) - - human_icon_cache[icon_key] = base_icon - - //END CACHED ICON GENERATION. - stand_icon.Blend(base_icon,ICON_OVERLAY) - icon = stand_icon - - //tail - update_tail_showing() - update_wing_showing() // VOREStation Edit - -/mob/living/carbon/human/proc/update_skin() - if(QDESTROYING(src)) - return - - remove_layer(SKIN_LAYER) - - var/image/skin = species.update_skin(src) - if(skin) - skin.layer = BODY_LAYER+SKIN_LAYER - overlays_standing[SKIN_LAYER] = skin - apply_layer(SKIN_LAYER) - -/mob/living/carbon/human/proc/update_bloodied() - if(QDESTROYING(src)) - return - - remove_layer(BLOOD_LAYER) - if(!blood_DNA && !feet_blood_DNA) - return - - var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+BLOOD_LAYER) - - //Bloody hands - if(blood_DNA) - var/image/bloodsies = image(icon = species.get_blood_mask(src), icon_state = "bloodyhands", layer = BODY_LAYER+BLOOD_LAYER) - bloodsies.color = hand_blood_color - both.add_overlay(bloodsies) - - //Bloody feet - if(feet_blood_DNA) - var/image/bloodsies = image(icon = species.get_blood_mask(src), icon_state = "shoeblood", layer = BODY_LAYER+BLOOD_LAYER) - bloodsies.color = feet_blood_color - both.add_overlay(bloodsies) - - overlays_standing[BLOOD_LAYER] = both - - apply_layer(BLOOD_LAYER) - -//UNDERWEAR OVERLAY -/mob/living/carbon/human/proc/update_underwear() - if(QDESTROYING(src)) - return - - remove_layer(UNDERWEAR_LAYER) - - if(species.appearance_flags & HAS_UNDERWEAR) - overlays_standing[UNDERWEAR_LAYER] = list() - for(var/category in all_underwear) - if(hide_underwear[category]) - continue - var/datum/category_item/underwear/UWI = all_underwear[category] - var/image/wear = UWI.generate_image(all_underwear_metadata[category], layer = BODY_LAYER+UNDERWEAR_LAYER) - overlays_standing[UNDERWEAR_LAYER] += wear - - apply_layer(UNDERWEAR_LAYER) - -//HAIR OVERLAY -/mob/living/carbon/human/proc/update_hair() - if(QDESTROYING(src)) - return - - //Reset our hair - remove_layer(HAIR_LAYER) - remove_layer(HAIR_ACCESSORY_LAYER) //VOREStation Edit - update_eyes() //Pirated out of here, for glowing eyes. - - var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD) - if(!head_organ || head_organ.is_stump() ) - return - - //masks and helmets can obscure our hair. - if( (head && (head.flags_inv & BLOCKHAIR)) || (wear_mask && (wear_mask.flags_inv & BLOCKHAIR))) - return - - //base icons - var/icon/face_standing = icon(icon = 'icons/mob/human_face.dmi', icon_state = "bald_s") - - if(f_style) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] - if(facial_hair_style && facial_hair_style.species_allowed && (src.species.get_bodytype(src) in facial_hair_style.species_allowed)) - var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_MULTIPLY) //VOREStation edit - - face_standing.Blend(facial_s, ICON_OVERLAY) - - if(h_style) - var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style] - if(head && (head.flags_inv & BLOCKHEADHAIR)) - if(!(hair_style.flags & HAIR_VERY_SHORT)) - hair_style = hair_styles_list["Short Hair"] - - if(hair_style && (src.species.get_bodytype(src) in hair_style.species_allowed)) - var/icon/grad_s = null - var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration) - if(grad_style) - grad_s = new/icon("icon" = 'icons/mob/hair_gradients.dmi', "icon_state" = GLOB.hair_gradients[grad_style]) - grad_s.Blend(hair_s, ICON_AND) - grad_s.Blend(rgb(r_grad, g_grad, b_grad), ICON_MULTIPLY) - hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY) - hair_s.Blend(hair_s_add, ICON_ADD) - if(!isnull(grad_s)) - hair_s.Blend(grad_s, ICON_OVERLAY) - - face_standing.Blend(hair_s, ICON_OVERLAY) - - // VOREStation Edit - START - var/icon/ears_s = get_ears_overlay() - if(ears_s) - face_standing.Blend(ears_s, ICON_OVERLAY) - if(istype(head_organ,/obj/item/organ/external/head/vr)) - var/obj/item/organ/external/head/vr/head_organ_vr = head_organ - overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ_vr.head_offset) - apply_layer(HAIR_LAYER) - return - // VOREStation Edit - END - - if(head_organ.transparent) //VOREStation Edit. For better slime limbs. - face_standing += rgb(,,,120) - - overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER) - apply_layer(HAIR_LAYER) - - // VOREStation Edit - START - var/icon/hair_acc_s = get_hair_accessory_overlay() - var/image/hair_acc_s_image = null - if(hair_acc_s) - if(hair_accessory_style.ignores_lighting) - hair_acc_s_image = image(hair_acc_s) - hair_acc_s_image.plane = PLANE_LIGHTING_ABOVE - hair_acc_s_image.appearance_flags = appearance_flags - if (hair_acc_s_image) - overlays_standing[HAIR_ACCESSORY_LAYER] = hair_acc_s_image - apply_layer(HAIR_ACCESSORY_LAYER) - return - overlays_standing[HAIR_ACCESSORY_LAYER] = image(hair_acc_s, layer = BODY_LAYER+HAIR_ACCESSORY_LAYER) - apply_layer(HAIR_ACCESSORY_LAYER) - // VOREStation Edit - END - -/mob/living/carbon/human/update_eyes() - if(QDESTROYING(src)) - return - - //Reset our eyes - remove_layer(EYES_LAYER) - - //TODO: Probably redo this. I know I wrote it, but... - - //This is ONLY for glowing eyes for now. Boring flat eyes are done by the head's own proc. - if(!species.has_glowing_eyes) - return - - //Our glowy eyes should be hidden if some equipment hides them. - if(!should_have_organ(O_EYES) || (head && (head.flags_inv & BLOCKHAIR)) || (wear_mask && (wear_mask.flags_inv & BLOCKHAIR))) - return - - //Get the head, we'll need it later. - var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD) - if(!head_organ || head_organ.is_stump() ) - return - - //The eyes store the color themselves, funny enough. - var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES] - if(!head_organ.eye_icon) - return - - var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon) - if(eyes) - eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) - else - eyes_icon.Blend(rgb(128,0,0), ICON_ADD) - - var/image/eyes_image = image(eyes_icon) - eyes_image.plane = PLANE_LIGHTING_ABOVE - eyes_image.appearance_flags = appearance_flags - - overlays_standing[EYES_LAYER] = eyes_image - apply_layer(EYES_LAYER) - -/mob/living/carbon/human/update_mutations() - if(QDESTROYING(src)) - return - - remove_layer(MUTATIONS_LAYER) - - if(!LAZYLEN(mutations)) - return //No mutations, no icons. - - //TODO: THIS PROC??? - var/fat - if(FAT in mutations) - fat = "fat" - - var/image/standing = image(icon = 'icons/effects/genetics.dmi', layer = BODY_LAYER+MUTATIONS_LAYER) - var/g = gender == FEMALE ? "f" : "m" - - for(var/datum/dna/gene/gene in dna_genes) - if(!gene.block) - continue - if(gene.is_active(src)) - var/underlay = gene.OnDrawUnderlays(src,g,fat) - if(underlay) - standing.underlays += underlay - - for(var/mut in mutations) - if(LASER) - standing.overlays += "lasereyes_s" //TODO - - overlays_standing[MUTATIONS_LAYER] = standing - apply_layer(MUTATIONS_LAYER) - -/* --------------------------------------- */ -//Recomputes every icon on the mob. Expensive. -//Useful if the species changed, or there's some -//other drastic body-shape change, but otherwise avoid. -/mob/living/carbon/human/regenerate_icons() - ..() - if(transforming || QDELETED(src)) - return - - update_icons_body() - UpdateDamageIcon() - update_mutations() - update_skin() - update_underwear() - update_hair() - update_inv_w_uniform() - update_inv_wear_id() - update_inv_gloves() - update_inv_glasses() - update_inv_ears() - update_inv_shoes() - update_inv_s_store() - update_inv_wear_mask() - update_inv_head() - update_inv_belt() - update_inv_back() - update_inv_wear_suit() - update_inv_r_hand() - update_inv_l_hand() - update_inv_handcuffed() - update_inv_legcuffed() - //update_inv_pockets() //Doesn't do anything - update_fire() - update_water() - update_surgery() - -/* --------------------------------------- */ -//vvvvvv UPDATE_INV PROCS vvvvvv - -/mob/living/carbon/human/update_inv_w_uniform() - if(QDESTROYING(src)) - return - - remove_layer(UNIFORM_LAYER) - - //Shoes can be affected by uniform being drawn onto them - update_inv_shoes() - - if(!w_uniform) - return - - if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space/rig)) - return //Wearing a suit that prevents uniform rendering - - var/obj/item/clothing/under/under = w_uniform - - var/uniform_sprite - - if(under.index) - uniform_sprite = "[INV_W_UNIFORM_DEF_ICON]_[under.index].dmi" - else - uniform_sprite = "[INV_W_UNIFORM_DEF_ICON].dmi" - - //Build a uniform sprite - //VOREStation Edit start. - var/icon/c_mask = tail_style?.clip_mask - if(c_mask) - var/obj/item/clothing/suit/S = wear_suit - if((wear_suit?.flags_inv & HIDETAIL) || (istype(S) && S.taurized)) // Reasons to not mask: 1. If you're wearing a suit that hides the tail or if you're wearing a taurized suit. - c_mask = null - overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = uniform_sprite, default_layer = UNIFORM_LAYER, clip_mask = c_mask) - //VOREStation Edit end. - apply_layer(UNIFORM_LAYER) - -/mob/living/carbon/human/update_inv_wear_id() - if(QDESTROYING(src)) - return - - remove_layer(ID_LAYER) - - if(!wear_id) - return //Not wearing an ID - - //Only draw the ID on the mob if the uniform allows for it - if(w_uniform && istype(w_uniform, /obj/item/clothing/under)) - var/obj/item/clothing/under/U = w_uniform - if(U.displays_id) - overlays_standing[ID_LAYER] = wear_id.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_id_str, default_icon = INV_WEAR_ID_DEF_ICON, default_layer = ID_LAYER) - - apply_layer(ID_LAYER) - -/mob/living/carbon/human/update_inv_gloves() - if(QDESTROYING(src)) - return - - remove_layer(GLOVES_LAYER) - - if(!gloves) - return //No gloves, no reason to be here. - - overlays_standing[GLOVES_LAYER] = gloves.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_gloves_str, default_icon = INV_GLOVES_DEF_ICON, default_layer = GLOVES_LAYER) - - apply_layer(GLOVES_LAYER) - -/mob/living/carbon/human/update_inv_glasses() - if(QDESTROYING(src)) - return - - remove_layer(GLASSES_LAYER) - - if(!glasses) - return //Not wearing glasses, no need to update anything. - - overlays_standing[GLASSES_LAYER] = glasses.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_gloves_str, default_icon = INV_EYES_DEF_ICON, default_layer = GLASSES_LAYER) - - apply_layer(GLASSES_LAYER) - -/mob/living/carbon/human/update_inv_ears() - if(QDESTROYING(src)) - return - - remove_layer(EARS_LAYER) - - if((head && head.flags_inv & (BLOCKHAIR | BLOCKHEADHAIR)) || (wear_mask && wear_mask.flags_inv & (BLOCKHAIR | BLOCKHEADHAIR))) - return //Ears are blocked (by hair being blocked, overloaded) - - if(!l_ear && !r_ear) - return //Why bother, if no ear sprites - - // Blank image upon which to layer left & right overlays. - var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+EARS_LAYER) - - if(l_ear) - var/image/standing = l_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_l_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER) - both.add_overlay(standing) - - if(r_ear) - var/image/standing = r_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_r_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER) - both.add_overlay(standing) - - overlays_standing[EARS_LAYER] = both - apply_layer(EARS_LAYER) - -/mob/living/carbon/human/update_inv_shoes() - if(QDESTROYING(src)) - return - - remove_layer(SHOES_LAYER) - remove_layer(SHOES_LAYER_ALT) //Dumb alternate layer for shoes being under the uniform. - - if(!shoes || (wear_suit && wear_suit.flags_inv & HIDESHOES) || (w_uniform && w_uniform.flags_inv & HIDESHOES)) - return //Either nothing to draw, or it'd be hidden. - - //VOREStation Edit - for(var/f in list(BP_L_FOOT, BP_R_FOOT)) - var/obj/item/organ/external/foot/foot = get_organ(f) - if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear. - return - - //Allow for shoe layer toggle nonsense - var/shoe_layer = SHOES_LAYER - if(istype(shoes, /obj/item/clothing/shoes)) - var/obj/item/clothing/shoes/ushoes = shoes - if(ushoes.shoes_under_pants == 1) - shoe_layer = SHOES_LAYER_ALT - - //NB: the use of a var for the layer on this one - overlays_standing[shoe_layer] = shoes.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_shoes_str, default_icon = INV_FEET_DEF_ICON, default_layer = shoe_layer) - - apply_layer(SHOES_LAYER) - apply_layer(SHOES_LAYER_ALT) - -/mob/living/carbon/human/update_inv_s_store() - if(QDESTROYING(src)) - return - - remove_layer(SUIT_STORE_LAYER) - - if(!s_store) - return //Why bother, nothing there. - - //TODO, this is unlike the rest of the things - //Basically has no variety in slot icon choices at all. WHY SPECIES ONLY?? - var/t_state = s_store.item_state - if(!t_state) - t_state = s_store.icon_state - overlays_standing[SUIT_STORE_LAYER] = image(icon = species.suit_storage_icon, icon_state = t_state, layer = BODY_LAYER+SUIT_STORE_LAYER) - - apply_layer(SUIT_STORE_LAYER) - -/mob/living/carbon/human/update_inv_head() - if(QDESTROYING(src)) - return - - remove_layer(HEAD_LAYER) - - if(!head) - return //No head item, why bother. - - overlays_standing[HEAD_LAYER] = head.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_head_str, default_icon = INV_HEAD_DEF_ICON, default_layer = HEAD_LAYER) - - apply_layer(HEAD_LAYER) - -/mob/living/carbon/human/update_inv_belt() - if(QDESTROYING(src)) - return - - remove_layer(BELT_LAYER) - remove_layer(BELT_LAYER_ALT) //Because you can toggle belt layer with a verb - - if(!belt) - return //No belt, why bother. - - //Toggle for belt layering with uniform - var/belt_layer = BELT_LAYER - if(istype(belt, /obj/item/weapon/storage/belt)) - var/obj/item/weapon/storage/belt/ubelt = belt - if(ubelt.show_above_suit) - belt_layer = BELT_LAYER_ALT - - //NB: this uses a var from above - overlays_standing[belt_layer] = belt.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_belt_str, default_icon = INV_BELT_DEF_ICON, default_layer = belt_layer) - - apply_layer(belt_layer) - -/mob/living/carbon/human/update_inv_wear_suit() - if(QDESTROYING(src)) - return - - remove_layer(SUIT_LAYER) - - //Hide/show other layers if necessary - update_inv_w_uniform() - update_inv_shoes() - update_tail_showing() - update_wing_showing() // VOREStation Edit - - if(!wear_suit) - return //No point, no suit. - - var/obj/item/clothing/suit/suit = wear_suit - var/suit_sprite - - if(istype(suit) && suit.index) - suit_sprite = "[INV_SUIT_DEF_ICON]_[suit.index].dmi" - else if(istype(suit, /obj/item/clothing) && !isnull(suit.update_icon_define)) - suit_sprite = suit.update_icon_define - else - suit_sprite = "[INV_SUIT_DEF_ICON].dmi" - - //VOREStation Edit start. - var/icon/c_mask = null - var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT]) - var/valid_clip_mask = tail_style?.clip_mask - - if(tail_is_rendered && valid_clip_mask && !(istype(suit) && suit.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden. - c_mask = valid_clip_mask - overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = suit_sprite, default_layer = SUIT_LAYER, clip_mask = c_mask) - - //VOREStation Edit end. - - apply_layer(SUIT_LAYER) - -/mob/living/carbon/human/update_inv_pockets() - crash_with("Someone called update_inv_pockets even though it's dumb") - -/mob/living/carbon/human/update_inv_wear_mask() - if(QDESTROYING(src)) - return - - remove_layer(FACEMASK_LAYER) - - if(!wear_mask || (head && head.flags_inv & HIDEMASK)) - return //Why bother, nothing in mask slot. - - overlays_standing[FACEMASK_LAYER] = wear_mask.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_mask_str, default_icon = INV_MASK_DEF_ICON, default_layer = FACEMASK_LAYER) - - apply_layer(FACEMASK_LAYER) - -/mob/living/carbon/human/update_inv_back() - if(QDESTROYING(src)) - return - - remove_layer(BACK_LAYER) - - if(!back) - return //Why do anything - - overlays_standing[BACK_LAYER] = back.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_back_str, default_icon = INV_BACK_DEF_ICON, default_layer = BACK_LAYER) - - apply_layer(BACK_LAYER) - -//TODO: Carbon procs in my human update_icons?? -/mob/living/carbon/human/update_hud() //TODO: do away with this if possible - if(QDESTROYING(src)) - return - - if(client) - client.screen |= contents - if(hud_used) - hud_used.hidden_inventory_update() //Updates the screenloc of the items on the 'other' inventory bar - -//update whether handcuffs appears on our hud. -/mob/living/carbon/proc/update_hud_handcuffed() - if(QDESTROYING(src)) - return - - if(hud_used && hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) - hud_used.l_hand_hud_object.update_icon() - hud_used.r_hand_hud_object.update_icon() - -/mob/living/carbon/human/update_inv_handcuffed() - if(QDESTROYING(src)) - return - - remove_layer(HANDCUFF_LAYER) - update_hud_handcuffed() //TODO - - if(!handcuffed) - return //Not cuffed, why bother - - overlays_standing[HANDCUFF_LAYER] = handcuffed.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_handcuffed_str, default_icon = INV_HCUFF_DEF_ICON, default_layer = HANDCUFF_LAYER) - - apply_layer(HANDCUFF_LAYER) - -/mob/living/carbon/human/update_inv_legcuffed() - if(QDESTROYING(src)) - return - - clear_alert("legcuffed") - remove_layer(LEGCUFF_LAYER) - - if(!legcuffed) - return //Not legcuffed, why bother. - - throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) - - overlays_standing[LEGCUFF_LAYER] = legcuffed.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_legcuffed_str, default_icon = INV_LCUFF_DEF_ICON, default_layer = LEGCUFF_LAYER) - - apply_layer(LEGCUFF_LAYER) - -/mob/living/carbon/human/update_inv_r_hand() - if(QDESTROYING(src)) - return - - remove_layer(R_HAND_LAYER) - - if(!r_hand) - return //No hand, no bother. - - overlays_standing[R_HAND_LAYER] = r_hand.make_worn_icon(body_type = species.get_bodytype(src), inhands = TRUE, slot_name = slot_r_hand_str, default_icon = INV_R_HAND_DEF_ICON, default_layer = R_HAND_LAYER) - - apply_layer(R_HAND_LAYER) - -/mob/living/carbon/human/update_inv_l_hand() - if(QDESTROYING(src)) - return - - remove_layer(L_HAND_LAYER) - - if(!l_hand) - return //No hand, no bother. - - overlays_standing[L_HAND_LAYER] = l_hand.make_worn_icon(body_type = species.get_bodytype(src), inhands = TRUE, slot_name = slot_l_hand_str, default_icon = INV_L_HAND_DEF_ICON, default_layer = L_HAND_LAYER) - - apply_layer(L_HAND_LAYER) - -/mob/living/carbon/human/proc/update_tail_showing() - if(QDESTROYING(src)) - return - - remove_layer(TAIL_LAYER) - remove_layer(TAIL_LAYER_ALT) // VOREStation Edit - START - Alt Tail Layer - - var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER - - var/image/vr_tail_image = get_tail_image() - if(vr_tail_image) - vr_tail_image.layer = BODY_LAYER+used_tail_layer - overlays_standing[used_tail_layer] = vr_tail_image - apply_layer(used_tail_layer) - return - // VOREStation Edit - END - - var/species_tail = species.get_tail(src) // Species tail icon_state prefix. - - //This one is actually not that bad I guess. - if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) - var/icon/tail_s = get_tail_icon() - overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // VOREStation Edit - Alt Tail Layer - animate_tail_reset() - -//TODO: Is this the appropriate place for this, and not on species...? -/mob/living/carbon/human/proc/get_tail_icon() - var/icon_key = "[species.get_race_key(src)][r_skin][g_skin][b_skin][r_hair][g_hair][b_hair]" - var/icon/tail_icon = tail_icon_cache[icon_key] - if(!tail_icon) - //generate a new one - var/species_tail_anim = species.get_tail_animation(src) - if(!species_tail_anim && species.icobase_tail) species_tail_anim = species.icobase //VOREStation Code - Allow override of file for non-animated tails - if(!species_tail_anim) species_tail_anim = 'icons/effects/species.dmi' - tail_icon = new/icon(species_tail_anim) - tail_icon.Blend(rgb(r_skin, g_skin, b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) // VOREStation edit - // The following will not work with animated tails. - var/use_species_tail = species.get_tail_hair(src) - if(use_species_tail) - var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]_s") //VOREStation edit -- Suffix icon state string with '_s' to compensate for diff in .dmi b/w us & Polaris. - hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //VOREStation edit -- Check for species color_mult - tail_icon.Blend(hair_icon, ICON_OVERLAY) - tail_icon_cache[icon_key] = tail_icon - - return tail_icon - -/mob/living/carbon/human/proc/set_tail_state(var/t_state) - var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // VOREStation Edit - START - Alt Tail Layer - var/image/tail_overlay = overlays_standing[used_tail_layer] - - remove_layer(TAIL_LAYER) - remove_layer(TAIL_LAYER_ALT) - - if(tail_overlay) - overlays_standing[used_tail_layer] = tail_overlay - if(species.get_tail_animation(src)) - tail_overlay.icon_state = t_state - . = tail_overlay - - apply_layer(used_tail_layer) // VOREStation Edit - END - -//Not really once, since BYOND can't do that. -//Update this if the ability to flick() images or make looping animation start at the first frame is ever added. -//You can sort of flick images now with flick_overlay -Aro -/mob/living/carbon/human/proc/animate_tail_once() - if(QDESTROYING(src)) - return - - var/t_state = "[species.get_tail(src)]_once" - var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // VOREStation Edit - Alt Tail Layer - - var/image/tail_overlay = overlays_standing[used_tail_layer] // VOREStation Edit - Alt Tail Layer - if(tail_overlay && tail_overlay.icon_state == t_state) - return //let the existing animation finish - - tail_overlay = set_tail_state(t_state) // Calls remove_layer & apply_layer - if(tail_overlay) - spawn(20) - //check that the animation hasn't changed in the meantime - if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // VOREStation Edit - Alt Tail Layer - animate_tail_stop() - -/mob/living/carbon/human/proc/animate_tail_start() - if(QDESTROYING(src)) - return - - set_tail_state("[species.get_tail(src)]_slow[rand(0,9)]") - -/mob/living/carbon/human/proc/animate_tail_fast() - if(QDESTROYING(src)) - return - - set_tail_state("[species.get_tail(src)]_loop[rand(0,9)]") - -/mob/living/carbon/human/proc/animate_tail_reset() - if(QDESTROYING(src)) - return - - if(stat != DEAD) - set_tail_state("[species.get_tail(src)]_idle[rand(0,9)]") - else - set_tail_state("[species.get_tail(src)]_static") - toggle_tail_vr(FALSE) //VOREStation Add - So tails stop when someone dies. TODO - Fix this hack ~Leshana - -/mob/living/carbon/human/proc/animate_tail_stop() - if(QDESTROYING(src)) - return - - set_tail_state("[species.get_tail(src)]_static") - -// VOREStation Edit - Wings! See update_icons_vr.dm for more wing procs -/mob/living/carbon/human/proc/update_wing_showing() - if(QDESTROYING(src)) - return - - remove_layer(WING_LAYER) - - var/image/vr_wing_image = get_wing_image() - if(vr_wing_image) - vr_wing_image.layer = BODY_LAYER+WING_LAYER - overlays_standing[WING_LAYER] = vr_wing_image - - apply_layer(WING_LAYER) -// VOREStation Edit end - -/mob/living/carbon/human/update_modifier_visuals() - if(QDESTROYING(src)) - return - - remove_layer(MODIFIER_EFFECTS_LAYER) - - if(!LAZYLEN(modifiers)) - return //No modifiers, no effects. - - var/image/effects = new() - for(var/datum/modifier/M in modifiers) - if(M.mob_overlay_state) - var/image/I = image(icon = 'icons/mob/modifier_effects.dmi', icon_state = M.mob_overlay_state) - effects.overlays += I //TODO, this compositing is annoying. - - overlays_standing[MODIFIER_EFFECTS_LAYER] = effects - - apply_layer(MODIFIER_EFFECTS_LAYER) - -/mob/living/carbon/human/update_fire() - if(QDESTROYING(src)) - return - - remove_layer(FIRE_LAYER) - - if(!on_fire) - return - - overlays_standing[FIRE_LAYER] = image(icon = 'icons/mob/OnFire.dmi', icon_state = get_fire_icon_state(), layer = BODY_LAYER+FIRE_LAYER) - - apply_layer(FIRE_LAYER) - -/mob/living/carbon/human/update_water() - if(QDESTROYING(src)) - return - - remove_layer(WATER_LAYER) - - var/depth = check_submerged() - if(!depth || lying) - return - - var/atom/A = loc // We'd better be swimming and on a turf - var/image/I = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+WATER_LAYER) //TODO: Improve - I.color = A.color - overlays_standing[WATER_LAYER] = I - - apply_layer(WATER_LAYER) - -/mob/living/carbon/human/proc/update_surgery() - if(QDESTROYING(src)) - return - - remove_layer(SURGERY_LAYER) - - var/image/total = new - for(var/obj/item/organ/external/E in organs) - if(E.open) - var/image/I = image(icon = 'icons/mob/surgery.dmi', icon_state = "[E.icon_name][round(E.open)]", layer = BODY_LAYER+SURGERY_LAYER) - total.overlays += I //TODO: This compositing is annoying - - if(total.overlays.len) - overlays_standing[SURGERY_LAYER] = total - apply_layer(SURGERY_LAYER) - -//Human Overlays Indexes///////// -#undef MUTATIONS_LAYER -#undef SKIN_LAYER -#undef DAMAGE_LAYER -#undef SURGERY_LAYER -#undef UNDERWEAR_LAYER -#undef SHOES_LAYER_ALT -#undef UNIFORM_LAYER -#undef ID_LAYER -#undef SHOES_LAYER -#undef GLOVES_LAYER -#undef BELT_LAYER -#undef SUIT_LAYER -#undef TAIL_LAYER -#undef GLASSES_LAYER -#undef BELT_LAYER_ALT -#undef SUIT_STORE_LAYER -#undef BACK_LAYER -#undef HAIR_LAYER -#undef EARS_LAYER -#undef EYES_LAYER -#undef FACEMASK_LAYER -#undef HEAD_LAYER -#undef COLLAR_LAYER -#undef HANDCUFF_LAYER -#undef LEGCUFF_LAYER -#undef L_HAND_LAYER -#undef R_HAND_LAYER -#undef MODIFIER_EFFECTS_LAYER -#undef FIRE_LAYER -#undef WATER_LAYER -#undef TARGETED_LAYER -#undef TOTAL_LAYERS +/* + Global associative list for caching humanoid icons. + Index format m or f, followed by a string of 0 and 1 to represent bodyparts followed by husk fat hulk skeleton 1 or 0. +*/ +var/global/list/human_icon_cache = list() //key is incredibly complex, see update_icons_body() +var/global/list/tail_icon_cache = list() //key is [species.race_key][r_skin][g_skin][b_skin] +var/global/list/wing_icon_cache = list() // See tail. +var/global/list/light_overlay_cache = list() //see make_worn_icon() on helmets +var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() + +//////////////////////////////////////////////////////////////////////////////////////////////// +// # Human Icon Updating System +// +// This system takes care of the "icon" for human mobs. Of course humans don't just have a single +// icon+icon_state, but a combination of dozens of little sprites including including the body, +// clothing, equipment, in-universe HUD images, etc. +// +// # Basic Operation +// Whenever you do something that should update the on-mob appearance of a worn or held item, You +// will need to call the relevant update_inv_* proc. All of these are named after the variable they +// update from. They are defined at the /mob level so you don't even need to cast to carbon/human. +// +// The new system leverages SSoverlays to actually add/remove the overlays from mob.overlays +// Since SSoverlays already manages batching updates to reduce apperance churn etc, we don't need +// to worry about that. (In short, you can call add/cut overlay as many times as you want, it will +// only get assigned to the mob once per tick.) +// As a corrolary, this means users of this system do NOT need to tell the system when you're done +// making changes. +// +// There are also these special cases: +// update_icons_body() //Handles updating your mob's icon to reflect their gender/race/complexion etc +// UpdateDamageIcon() //Handles damage overlays for brute/burn damage //(will rename this when I geta round to it) ~Carn +// update_skin() //Handles updating skin for species that have a skin overlay. +// update_bloodied() //Handles adding/clearing the blood overlays for hands & feet. Call when bloodied or cleaned. +// update_underwear() //Handles updating the sprite for underwear. +// update_hair() //Handles updating your hair and eyes overlay +// update_mutations() //Handles updating your appearance for certain mutations. e.g TK head-glows +// update_fire() //Handles overlay from being on fire. +// update_water() //Handles overlay from being submerged. +// update_surgery() //Handles overlays from open external organs. +// +// # History (i.e. I'm used to the old way, what is different?) +// You used to have to call update_icons(FALSE) if you planned to make more changes, and call update_icons(TRUE) +// on the final update. All that is gone, just call update_inv_whatever() and it handles the rest. +// +//////////////////////////////////////////////////////////////////////////////////////////////// + +//Add an entry to overlays, assuming it exists +/mob/living/carbon/human/proc/apply_layer(cache_index) + if((. = overlays_standing[cache_index])) + add_overlay(.) + +//Remove an entry from overlays, and from the list +/mob/living/carbon/human/proc/remove_layer(cache_index) + var/I = overlays_standing[cache_index] + if(I) + cut_overlay(I) + overlays_standing[cache_index] = null + +// These are used as the layers for the icons, as well as indexes in a list that holds onto them. +// Technically the layers used are all -100+layer to make them FLOAT_LAYER overlays. +//Human Overlays Indexes///////// +#define MUTATIONS_LAYER 1 //Mutations like fat, and lasereyes +#define SKIN_LAYER 2 //Skin things added by a call on species +#define BLOOD_LAYER 3 //Bloodied hands/feet/anything else +#define DAMAGE_LAYER 4 //Injury overlay sprites like open wounds +#define SURGERY_LAYER 5 //Overlays for open surgical sites +#define UNDERWEAR_LAYER 6 //Underwear/bras/etc +#define SHOES_LAYER_ALT 7 //Shoe-slot item (when set to be under uniform via verb) +#define UNIFORM_LAYER 8 //Uniform-slot item +#define ID_LAYER 9 //ID-slot item +#define SHOES_LAYER 10 //Shoe-slot item +#define GLOVES_LAYER 11 //Glove-slot item +#define BELT_LAYER 12 //Belt-slot item +#define SUIT_LAYER 13 //Suit-slot item +#define TAIL_LAYER 14 //Some species have tails to render +#define GLASSES_LAYER 15 //Eye-slot item +#define BELT_LAYER_ALT 16 //Belt-slot item (when set to be above suit via verb) +#define SUIT_STORE_LAYER 17 //Suit storage-slot item +#define BACK_LAYER 18 //Back-slot item +#define HAIR_LAYER 19 //The human's hair +#define HAIR_ACCESSORY_LAYER 20 //VOREStation edit. Simply move this up a number if things are added. +#define EARS_LAYER 21 //Both ear-slot items (combined image) +#define EYES_LAYER 22 //Mob's eyes (used for glowing eyes) +#define FACEMASK_LAYER 23 //Mask-slot item +#define HEAD_LAYER 24 //Head-slot item +#define HANDCUFF_LAYER 25 //Handcuffs, if the human is handcuffed, in a secret inv slot +#define LEGCUFF_LAYER 26 //Same as handcuffs, for legcuffs +#define L_HAND_LAYER 27 //Left-hand item +#define R_HAND_LAYER 28 //Right-hand item +#define WING_LAYER 29 //Wings or protrusions over the suit. +#define TAIL_LAYER_ALT 30 //Modified tail-sprite layer. Tend to be larger. +#define MODIFIER_EFFECTS_LAYER 31 //Effects drawn by modifiers +#define FIRE_LAYER 32 //'Mob on fire' overlay layer +#define WATER_LAYER 33 //'Mob submerged' overlay layer +#define TARGETED_LAYER 34 //'Aimed at' overlay layer +#define TOTAL_LAYERS 34 //VOREStation edit. <---- KEEP THIS UPDATED, should always equal the highest number here, used to initialize a list. +////////////////////////////////// + +/mob/living/carbon/human + var/list/overlays_standing[TOTAL_LAYERS] + var/previous_damage_appearance // store what the body last looked like, so we only have to update it if something changed + +//UPDATES OVERLAYS FROM OVERLAYS_LYING/OVERLAYS_STANDING +//I'll work on removing that stuff by rewriting some of the cloaking stuff at a later date. +/mob/living/carbon/human/update_icons() + if(QDESTROYING(src)) + return + + crash_with("CANARY: Old human update_icons was called.") + + update_hud() //TODO: remove the need for this + + //Do any species specific layering updates, such as when hiding. + update_icon_special() + +/mob/living/carbon/human/update_icons_layers() + crash_with("CANARY: Old human update_icons_layers was called.") + +/mob/living/carbon/human/update_icons_all() + crash_with("CANARY: Old human update_icons_all was called.") + +/mob/living/carbon/human/update_icons_huds() + crash_with("CANARY: Old human update_icons_huds was called.") + +/mob/living/carbon/human/update_transform() + /* VOREStation Edit START + // First, get the correct size. + var/desired_scale_x = icon_scale_x + var/desired_scale_y = icon_scale_y + + desired_scale_x *= species.icon_scale_x + desired_scale_y *= species.icon_scale_y + + for(var/datum/modifier/M in modifiers) + if(!isnull(M.icon_scale_x_percent)) + desired_scale_x *= M.icon_scale_x_percent + if(!isnull(M.icon_scale_y_percent)) + desired_scale_y *= M.icon_scale_y_percent + */ + var/desired_scale_x = size_multiplier * icon_scale_x + var/desired_scale_y = size_multiplier * icon_scale_y + desired_scale_x *= species.icon_scale_x + desired_scale_y *= species.icon_scale_y + appearance_flags |= PIXEL_SCALE + if(fuzzy) + appearance_flags &= ~PIXEL_SCALE + //VOREStation Edit End + + // Regular stuff again. + var/matrix/M = matrix() + var/anim_time = 3 + + //Due to some involuntary means, you're laying now + if(lying && !resting && !sleeping) + anim_time = 1 //Thud + + if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone. + M.Turn(90) + M.Scale(desired_scale_y, desired_scale_x)//VOREStation Edit + if(species.icon_height == 64)//VOREStation Edit + M.Translate(13,-22) + else + M.Translate(1,-6) + layer = MOB_LAYER -0.01 // Fix for a byond bug where turf entry order no longer matters + else + M.Scale(desired_scale_x, desired_scale_y)//VOREStation Edit + M.Translate(0, (vis_height/2)*(desired_scale_y-1)) //VOREStation edit + layer = MOB_LAYER // Fix for a byond bug where turf entry order no longer matters + + animate(src, transform = M, time = anim_time) + update_icon_special() //May contain transform-altering things + +//DAMAGE OVERLAYS +//constructs damage icon for each organ from mask * damage field and saves it in our overlays_ lists +/mob/living/carbon/human/UpdateDamageIcon() + if(QDESTROYING(src)) + return + + remove_layer(DAMAGE_LAYER) + + // first check whether something actually changed about damage appearance + var/damage_appearance = "" + + for(var/obj/item/organ/external/O in organs) + if(isnull(O) || O.is_stump()) + continue + damage_appearance += O.damage_state + + if(damage_appearance == previous_damage_appearance) + // nothing to do here + return + + previous_damage_appearance = damage_appearance + + var/image/standing_image = image(icon = species.damage_overlays, icon_state = "00", layer = BODY_LAYER+DAMAGE_LAYER) + + // blend the individual damage states with our icons + for(var/obj/item/organ/external/O in organs) + if(isnull(O) || O.is_stump() || O.is_hidden_by_tail()) + continue + + O.update_icon() + if(O.damage_state == "00") continue + var/icon/DI + var/cache_index = "[O.damage_state]/[O.icon_name]/[species.get_blood_colour(src)]/[species.get_bodytype(src)]" + if(damage_icon_parts[cache_index] == null) + DI = icon(species.get_damage_overlays(src), O.damage_state) // the damage icon for whole human + DI.Blend(icon(species.get_damage_mask(src), O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels + DI.Blend(species.get_blood_colour(src), ICON_MULTIPLY) + damage_icon_parts[cache_index] = DI + else + DI = damage_icon_parts[cache_index] + + standing_image.overlays += DI + + overlays_standing[DAMAGE_LAYER] = standing_image + apply_layer(DAMAGE_LAYER) + +//BASE MOB SPRITE +/mob/living/carbon/human/update_icons_body() + if(QDESTROYING(src)) + return + + var/husk_color_mod = rgb(96,88,80) + var/hulk_color_mod = rgb(48,224,40) + + var/husk = (HUSK in src.mutations) + var/fat = (FAT in src.mutations) + var/hulk = (HULK in src.mutations) + var/skeleton = (SKELETON in src.mutations) + + robolimb_count = 0 //TODO, here, really tho? + robobody_count = 0 + + //CACHING: Generate an index key from visible bodyparts. + //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. + + //Create a new, blank icon for our mob to use. + var/icon/stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") + + var/g = (gender == MALE ? "male" : "female") + var/icon_key = "[species.get_race_key(src)][g][s_tone][r_skin][g_skin][b_skin]" + if(lip_style) + icon_key += "[lip_style]" + else + icon_key += "nolips" + var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES] + if(eyes) + icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]" + else + icon_key += "[r_eyes], [g_eyes], [b_eyes]" + var/obj/item/organ/external/head/head = organs_by_name[BP_HEAD] + if(head) + if(!istype(head, /obj/item/organ/external/stump)) + icon_key += "[head.eye_icon]" + for(var/organ_tag in species.has_limbs) + var/obj/item/organ/external/part = organs_by_name[organ_tag] + if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. + icon_key += "0" + continue + if(part) + icon_key += "[part.species.get_race_key(part.owner)]" + icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]" + icon_key += "[part.s_tone]" + if(part.s_col && part.s_col.len >= 3) + icon_key += "[rgb(part.s_col[1],part.s_col[2],part.s_col[3])]" + if(part.body_hair && part.h_col && part.h_col.len >= 3) + icon_key += "[rgb(part.h_col[1],part.h_col[2],part.h_col[3])]" + if(species.color_mult) + icon_key += "[ICON_MULTIPLY]" + else + icon_key += "[ICON_ADD]" + else + icon_key += "#000000" + + for(var/M in part.markings) + icon_key += "[M][part.markings[M]["color"]]" + + if(part.robotic >= ORGAN_ROBOT) + icon_key += "2[part.model ? "-[part.model]": ""]" + robolimb_count++ + if((part.robotic == ORGAN_ROBOT || part.robotic == ORGAN_LIFELIKE) && (part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN)) + robobody_count ++ + else if(part.status & ORGAN_DEAD) + icon_key += "3" + else + icon_key += "1" + if(part.transparent) //VOREStation Edit. For better slime limbs. Avoids using solid var due to limb dropping. + icon_key += "_t" //VOREStation Edit. + + if(istype(tail_style, /datum/sprite_accessory/tail/taur)) + if(tail_style.clip_mask) //VOREStation Edit. + icon_key += tail_style.clip_mask_state + + icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]" + var/icon/base_icon + if(human_icon_cache[icon_key]) + base_icon = human_icon_cache[icon_key] + else + //BEGIN CACHED ICON GENERATION. + var/obj/item/organ/external/chest = get_organ(BP_TORSO) + base_icon = chest.get_icon() + + var/icon/Cutter = null + + if(istype(tail_style, /datum/sprite_accessory/tail/taur)) // Tail icon 'cookie cutters' are filled in where icons are preserved. We need to invert that. + if(tail_style.clip_mask) //VOREStation Edit. + Cutter = new(icon = tail_style.icon, icon_state = tail_style.clip_mask_state) + + Cutter.Blend("#000000", ICON_MULTIPLY) // Make it all black. + + Cutter.SwapColor("#00000000", "#FFFFFFFF") // Everywhere empty, make white. + Cutter.SwapColor("#000000FF", "#00000000") // Everywhere black, make empty. + + Cutter.Blend("#000000", ICON_MULTIPLY) // Black again. + + for(var/obj/item/organ/external/part in organs) + if(isnull(part) || part.is_stump() || part.is_hidden_by_tail()) //VOREStation Edit allowing tails to prevent bodyparts rendering, granting more spriter freedom for taur/digitigrade stuff. + continue + var/icon/temp = part.get_icon(skeleton) + + if((part.organ_tag in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)) && Cutter) + temp.Blend(Cutter, ICON_AND, x = -16) + + //That part makes left and right legs drawn topmost and lowermost when human looks WEST or EAST + //And no change in rendering for other parts (they icon_position is 0, so goes to 'else' part) + if(part.icon_position & (LEFT | RIGHT)) + var/icon/temp2 = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi', icon_state = "blank") + temp2.Insert(new/icon(temp,dir=NORTH),dir=NORTH) + temp2.Insert(new/icon(temp,dir=SOUTH),dir=SOUTH) + if(!(part.icon_position & LEFT)) + temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) + if(!(part.icon_position & RIGHT)) + temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) + base_icon.Blend(temp2, ICON_OVERLAY) + if(part.icon_position & LEFT) + temp2.Insert(new/icon(temp,dir=EAST),dir=EAST) + if(part.icon_position & RIGHT) + temp2.Insert(new/icon(temp,dir=WEST),dir=WEST) + base_icon.Blend(temp2, ICON_UNDERLAY) + else if(part.icon_position & UNDER) + base_icon.Blend(temp, ICON_UNDERLAY) + else + base_icon.Blend(temp, ICON_OVERLAY) + + if(!skeleton) + if(husk) + base_icon.ColorTone(husk_color_mod) + else if(hulk) + var/list/tone = ReadRGB(hulk_color_mod) + base_icon.MapColors(rgb(tone[1],0,0),rgb(0,tone[2],0),rgb(0,0,tone[3])) + + //Handle husk overlay. + if(husk && ("overlay_husk" in cached_icon_states(species.icobase))) + var/icon/mask = new(base_icon) + var/icon/husk_over = new(species.icobase,"overlay_husk") + mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) + husk_over.Blend(mask, ICON_ADD) + base_icon.Blend(husk_over, ICON_OVERLAY) + + human_icon_cache[icon_key] = base_icon + + //END CACHED ICON GENERATION. + stand_icon.Blend(base_icon,ICON_OVERLAY) + icon = stand_icon + + //tail + update_tail_showing() + update_wing_showing() + +/mob/living/carbon/human/proc/update_skin() + if(QDESTROYING(src)) + return + + remove_layer(SKIN_LAYER) + + var/image/skin = species.update_skin(src) + if(skin) + skin.layer = BODY_LAYER+SKIN_LAYER + overlays_standing[SKIN_LAYER] = skin + apply_layer(SKIN_LAYER) + +/mob/living/carbon/human/proc/update_bloodied() + if(QDESTROYING(src)) + return + + remove_layer(BLOOD_LAYER) + if(!blood_DNA && !feet_blood_DNA) + return + + var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+BLOOD_LAYER) + + //Bloody hands + if(blood_DNA) + var/image/bloodsies = image(icon = species.get_blood_mask(src), icon_state = "bloodyhands", layer = BODY_LAYER+BLOOD_LAYER) + bloodsies.color = hand_blood_color + both.add_overlay(bloodsies) + + //Bloody feet + if(feet_blood_DNA) + var/image/bloodsies = image(icon = species.get_blood_mask(src), icon_state = "shoeblood", layer = BODY_LAYER+BLOOD_LAYER) + bloodsies.color = feet_blood_color + both.add_overlay(bloodsies) + + overlays_standing[BLOOD_LAYER] = both + + apply_layer(BLOOD_LAYER) + +//UNDERWEAR OVERLAY +/mob/living/carbon/human/proc/update_underwear() + if(QDESTROYING(src)) + return + + remove_layer(UNDERWEAR_LAYER) + + if(species.appearance_flags & HAS_UNDERWEAR) + overlays_standing[UNDERWEAR_LAYER] = list() + for(var/category in all_underwear) + if(hide_underwear[category]) + continue + var/datum/category_item/underwear/UWI = all_underwear[category] + var/image/wear = UWI.generate_image(all_underwear_metadata[category], layer = BODY_LAYER+UNDERWEAR_LAYER) + overlays_standing[UNDERWEAR_LAYER] += wear + + apply_layer(UNDERWEAR_LAYER) + +//HAIR OVERLAY +/mob/living/carbon/human/proc/update_hair() + if(QDESTROYING(src)) + return + + //Reset our hair + remove_layer(HAIR_LAYER) + remove_layer(HAIR_ACCESSORY_LAYER) //VOREStation Edit + update_eyes() //Pirated out of here, for glowing eyes. + + var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD) + if(!head_organ || head_organ.is_stump() ) + return + + //masks and helmets can obscure our hair. + if( (head && (head.flags_inv & BLOCKHAIR)) || (wear_mask && (wear_mask.flags_inv & BLOCKHAIR))) + return + + //base icons + var/icon/face_standing = icon(icon = 'icons/mob/human_face.dmi', icon_state = "bald_s") + + if(f_style) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style] + if(facial_hair_style && facial_hair_style.species_allowed && (src.species.get_bodytype(src) in facial_hair_style.species_allowed)) + var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + if(facial_hair_style.do_colouration) + facial_s.Blend(rgb(r_facial, g_facial, b_facial), facial_hair_style.color_blend_mode) + + face_standing.Blend(facial_s, ICON_OVERLAY) + + if(h_style) + var/datum/sprite_accessory/hair/hair_style = hair_styles_list[h_style] + if(head && (head.flags_inv & BLOCKHEADHAIR)) + if(!(hair_style.flags & HAIR_VERY_SHORT)) + hair_style = hair_styles_list["Short Hair"] + + if(hair_style && (src.species.get_bodytype(src) in hair_style.species_allowed)) + var/icon/grad_s = null + var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") + var/icon/hair_s_add = new/icon("icon" = hair_style.icon_add, "icon_state" = "[hair_style.icon_state]_s") + if(hair_style.do_colouration) + if(grad_style) + grad_s = new/icon("icon" = 'icons/mob/hair_gradients.dmi', "icon_state" = GLOB.hair_gradients[grad_style]) + grad_s.Blend(hair_s, ICON_AND) + grad_s.Blend(rgb(r_grad, g_grad, b_grad), ICON_MULTIPLY) + hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_MULTIPLY) + hair_s.Blend(hair_s_add, ICON_ADD) + if(!isnull(grad_s)) + hair_s.Blend(grad_s, ICON_OVERLAY) + + face_standing.Blend(hair_s, ICON_OVERLAY) + + if(head_organ.nonsolid || head_organ.transparent) + face_standing += rgb(,,,120) + + var/icon/ears_s = get_ears_overlay() + if(ears_s) + face_standing.Blend(ears_s, ICON_OVERLAY) + + overlays_standing[HAIR_LAYER] = image(face_standing, layer = BODY_LAYER+HAIR_LAYER, "pixel_y" = head_organ.head_offset) + apply_layer(HAIR_LAYER) + return + + // VOREStation Edit - START + var/icon/hair_acc_s = get_hair_accessory_overlay() + var/image/hair_acc_s_image = null + if(hair_acc_s) + if(hair_accessory_style.ignores_lighting) + hair_acc_s_image = image(hair_acc_s) + hair_acc_s_image.plane = PLANE_LIGHTING_ABOVE + hair_acc_s_image.appearance_flags = appearance_flags + if (hair_acc_s_image) + overlays_standing[HAIR_ACCESSORY_LAYER] = hair_acc_s_image + apply_layer(HAIR_ACCESSORY_LAYER) + return + overlays_standing[HAIR_ACCESSORY_LAYER] = image(hair_acc_s, layer = BODY_LAYER+HAIR_ACCESSORY_LAYER) + apply_layer(HAIR_ACCESSORY_LAYER) + // VOREStation Edit - END + +/mob/living/carbon/human/update_eyes() + if(QDESTROYING(src)) + return + + //Reset our eyes + remove_layer(EYES_LAYER) + + //TODO: Probably redo this. I know I wrote it, but... + + //This is ONLY for glowing eyes for now. Boring flat eyes are done by the head's own proc. + if(!species.has_glowing_eyes) + return + + //Our glowy eyes should be hidden if some equipment hides them. + if(!should_have_organ(O_EYES) || (head && (head.flags_inv & BLOCKHAIR)) || (wear_mask && (wear_mask.flags_inv & BLOCKHAIR))) + return + + //Get the head, we'll need it later. + var/obj/item/organ/external/head/head_organ = get_organ(BP_HEAD) + if(!head_organ || head_organ.is_stump() ) + return + + //The eyes store the color themselves, funny enough. + var/obj/item/organ/internal/eyes/eyes = internal_organs_by_name[O_EYES] + if(!head_organ.eye_icon) + return + + var/icon/eyes_icon = new/icon(head_organ.eye_icon_location, head_organ.eye_icon) + if(eyes) + eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) + else + eyes_icon.Blend(rgb(128,0,0), ICON_ADD) + + var/image/eyes_image = image(eyes_icon) + eyes_image.plane = PLANE_LIGHTING_ABOVE + eyes_image.appearance_flags = appearance_flags + + overlays_standing[EYES_LAYER] = eyes_image + apply_layer(EYES_LAYER) + +/mob/living/carbon/human/update_mutations() + if(QDESTROYING(src)) + return + + remove_layer(MUTATIONS_LAYER) + + if(!LAZYLEN(mutations)) + return //No mutations, no icons. + + //TODO: THIS PROC??? + var/fat + if(FAT in mutations) + fat = "fat" + + var/image/standing = image(icon = 'icons/effects/genetics.dmi', layer = BODY_LAYER+MUTATIONS_LAYER) + var/g = gender == FEMALE ? "f" : "m" + + for(var/datum/dna/gene/gene in dna_genes) + if(!gene.block) + continue + if(gene.is_active(src)) + var/underlay = gene.OnDrawUnderlays(src,g,fat) + if(underlay) + standing.underlays += underlay + + for(var/mut in mutations) + if(LASER) + standing.overlays += "lasereyes_s" //TODO + + overlays_standing[MUTATIONS_LAYER] = standing + apply_layer(MUTATIONS_LAYER) + +/* --------------------------------------- */ +//Recomputes every icon on the mob. Expensive. +//Useful if the species changed, or there's some +//other drastic body-shape change, but otherwise avoid. +/mob/living/carbon/human/regenerate_icons() + ..() + if(transforming || QDELETED(src)) + return + + update_icons_body() + UpdateDamageIcon() + update_mutations() + update_skin() + update_underwear() + update_hair() + update_inv_w_uniform() + update_inv_wear_id() + update_inv_gloves() + update_inv_glasses() + update_inv_ears() + update_inv_shoes() + update_inv_s_store() + update_inv_wear_mask() + update_inv_head() + update_inv_belt() + update_inv_back() + update_inv_wear_suit() + update_inv_r_hand() + update_inv_l_hand() + update_inv_handcuffed() + update_inv_legcuffed() + //update_inv_pockets() //Doesn't do anything + update_fire() + update_water() + update_surgery() + +/* --------------------------------------- */ +//vvvvvv UPDATE_INV PROCS vvvvvv + +/mob/living/carbon/human/update_inv_w_uniform() + if(QDESTROYING(src)) + return + + remove_layer(UNIFORM_LAYER) + + //Shoes can be affected by uniform being drawn onto them + update_inv_shoes() + + if(!w_uniform) + return + + if(wear_suit && (wear_suit.flags_inv & HIDEJUMPSUIT) && !istype(wear_suit, /obj/item/clothing/suit/space/rig)) + return //Wearing a suit that prevents uniform rendering + + var/obj/item/clothing/under/under = w_uniform + + var/uniform_sprite + + if(under.index) + uniform_sprite = "[INV_W_UNIFORM_DEF_ICON]_[under.index].dmi" + else + uniform_sprite = "[INV_W_UNIFORM_DEF_ICON].dmi" + + //Build a uniform sprite + var/icon/c_mask = tail_style?.clip_mask + if(c_mask) + var/obj/item/clothing/suit/S = wear_suit + if((wear_suit?.flags_inv & HIDETAIL) || (istype(S) && S.taurized)) // Reasons to not mask: 1. If you're wearing a suit that hides the tail or if you're wearing a taurized suit. + c_mask = null + overlays_standing[UNIFORM_LAYER] = w_uniform.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_w_uniform_str, default_icon = uniform_sprite, default_layer = UNIFORM_LAYER, clip_mask = c_mask) + apply_layer(UNIFORM_LAYER) + +/mob/living/carbon/human/update_inv_wear_id() + if(QDESTROYING(src)) + return + + remove_layer(ID_LAYER) + + if(!wear_id) + return //Not wearing an ID + + //Only draw the ID on the mob if the uniform allows for it + if(w_uniform && istype(w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/U = w_uniform + if(U.displays_id) + overlays_standing[ID_LAYER] = wear_id.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_id_str, default_icon = INV_WEAR_ID_DEF_ICON, default_layer = ID_LAYER) + + apply_layer(ID_LAYER) + +/mob/living/carbon/human/update_inv_gloves() + if(QDESTROYING(src)) + return + + remove_layer(GLOVES_LAYER) + + if(!gloves) + return //No gloves, no reason to be here. + + overlays_standing[GLOVES_LAYER] = gloves.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_gloves_str, default_icon = INV_GLOVES_DEF_ICON, default_layer = GLOVES_LAYER) + + apply_layer(GLOVES_LAYER) + +/mob/living/carbon/human/update_inv_glasses() + if(QDESTROYING(src)) + return + + remove_layer(GLASSES_LAYER) + + if(!glasses) + return //Not wearing glasses, no need to update anything. + + overlays_standing[GLASSES_LAYER] = glasses.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_gloves_str, default_icon = INV_EYES_DEF_ICON, default_layer = GLASSES_LAYER) + + apply_layer(GLASSES_LAYER) + +/mob/living/carbon/human/update_inv_ears() + if(QDESTROYING(src)) + return + + remove_layer(EARS_LAYER) + + if((head && head.flags_inv & (BLOCKHAIR | BLOCKHEADHAIR)) || (wear_mask && wear_mask.flags_inv & (BLOCKHAIR | BLOCKHEADHAIR))) + return //Ears are blocked (by hair being blocked, overloaded) + + if(!l_ear && !r_ear) + return //Why bother, if no ear sprites + + // Blank image upon which to layer left & right overlays. + var/image/both = image(icon = 'icons/effects/effects.dmi', icon_state = "nothing", layer = BODY_LAYER+EARS_LAYER) + + if(l_ear) + var/image/standing = l_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_l_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER) + both.add_overlay(standing) + + if(r_ear) + var/image/standing = r_ear.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_r_ear_str, default_icon = INV_EARS_DEF_ICON, default_layer = EARS_LAYER) + both.add_overlay(standing) + + overlays_standing[EARS_LAYER] = both + apply_layer(EARS_LAYER) + +/mob/living/carbon/human/update_inv_shoes() + if(QDESTROYING(src)) + return + + remove_layer(SHOES_LAYER) + remove_layer(SHOES_LAYER_ALT) //Dumb alternate layer for shoes being under the uniform. + + if(!shoes || (wear_suit && wear_suit.flags_inv & HIDESHOES) || (w_uniform && w_uniform.flags_inv & HIDESHOES)) + return //Either nothing to draw, or it'd be hidden. + + for(var/f in list(BP_L_FOOT, BP_R_FOOT)) + var/obj/item/organ/external/foot/foot = get_organ(f) + if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear. + return + + //Allow for shoe layer toggle nonsense + var/shoe_layer = SHOES_LAYER + if(istype(shoes, /obj/item/clothing/shoes)) + var/obj/item/clothing/shoes/ushoes = shoes + if(ushoes.shoes_under_pants == 1) + shoe_layer = SHOES_LAYER_ALT + + //NB: the use of a var for the layer on this one + overlays_standing[shoe_layer] = shoes.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_shoes_str, default_icon = INV_FEET_DEF_ICON, default_layer = shoe_layer) + + apply_layer(SHOES_LAYER) + apply_layer(SHOES_LAYER_ALT) + +/mob/living/carbon/human/update_inv_s_store() + if(QDESTROYING(src)) + return + + remove_layer(SUIT_STORE_LAYER) + + if(!s_store) + return //Why bother, nothing there. + + //TODO, this is unlike the rest of the things + //Basically has no variety in slot icon choices at all. WHY SPECIES ONLY?? + var/t_state = s_store.item_state + if(!t_state) + t_state = s_store.icon_state + overlays_standing[SUIT_STORE_LAYER] = image(icon = species.suit_storage_icon, icon_state = t_state, layer = BODY_LAYER+SUIT_STORE_LAYER) + + apply_layer(SUIT_STORE_LAYER) + +/mob/living/carbon/human/update_inv_head() + if(QDESTROYING(src)) + return + + remove_layer(HEAD_LAYER) + + if(!head) + return //No head item, why bother. + + overlays_standing[HEAD_LAYER] = head.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_head_str, default_icon = INV_HEAD_DEF_ICON, default_layer = HEAD_LAYER) + + apply_layer(HEAD_LAYER) + +/mob/living/carbon/human/update_inv_belt() + if(QDESTROYING(src)) + return + + remove_layer(BELT_LAYER) + remove_layer(BELT_LAYER_ALT) //Because you can toggle belt layer with a verb + + if(!belt) + return //No belt, why bother. + + //Toggle for belt layering with uniform + var/belt_layer = BELT_LAYER + if(istype(belt, /obj/item/weapon/storage/belt)) + var/obj/item/weapon/storage/belt/ubelt = belt + if(ubelt.show_above_suit) + belt_layer = BELT_LAYER_ALT + + //NB: this uses a var from above + overlays_standing[belt_layer] = belt.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_belt_str, default_icon = INV_BELT_DEF_ICON, default_layer = belt_layer) + + apply_layer(belt_layer) + +/mob/living/carbon/human/update_inv_wear_suit() + if(QDESTROYING(src)) + return + + remove_layer(SUIT_LAYER) + + //Hide/show other layers if necessary + update_inv_w_uniform() + update_inv_shoes() + update_tail_showing() + update_wing_showing() + + if(!wear_suit) + return //No point, no suit. + + var/obj/item/clothing/suit/suit = wear_suit + var/suit_sprite + + if(istype(suit) && suit.index) + suit_sprite = "[INV_SUIT_DEF_ICON]_[suit.index].dmi" + else if(istype(suit, /obj/item/clothing) && !isnull(suit.update_icon_define)) + suit_sprite = suit.update_icon_define + else + suit_sprite = "[INV_SUIT_DEF_ICON].dmi" + + var/icon/c_mask = null + var/tail_is_rendered = (overlays_standing[TAIL_LAYER] || overlays_standing[TAIL_LAYER_ALT]) + var/valid_clip_mask = tail_style?.clip_mask + + if(tail_is_rendered && valid_clip_mask && !(istype(suit) && suit.taurized)) //Clip the lower half of the suit off using the tail's clip mask for taurs since taur bodies aren't hidden. + c_mask = valid_clip_mask + overlays_standing[SUIT_LAYER] = wear_suit.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_suit_str, default_icon = suit_sprite, default_layer = SUIT_LAYER, clip_mask = c_mask) + + apply_layer(SUIT_LAYER) + +/mob/living/carbon/human/update_inv_pockets() + crash_with("Someone called update_inv_pockets even though it's dumb") + +/mob/living/carbon/human/update_inv_wear_mask() + if(QDESTROYING(src)) + return + + remove_layer(FACEMASK_LAYER) + + if(!wear_mask || (head && head.flags_inv & HIDEMASK)) + return //Why bother, nothing in mask slot. + + overlays_standing[FACEMASK_LAYER] = wear_mask.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_wear_mask_str, default_icon = INV_MASK_DEF_ICON, default_layer = FACEMASK_LAYER) + + apply_layer(FACEMASK_LAYER) + +/mob/living/carbon/human/update_inv_back() + if(QDESTROYING(src)) + return + + remove_layer(BACK_LAYER) + + if(!back) + return //Why do anything + + overlays_standing[BACK_LAYER] = back.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_back_str, default_icon = INV_BACK_DEF_ICON, default_layer = BACK_LAYER) + + apply_layer(BACK_LAYER) + +//TODO: Carbon procs in my human update_icons?? +/mob/living/carbon/human/update_hud() //TODO: do away with this if possible + if(QDESTROYING(src)) + return + + if(client) + client.screen |= contents + if(hud_used) + hud_used.hidden_inventory_update() //Updates the screenloc of the items on the 'other' inventory bar + +//update whether handcuffs appears on our hud. +/mob/living/carbon/proc/update_hud_handcuffed() + if(QDESTROYING(src)) + return + + if(hud_used && hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) + hud_used.l_hand_hud_object.update_icon() + hud_used.r_hand_hud_object.update_icon() + +/mob/living/carbon/human/update_inv_handcuffed() + if(QDESTROYING(src)) + return + + remove_layer(HANDCUFF_LAYER) + update_hud_handcuffed() //TODO + + if(!handcuffed) + return //Not cuffed, why bother + + overlays_standing[HANDCUFF_LAYER] = handcuffed.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_handcuffed_str, default_icon = INV_HCUFF_DEF_ICON, default_layer = HANDCUFF_LAYER) + + apply_layer(HANDCUFF_LAYER) + +/mob/living/carbon/human/update_inv_legcuffed() + if(QDESTROYING(src)) + return + + clear_alert("legcuffed") + remove_layer(LEGCUFF_LAYER) + + if(!legcuffed) + return //Not legcuffed, why bother. + + throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) + + overlays_standing[LEGCUFF_LAYER] = legcuffed.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_legcuffed_str, default_icon = INV_LCUFF_DEF_ICON, default_layer = LEGCUFF_LAYER) + + apply_layer(LEGCUFF_LAYER) + +/mob/living/carbon/human/update_inv_r_hand() + if(QDESTROYING(src)) + return + + remove_layer(R_HAND_LAYER) + + if(!r_hand) + return //No hand, no bother. + + overlays_standing[R_HAND_LAYER] = r_hand.make_worn_icon(body_type = species.get_bodytype(src), inhands = TRUE, slot_name = slot_r_hand_str, default_icon = INV_R_HAND_DEF_ICON, default_layer = R_HAND_LAYER) + + apply_layer(R_HAND_LAYER) + +/mob/living/carbon/human/update_inv_l_hand() + if(QDESTROYING(src)) + return + + remove_layer(L_HAND_LAYER) + + if(!l_hand) + return //No hand, no bother. + + overlays_standing[L_HAND_LAYER] = l_hand.make_worn_icon(body_type = species.get_bodytype(src), inhands = TRUE, slot_name = slot_l_hand_str, default_icon = INV_L_HAND_DEF_ICON, default_layer = L_HAND_LAYER) + + apply_layer(L_HAND_LAYER) + +/mob/living/carbon/human/proc/update_tail_showing() + if(QDESTROYING(src)) + return + + remove_layer(TAIL_LAYER) + remove_layer(TAIL_LAYER_ALT) // Alt Tail Layer + + var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER + + var/image/tail_image = get_tail_image() + if(tail_image) + tail_image.layer = BODY_LAYER+used_tail_layer + overlays_standing[used_tail_layer] = tail_image + apply_layer(used_tail_layer) + return + + var/species_tail = species.get_tail(src) // Species tail icon_state prefix. + + //This one is actually not that bad I guess. + if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) + var/icon/tail_s = get_tail_icon() + overlays_standing[used_tail_layer] = image(icon = tail_s, icon_state = "[species_tail]_s", layer = BODY_LAYER+used_tail_layer) // Alt Tail Layer + animate_tail_reset() + +//TODO: Is this the appropriate place for this, and not on species...? +/mob/living/carbon/human/proc/get_tail_icon() + var/icon_key = "[species.get_race_key(src)][r_skin][g_skin][b_skin][r_hair][g_hair][b_hair]" + var/icon/tail_icon = tail_icon_cache[icon_key] + if(!tail_icon) + //generate a new one + var/species_tail_anim = species.get_tail_animation(src) + if(!species_tail_anim && species.icobase_tail) species_tail_anim = species.icobase //Allow override of file for non-animated tails + if(!species_tail_anim) species_tail_anim = 'icons/effects/species.dmi' + tail_icon = new/icon(species_tail_anim) + tail_icon.Blend(rgb(r_skin, g_skin, b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) + // The following will not work with animated tails. + var/use_species_tail = species.get_tail_hair(src) + if(use_species_tail) + var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_tail(src)]_[use_species_tail]") + hair_icon.Blend(rgb(r_hair, g_hair, b_hair), species.color_mult ? ICON_MULTIPLY : ICON_ADD) //Check for species color_mult + tail_icon.Blend(hair_icon, ICON_OVERLAY) + tail_icon_cache[icon_key] = tail_icon + + return tail_icon + +/mob/living/carbon/human/proc/set_tail_state(var/t_state) + var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer + var/image/tail_overlay = overlays_standing[used_tail_layer] + + remove_layer(TAIL_LAYER) + remove_layer(TAIL_LAYER_ALT) + + if(tail_overlay) + overlays_standing[used_tail_layer] = tail_overlay + if(species.get_tail_animation(src)) + tail_overlay.icon_state = t_state + . = tail_overlay + + apply_layer(used_tail_layer) + +//Not really once, since BYOND can't do that. +//Update this if the ability to flick() images or make looping animation start at the first frame is ever added. +//You can sort of flick images now with flick_overlay -Aro +/mob/living/carbon/human/proc/animate_tail_once() + if(QDESTROYING(src)) + return + + var/t_state = "[species.get_tail(src)]_once" + var/used_tail_layer = tail_alt ? TAIL_LAYER_ALT : TAIL_LAYER // Alt Tail Layer + + var/image/tail_overlay = overlays_standing[used_tail_layer] // Alt Tail Layer + if(tail_overlay && tail_overlay.icon_state == t_state) + return //let the existing animation finish + + tail_overlay = set_tail_state(t_state) // Calls remove_layer & apply_layer + if(tail_overlay) + spawn(20) + //check that the animation hasn't changed in the meantime + if(overlays_standing[used_tail_layer] == tail_overlay && tail_overlay.icon_state == t_state) // Alt Tail Layer + animate_tail_stop() + +/mob/living/carbon/human/proc/animate_tail_start() + if(QDESTROYING(src)) + return + + set_tail_state("[species.get_tail(src)]_slow[rand(0,9)]") + +/mob/living/carbon/human/proc/animate_tail_fast() + if(QDESTROYING(src)) + return + + set_tail_state("[species.get_tail(src)]_loop[rand(0,9)]") + +/mob/living/carbon/human/proc/animate_tail_reset() + if(QDESTROYING(src)) + return + + if(stat != DEAD) + set_tail_state("[species.get_tail(src)]_idle[rand(0,9)]") + else + set_tail_state("[species.get_tail(src)]_static") + toggle_tail(FALSE) //So tails stop when someone dies. TODO - Fix this hack ~Leshana + +/mob/living/carbon/human/proc/animate_tail_stop() + if(QDESTROYING(src)) + return + + set_tail_state("[species.get_tail(src)]_static") + +/mob/living/carbon/human/proc/update_wing_showing() + if(QDESTROYING(src)) + return + + remove_layer(WING_LAYER) + + var/image/wing_image = get_wing_image() + if(wing_image) + wing_image.layer = BODY_LAYER+WING_LAYER + overlays_standing[WING_LAYER] = wing_image + + apply_layer(WING_LAYER) + +/mob/living/carbon/human/update_modifier_visuals() + if(QDESTROYING(src)) + return + + remove_layer(MODIFIER_EFFECTS_LAYER) + + if(!LAZYLEN(modifiers)) + return //No modifiers, no effects. + + var/image/effects = new() + for(var/datum/modifier/M in modifiers) + if(M.mob_overlay_state) + var/image/I = image(icon = 'icons/mob/modifier_effects.dmi', icon_state = M.mob_overlay_state) + effects.overlays += I //TODO, this compositing is annoying. + + overlays_standing[MODIFIER_EFFECTS_LAYER] = effects + + apply_layer(MODIFIER_EFFECTS_LAYER) + +/mob/living/carbon/human/update_fire() + if(QDESTROYING(src)) + return + + remove_layer(FIRE_LAYER) + + if(!on_fire) + return + + overlays_standing[FIRE_LAYER] = image(icon = 'icons/mob/OnFire.dmi', icon_state = get_fire_icon_state(), layer = BODY_LAYER+FIRE_LAYER) + + apply_layer(FIRE_LAYER) + +/mob/living/carbon/human/update_water() + if(QDESTROYING(src)) + return + + remove_layer(WATER_LAYER) + + var/depth = check_submerged() + if(!depth || lying) + return + + var/atom/A = loc // We'd better be swimming and on a turf + var/image/I = image(icon = 'icons/mob/submerged.dmi', icon_state = "human_swimming_[depth]", layer = BODY_LAYER+WATER_LAYER) //TODO: Improve + I.color = A.color + overlays_standing[WATER_LAYER] = I + + apply_layer(WATER_LAYER) + +/mob/living/carbon/human/proc/update_surgery() + if(QDESTROYING(src)) + return + + remove_layer(SURGERY_LAYER) + + var/image/total = new + for(var/obj/item/organ/external/E in organs) + if(E.open) + var/image/I = image(icon = 'icons/mob/surgery.dmi', icon_state = "[E.icon_name][round(E.open)]", layer = BODY_LAYER+SURGERY_LAYER) + total.overlays += I //TODO: This compositing is annoying + + if(total.overlays.len) + overlays_standing[SURGERY_LAYER] = total + apply_layer(SURGERY_LAYER) + +/mob/living/carbon/human/proc/get_wing_image() + if(QDESTROYING(src)) + return + + //If you are FBP with wing style and didn't set a custom one + if(synthetic && synthetic.includes_wing && !wing_style) + var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing? + wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) + return image(wing_s) + + //If you have custom wings selected + if(wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) + var/icon/wing_s = new/icon("icon" = wing_style.icon, "icon_state" = flapping && wing_style.ani_state ? wing_style.ani_state : wing_style.icon_state) + if(wing_style.do_colouration) + wing_s.Blend(rgb(src.r_wing, src.g_wing, src.b_wing), wing_style.color_blend_mode) + if(wing_style.extra_overlay) + var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay) + overlay.Blend(rgb(src.r_wing2, src.g_wing2, src.b_wing2), wing_style.color_blend_mode) + wing_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + if(wing_style.extra_overlay2) + var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2) + if(wing_style.ani_state) + overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2_w) + overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) + wing_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + else + overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) + wing_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + return image(wing_s) + +/mob/living/carbon/human/proc/get_ears_overlay() + if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) + var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state) + if(ear_style.do_colouration) + ears_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), ear_style.color_blend_mode) + if(ear_style.extra_overlay) + var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay) + overlay.Blend(rgb(src.r_ears2, src.g_ears2, src.b_ears2), ear_style.color_blend_mode) + ears_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + if(ear_style.extra_overlay2) //MORE COLOURS IS BETTERER + var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay2) + overlay.Blend(rgb(src.r_ears3, src.g_ears3, src.b_ears3), ear_style.color_blend_mode) + ears_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + return ears_s + return null + + +/mob/living/carbon/human/proc/get_tail_image() + //If you are FBP with tail style and didn't set a custom one + var/datum/robolimb/model = isSynthetic() + if(istype(model) && model.includes_tail && !tail_style) + var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail") + tail_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) + return image(tail_s) + + //If you have a custom tail selected + if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !isTaurTail(tail_style))) + var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state) + if(tail_style.do_colouration) + tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode) + if(tail_style.extra_overlay) + var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay) + if(wagging && tail_style.ani_state) + overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w) + overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + else + overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + + if(tail_style.extra_overlay2) + var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2) + if(wagging && tail_style.ani_state) + overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2_w) + overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + else + overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + + if(isTaurTail(tail_style)) + var/datum/sprite_accessory/tail/taur/taurtype = tail_style + if(taurtype.can_ride && !riding_datum) + riding_datum = new /datum/riding/taur(src) + verbs |= /mob/living/carbon/human/proc/taur_mount + verbs |= /mob/living/proc/toggle_rider_reins + return image(tail_s, "pixel_x" = -16) + else + return image(tail_s) + return null + +// TODO - Move this to where it should go ~Leshana +/mob/living/proc/stop_flying() + if(QDESTROYING(src)) + return + flying = FALSE + return 1 + +/mob/living/carbon/human/stop_flying() + if((. = ..())) + update_wing_showing() + +//Human Overlays Indexes///////// +#undef MUTATIONS_LAYER +#undef SKIN_LAYER +#undef DAMAGE_LAYER +#undef SURGERY_LAYER +#undef UNDERWEAR_LAYER +#undef SHOES_LAYER_ALT +#undef UNIFORM_LAYER +#undef ID_LAYER +#undef SHOES_LAYER +#undef GLOVES_LAYER +#undef BELT_LAYER +#undef SUIT_LAYER +#undef TAIL_LAYER +#undef GLASSES_LAYER +#undef BELT_LAYER_ALT +#undef SUIT_STORE_LAYER +#undef BACK_LAYER +#undef HAIR_LAYER +#undef EARS_LAYER +#undef EYES_LAYER +#undef FACEMASK_LAYER +#undef HEAD_LAYER +#undef COLLAR_LAYER +#undef HANDCUFF_LAYER +#undef LEGCUFF_LAYER +#undef L_HAND_LAYER +#undef R_HAND_LAYER +#undef MODIFIER_EFFECTS_LAYER +#undef FIRE_LAYER +#undef WATER_LAYER +#undef TARGETED_LAYER +#undef TOTAL_LAYERS diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index ab1e134fe9..6a2b0bdf71 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -75,5 +75,9 @@ var/allow_self_surgery = FALSE // Used to determine if the mob can perform surgery on itself. + + var/tail_alt = 0 + var/flying = 0 // Allows flight var/inventory_panel_type = /datum/inventory_panel var/datum/inventory_panel/inventory_panel + diff --git a/code/modules/mob/living/living_vr.dm b/code/modules/mob/living/living_vr.dm index 3103ae4928..ab5607d22b 100644 --- a/code/modules/mob/living/living_vr.dm +++ b/code/modules/mob/living/living_vr.dm @@ -1,3 +1,8 @@ +/mob/living/Check_Shoegrip() + if(flying) + return 1 + ..() + /mob/living/verb/customsay() set category = "IC" set name = "Customize Speech Verbs" @@ -24,23 +29,6 @@ else return -/mob/living/proc/toggle_rider_reins() - set name = "Give Reins" - set category = "Abilities" - set desc = "Let people riding on you control your movement." - - if(riding_datum) - if(istype(riding_datum,/datum/riding)) - if(riding_datum.keytype) - riding_datum.keytype = null - to_chat(src, "Rider control enabled.") - return - else - riding_datum.keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop - to_chat(src, "Rider control restricted.") - return - return - /mob/living/verb/set_metainfo() set name = "Set OOC Metainfo" set desc = "Sets OOC notes about yourself or your RP preferences or status." diff --git a/code/modules/mob/living/riding.dm b/code/modules/mob/living/riding.dm new file mode 100644 index 0000000000..3a614a4b6d --- /dev/null +++ b/code/modules/mob/living/riding.dm @@ -0,0 +1,16 @@ +/mob/living/proc/toggle_rider_reins() + set name = "Give Reins" + set category = "Abilities" + set desc = "Let people riding on you control your movement." + + if(riding_datum) + if(istype(riding_datum,/datum/riding)) + if(riding_datum.keytype) + riding_datum.keytype = null + to_chat(src, "Rider control enabled.") + return + else + riding_datum.keytype = /obj/item/weapon/material/twohanded/riding_crop + to_chat(src, "Rider control restricted.") + return + return diff --git a/code/modules/mob/living/silicon/robot/robot_vr.dm b/code/modules/mob/living/silicon/robot/robot_vr.dm index 362584427e..95ec15e52b 100644 --- a/code/modules/mob/living/silicon/robot/robot_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_vr.dm @@ -176,7 +176,7 @@ //RIDING /datum/riding/dogborg - keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! + keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack! nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index 03f26ce8d0..b51577ce07 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -279,7 +279,7 @@ // Riding /datum/riding/simple_mob - keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! + keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack! nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. diff --git a/code/modules/mob/mob_defines_vr.dm b/code/modules/mob/mob_defines_vr.dm index 41c27a41d0..ff5f1ae582 100644 --- a/code/modules/mob/mob_defines_vr.dm +++ b/code/modules/mob/mob_defines_vr.dm @@ -1,6 +1,5 @@ /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 diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 95732bad6a..ebcc9cf35a 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -460,8 +460,6 @@ return dense_object /mob/proc/Check_Shoegrip() - if(flying) //VOREStation Edit. Checks to see if they and are flying. - return 1 //VOREStation Edit. Checks to see if they are flying. Mostly for this to be ported to Polaris. return 0 /mob/proc/Process_Spaceslipping(var/prob_slip = 5) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 953f4d01ac..7c5d00773c 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -252,8 +252,12 @@ /datum/preferences/proc/update_preview_icon() var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey) + if(!mannequin.dna) // Special handling for preview icons before SSAtoms has initailized. + mannequin.dna = new /datum/dna(null) mannequin.delete_inventory(TRUE) dress_preview_mob(mannequin) + mannequin.toggle_tail(setting = TRUE) + mannequin.toggle_wing(setting = TRUE) COMPILE_OVERLAYS(mannequin) update_character_previews(new /mutable_appearance(mannequin)) diff --git a/code/modules/mob/new_player/preferences_setup_vr.dm b/code/modules/mob/new_player/preferences_setup_vr.dm index 1f01884b60..dca0ff56ec 100644 --- a/code/modules/mob/new_player/preferences_setup_vr.dm +++ b/code/modules/mob/new_player/preferences_setup_vr.dm @@ -1,16 +1,3 @@ -/datum/preferences/update_preview_icon() // Lines up and un-overlaps character edit previews. Also un-splits taurs. - var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey) - if(!mannequin.dna) // Special handling for preview icons before SSAtoms has initailized. - mannequin.dna = new /datum/dna(null) - mannequin.delete_inventory(TRUE) - dress_preview_mob(mannequin) - mannequin.update_transform() - mannequin.toggle_tail_vr(setting = TRUE) - mannequin.toggle_wing_vr(setting = TRUE) - COMPILE_OVERLAYS(mannequin) - - update_character_previews(new /mutable_appearance(mannequin)) - //TFF 5/8/19 - add randomised sensor setting for random button clicking /datum/preferences/randomize_appearance_and_body_for(var/mob/living/carbon/human/H) sensorpref = rand(1,5) \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 2e9c030c54..f04cde9c4c 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -1519,6 +1519,7 @@ shaved /datum/sprite_accessory/facial_hair icon = 'icons/mob/Human_face.dmi' + color_blend_mode = ICON_ADD /datum/sprite_accessory/facial_hair/shaved name = "Shaved" @@ -1707,23 +1708,23 @@ shaved /datum/sprite_accessory/hair/skr_tentacle_veryshort name = "Skrell Short Tentacles" icon_state = "skrell_hair_short" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) gender = MALE /datum/sprite_accessory/hair/skr_tentacle_short name = "Skrell Average Tentacles" icon_state = "skrell_hair_average" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) /datum/sprite_accessory/hair/skr_tentacle_average name = "Skrell Long Tentacles" icon_state = "skrell_hair_long" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) /datum/sprite_accessory/hair/skr_tentacle_verylong name = "Skrell Very Long Tentacles" icon_state = "skrell_hair_verylong" - species_allowed = list(SPECIES_SKRELL) + species_allowed = list(SPECIES_SKRELL, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) //Tajaran hairstyles /datum/sprite_accessory/hair/taj_ears @@ -2005,6 +2006,8 @@ shaved //like Tajaran inner-ear coloring overlay stuff. species_allowed = list() + color_blend_mode = ICON_ADD + var/body_parts = list() //A list of bodyparts this covers, in organ_tag defines //Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD diff --git a/code/modules/mob/new_player/sprite_accessories_ear.dm b/code/modules/mob/new_player/sprite_accessories_ear.dm new file mode 100644 index 0000000000..6262b8ba60 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_ear.dm @@ -0,0 +1,489 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Ear Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/ears + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/ears.dmi' + do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color + + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/extra_overlay // Icon state of an additional overlay to blend in. + var/extra_overlay2 + var/desc = "You should not see this..." + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/shadekin + name = "Shadekin Ears, colorable" + desc = "" + icon_state = "shadekin" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + apply_restrictions = TRUE + +/datum/sprite_accessory/ears/taj_ears + name = "Tajaran Ears" + icon_state = "ears_plain" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + extra_overlay = "ears_plain-inner" + +/datum/sprite_accessory/ears/taj_ears_tall + name = "Tajaran Tall Ears" + icon_state = "msai_plain" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + extra_overlay = "msai_plain-inner" + +/datum/sprite_accessory/ears/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/ears/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/ears/bunny_white + name = "bunny, white" + desc = "" + icon_state = "bunny" + +/datum/sprite_accessory/ears/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/ears/bear_panda + name = "bear, panda" + desc = "" + icon_state = "panda" + +/datum/sprite_accessory/ears/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/ears/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/ears/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/ears/mouse_grey + name = "mouse, grey" + desc = "" + icon_state = "mouse-grey" + +/datum/sprite_accessory/ears/bee + name = "bee antennae" + desc = "" + icon_state = "bee" + +/datum/sprite_accessory/ears/antennae + name = "antennae, colorable" + desc = "" + icon_state = "antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/curly_bug + name = "curly antennae, colorable" + desc = "" + icon_state = "curly_bug" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dual_robot + name = "synth antennae, colorable" + desc = "" + icon_state = "dual_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/right_robot + name = "right synth, colorable" + desc = "" + icon_state = "right_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/left_robot + name = "left synth, colorable" + desc = "" + icon_state = "left_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/oni_h1 + name = "oni horns" + desc = "" + icon_state = "oni-h1" + +/datum/sprite_accessory/ears/oni_h1_c + name = "oni horns, colorable" + desc = "" + icon_state = "oni-h1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns1 + name = "demon horns" + desc = "" + icon_state = "demon-horns1" + +/datum/sprite_accessory/ears/demon_horns1_c + name = "demon horns, colorable" + desc = "" + icon_state = "demon-horns1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns2 + name = "demon horns, colorable(outward)" + desc = "" + icon_state = "demon-horns2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dragon_horns + name = "dragon horns, colorable" + desc = "" + icon_state = "dragon-horns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/foxears + name = "highlander zorren ears" + desc = "" + icon_state = "foxears" + +/datum/sprite_accessory/ears/fenears + name = "flatland zorren ears" + desc = "" + icon_state = "fenears" + +/datum/sprite_accessory/ears/sergal //Redundant + name = "Sergal ears" + icon_state = "serg_plain_s" + +/datum/sprite_accessory/ears/foxearshc + name = "highlander zorren ears, colorable" + desc = "" + icon_state = "foxearshc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/fenearshc + name = "flatland zorren ears, colorable" + desc = "" + icon_state = "fenearshc" + extra_overlay = "fenears-inner" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sergalhc + name = "Sergal ears, colorable" + icon_state = "serg_plain_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/mousehc + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "mouseinner" + +/datum/sprite_accessory/ears/mousehcno + name = "mouse, colorable, no inner" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/wolfhc + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/ears/bearhc + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallbear + name = "small bear" + desc = "" + icon_state = "smallbear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/squirrelhc + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/kittyhc + name = "kitty, colorable" + desc = "" + icon_state = "kitty" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "kittyinner" + +/datum/sprite_accessory/ears/bunnyhc + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers + name = "antlers" + desc = "" + icon_state = "antlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers_e + name = "antlers with ears" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "antlers_mark" + +/datum/sprite_accessory/ears/smallantlers + name = "small antlers" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallantlers_e + name = "small antlers with ears" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deer" + +/datum/sprite_accessory/ears/deer + name = "deer ears" + desc = "" + icon_state = "deer" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow + name = "cow, horns" + desc = "" + icon_state = "cow" + +/datum/sprite_accessory/ears/cowc + name = "cow, horns, colorable" + desc = "" + icon_state = "cow-c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow_nohorns + name = "cow, no horns" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/caprahorns + name = "caprine horns" + desc = "" + icon_state = "caprahorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/otie + name = "otie, colorable" + desc = "" + icon_state = "otie" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/donkey + name = "donkey, colorable" + desc = "" + icon_state = "donkey" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/zears + name = "jagged ears" + desc = "" + icon_state = "zears" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/elfs + name = "elven ears" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + species_allowed = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/sleek + name = "sleek ears" + desc = "" + icon_state = "sleek" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/drake + name = "drake frills" + desc = "" + icon_state = "drake" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp + name = "vulpkanin, dual-color" + desc = "" + icon_state = "vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp-inner" + +/datum/sprite_accessory/ears/vulp_short + name = "vulpkanin short" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp_short_dc + name = "vulpkanin short, dual-color" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_terrier-inner" + +/datum/sprite_accessory/ears/vulp_jackal + name = "vulpkanin thin, dual-color" + desc = "" + icon_state = "vulp_jackal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_jackal-inner" + +/datum/sprite_accessory/ears/bunny_floppy + name = "floopy bunny ears (colorable)" + desc = "" + icon_state = "floppy_bun" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/teshari + name = "Teshari (colorable fluff)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshariinner" + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/tesharihigh + name = "Teshari upper ears (colorable fluff)" + desc = "" + icon_state = "tesharihigh" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharihighinner" + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/tesharilow + name = "Teshari lower ears (colorable fluff)" + desc = "" + icon_state = "tesharilow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharilowinner" + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/ears/inkling + name = "colorable mature inkling hair" + desc = "" + icon = 'icons/mob/human_face_alt.dmi' + icon_state = "inkling-colorable" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/ears/large_dragon + name = "Large dragon horns" + desc = "" + icon_state = "big_liz" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +// Special snowflake ears go below here. +/datum/sprite_accessory/ears/elf_caprine_colorable + name = "Caprine horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "caprahorns" + +/datum/sprite_accessory/ears/elf_oni_colorable + name = "oni horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "oni-h1_c" + +/datum/sprite_accessory/ears/elf_demon_colorable + name = "Demon horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns1_c" + +/datum/sprite_accessory/ears/elf_demon_outwards_colorable + name = "Demon horns with pointy ears, outwards, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns2" + +/datum/sprite_accessory/ears/elf_dragon_colorable + name = "Dragon horns with pointy ears, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "dragon-horns" \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm new file mode 100644 index 0000000000..7705e1a821 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm @@ -0,0 +1,708 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Ear Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/ears + name = "You should not see this..." + icon = 'icons/mob/vore/ears_vr.dmi' + do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + +// Species-unique ears + +/datum/sprite_accessory/ears/shadekin + name = "Shadekin Ears, colorable" + desc = "" + icon_state = "shadekin" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + apply_restrictions = TRUE + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +// Ears avaliable to anyone + +/datum/sprite_accessory/ears/alt_ram_horns + name = "Solid ram horns" + desc = "" + icon_state = "ram_horns_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/hyena + name = "hyena ears, dual-color" + desc = "" + icon_state = "hyena" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "hyena-inner" + +/datum/sprite_accessory/ears/moth + name = "moth antennae" + desc = "" + icon_state = "moth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/ears/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/ears/bunny_white + name = "bunny, white" + desc = "" + icon_state = "bunny" + +/datum/sprite_accessory/ears/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/ears/bear_panda + name = "bear, panda" + desc = "" + icon_state = "panda" + +/datum/sprite_accessory/ears/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/ears/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/ears/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/ears/mouse_grey + name = "mouse, grey" + desc = "" + icon_state = "mouse-grey" + +/datum/sprite_accessory/ears/bee + name = "bee antennae" + desc = "" + icon_state = "bee" + +/datum/sprite_accessory/ears/antennae + name = "antennae, colorable" + desc = "" + icon_state = "antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/curly_bug + name = "curly antennae, colorable" + desc = "" + icon_state = "curly_bug" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dual_robot + name = "synth antennae, colorable" + desc = "" + icon_state = "dual_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/right_robot + name = "right synth, colorable" + desc = "" + icon_state = "right_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/left_robot + name = "left synth, colorable" + desc = "" + icon_state = "left_robot_antennae" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/oni_h1 + name = "oni horns" + desc = "" + icon_state = "oni-h1" + +/datum/sprite_accessory/ears/oni_h1_c + name = "oni horns, colorable" + desc = "" + icon_state = "oni-h1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns1 + name = "demon horns" + desc = "" + icon_state = "demon-horns1" + +/datum/sprite_accessory/ears/demon_horns1_c + name = "demon horns, colorable" + desc = "" + icon_state = "demon-horns1_c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/demon_horns2 + name = "demon horns, colorable(outward)" + desc = "" + icon_state = "demon-horns2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/dragon_horns + name = "dragon horns, colorable" + desc = "" + icon_state = "dragon-horns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/foxears + name = "highlander zorren ears" + desc = "" + icon_state = "foxears" + +/datum/sprite_accessory/ears/fenears + name = "flatland zorren ears" + desc = "" + icon_state = "fenears" + +/datum/sprite_accessory/ears/sergal //Redundant + name = "Sergal ears" + icon_state = "serg_plain_s" + +/datum/sprite_accessory/ears/foxearshc + name = "highlander zorren ears, colorable" + desc = "" + icon_state = "foxearshc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/fenearshc + name = "flatland zorren ears, colorable" + desc = "" + icon_state = "fenearshc" + extra_overlay = "fenears-inner" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sergalhc + name = "Sergal ears, colorable" + icon_state = "serg_plain_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/mousehc + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "mouseinner" + +/datum/sprite_accessory/ears/mousehcno + name = "mouse, colorable, no inner" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/wolfhc + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/ears/bearhc + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallbear + name = "small bear" + desc = "" + icon_state = "smallbear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/squirrelhc + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/kittyhc + name = "kitty, colorable" + desc = "" + icon_state = "kitty" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "kittyinner" + +/datum/sprite_accessory/ears/bunnyhc + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers + name = "antlers" + desc = "" + icon_state = "antlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/antlers_e + name = "antlers with ears" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "antlers_mark" + +/datum/sprite_accessory/ears/smallantlers + name = "small antlers" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/smallantlers_e + name = "small antlers with ears" + desc = "" + icon_state = "smallantlers" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deer" + +/datum/sprite_accessory/ears/deer + name = "deer ears" + desc = "" + icon_state = "deer" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow + name = "cow, horns" + desc = "" + icon_state = "cow" + +/datum/sprite_accessory/ears/cowc + name = "cow, horns, colorable" + desc = "" + icon_state = "cow-c" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/cow_nohorns + name = "cow, no horns" + desc = "" + icon_state = "cow-nohorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/caprahorns + name = "caprine horns" + desc = "" + icon_state = "caprahorns" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/otie + name = "otie, colorable" + desc = "" + icon_state = "otie" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/donkey + name = "donkey, colorable" + desc = "" + icon_state = "donkey" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "otie-inner" + +/datum/sprite_accessory/ears/zears + name = "jagged ears" + desc = "" + icon_state = "zears" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/elfs + name = "elven ears" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/sleek + name = "sleek ears" + desc = "" + icon_state = "sleek" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/drake + name = "drake frills" + desc = "" + icon_state = "drake" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp + name = "vulpkanin, dual-color" + desc = "" + icon_state = "vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp-inner" + +/datum/sprite_accessory/ears/vulp_short + name = "vulpkanin short" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/vulp_short_dc + name = "vulpkanin short, dual-color" + desc = "" + icon_state = "vulp_terrier" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_terrier-inner" + +/datum/sprite_accessory/ears/vulp_jackal + name = "vulpkanin thin, dual-color" + desc = "" + icon_state = "vulp_jackal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulp_jackal-inner" + +/datum/sprite_accessory/ears/bunny_floppy + name = "floopy bunny ears (colorable)" + desc = "" + icon_state = "floppy_bun" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/teshari + name = "Teshari (colorable)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshariinner" + +/datum/sprite_accessory/ears/tesharihigh + name = "Teshari upper ears (colorable)" + desc = "" + icon_state = "tesharihigh" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharihighinner" + +/datum/sprite_accessory/ears/tesharilow + name = "Teshari lower ears (colorable)" + desc = "" + icon_state = "tesharilow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tesharilowinner" + +/datum/sprite_accessory/ears/tesh_pattern_ear_male + name = "Teshari male ear pattern (colorable)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshari_male_pattern" + +/datum/sprite_accessory/ears/tesh_pattern_ear_female + name = "Teshari female ear pattern (colorable)" + desc = "" + icon_state = "teshari" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "teshari_female_pattern" + +/datum/sprite_accessory/ears/inkling + name = "colorable mature inkling hair" + desc = "" + icon = 'icons/mob/human_face_vr.dmi' + icon_state = "inkling-colorable" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/ears/large_dragon + name = "Large dragon horns" + desc = "" + icon_state = "big_liz" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +// Special snowflake ears go below here. + +/datum/sprite_accessory/ears/molenar_kitsune + name = "quintail kitsune ears (Molenar)" + desc = "" + icon_state = "molenar-kitsune" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/ears/lilimoth_antennae + name = "citheronia antennae (Kira72)" + desc = "" + icon_state = "lilimoth_antennae" + ckeys_allowed = list("kira72") + +/datum/sprite_accessory/ears/molenar_deathclaw + name = "deathclaw ears (Molenar)" + desc = "" + icon_state = "molenar-deathclaw" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/ears/miria_fluffdragon + name = "fluffdragon ears (Miria Masters)" + desc = "" + icon_state = "miria-fluffdragonears" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/ears/miria_kitsune + name = "kitsune ears (Miria Masters)" + desc = "" + icon_state = "miria-kitsuneears" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/ears/runac + name = "fennecsune ears (Runac)" + desc = "" + icon_state = "runac" + ckeys_allowed = list("rebcom1807") + +/datum/sprite_accessory/ears/kerena + name = "wingwolf ears (Kerena)" + desc = "" + icon_state = "kerena" + ckeys_allowed = list("somekindofpony") + +/datum/sprite_accessory/ears/rosey + name = "tritail kitsune ears (Rosey)" + desc = "" + icon_state = "rosey" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("joey4298") + +/datum/sprite_accessory/ears/aronai + name = "aronai ears/head (Aronai)" + desc = "" + icon_state = "aronai" + ckeys_allowed = list("arokha") + +/datum/sprite_accessory/ears/holly + name = "tigress ears (Holly Sharp)" + desc = "" + icon_state = "tigressears" + ckeys_allowed = list("hoodoo") + +/datum/sprite_accessory/ears/molenar_inkling + name = "teal mature inkling hair (Kari Akiren)" + desc = "" + icon_state = "molenar-tentacle" + ckeys_allowed = list("molenar") + +/datum/sprite_accessory/ears/shock + name = "pharoah hound ears (Shock Diamond)" + desc = "" + icon_state = "shock" + ckeys_allowed = list("icowom","cameron653") + +/datum/sprite_accessory/ears/alurane + name = "alurane ears/hair (Pumila)" + desc = "" + icon_state = "alurane-ears" + ckeys_allowed = list("natje") + +/datum/sprite_accessory/ears/frost + name = "Frost antenna" + desc = "" + icon_state = "frosted_tips" + ckeys_allowed = list("tucker0666") + +/datum/sprite_accessory/ears/sylv_pip + name = "sylveon ears and ribbons (Pip Shyner)" + desc = "" + icon_state = "pipears" + ckeys_allowed = list("phoaly") + +/datum/sprite_accessory/ears/elf_caprine_colorable + name = "Caprine horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "caprahorns" + +/datum/sprite_accessory/ears/elf_oni_colorable + name = "oni horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "oni-h1_c" + +/datum/sprite_accessory/ears/elf_demon_colorable + name = "Demon horns with pointy ears, colorable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns1_c" + +/datum/sprite_accessory/ears/elf_demon_outwards_colorable + name = "Demon horns with pointy ears, outwards, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "demon-horns2" + +/datum/sprite_accessory/ears/elf_dragon_colorable + name = "Dragon horns with pointy ears, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "dragon-horns" + +/datum/sprite_accessory/ears/synthhorns_plain + name = "Synth horns, plain" + desc = "" + icon_state = "synthhorns_plain" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "synthhorns_plain_light" + +/datum/sprite_accessory/ears/synthhorns_thick + name = "Synth horns, thick" + desc = "" + icon_state = "synthhorns_thick" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "synthhorns_thick_light" + +/datum/sprite_accessory/ears/synthhorns_curly + name = "Synth horns, curly" + desc = "" + icon_state = "synthhorns_curled" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + +/datum/sprite_accessory/ears/forward_curled_demon_horns_bony + name = "Succubus horns, colourable" + desc = "" + icon_state = "succu-horns_b" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/forward_curled_demon_horns_bony_with_colorable_ears + name = "Succubus horns with pointy ears, colourable" + desc = "" + icon_state = "elfs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "succu-horns_b" + +/datum/sprite_accessory/ears/chorns_nubbydogs + name = "Nubby Chorns" + desc = "" + icon_state = "chorn_nubby" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_herk + name = "Herk Chorns" + desc = "" + icon_state = "chorn_herk" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_bork + name = "Bork Chorns" + desc = "" + icon_state = "chorn_bork" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_bull + name = "Bull Chorns" + desc = "" + icon_state = "chorn_bull" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_bicarrot + name = "Bicarrot Chorns" + desc = "" + icon_state = "chorn_bicarrot" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_longcarrot + name = "Long Carrot Chorns" + desc = "" + icon_state = "chorn_longcarrot" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_shortcarrot + name = "Short Carrot Chorns" + desc = "" + icon_state = "chorn_shortcarrot" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_scorp + name = "Scorp Chorns" + desc = "" + icon_state = "chorn_scorp" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_ocean + name = "Ocean Chorns" + desc = "" + icon_state = "chorn_ocean" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/ears/chorns_chub + name = "Chub Chorns" + desc = "" + icon_state = "chorn_chub" + do_colouration = 0 + color_blend_mode = ICON_MULTIPLY diff --git a/code/modules/mob/new_player/sprite_accessories_extra.dm b/code/modules/mob/new_player/sprite_accessories_extra.dm new file mode 100644 index 0000000000..a124eff96b --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_extra.dm @@ -0,0 +1,566 @@ +/datum/sprite_accessory/marking/vr + icon = 'icons/mob/human_races/markings_alt.dmi' + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/marking/vr/vulp_belly + name = "belly fur (Vulp)" + icon_state = "vulp_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_fullbelly + name = "full belly fur (Vulp)" + icon_state = "vulp_fullbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_crest + name = "belly crest (Vulp)" + icon_state = "vulp_crest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_nose + name = "nose (Vulp)" + icon_state = "vulp_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_short_nose + name = "nose, short (Vulp)" + icon_state = "vulp_short_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/snoutstripe + name = "snout stripe (Vulp)" + icon_state = "snoutstripe" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_face + name = "face (Vulp)" + icon_state = "vulp_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_facealt + name = "face, alt. (Vulp)" + icon_state = "vulp_facealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_earsface + name = "ears and face (Vulp)" + icon_state = "vulp_earsface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_all + name = "all head highlights (Vulp)" + icon_state = "vulp_all" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergal_full + name = "Sergal Markings" + icon_state = "sergal_full" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/sergal_full_female + name = "Sergal Markings (Female)" + icon_state = "sergal_full_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/monoeye + name = "Monoeye" + icon_state = "monoeye" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spidereyes + name = "Spider Eyes" + icon_state = "spidereyes" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergaleyes + name = "Sergal Eyes" + icon_state = "eyes_sergal" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/brows + name = "Eyebrows" + icon_state = "brows" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/nevrean_female + name = "Female Nevrean beak" + icon_state = "nevrean_f" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = FEMALE + +/datum/sprite_accessory/marking/vr/nevrean_male + name = "Male Nevrean beak" + icon_state = "nevrean_m" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = MALE + +/datum/sprite_accessory/marking/vr/spots + name = "Spots" + icon_state = "spots" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/shaggy_mane + name = "Shaggy mane/feathers" + icon_state = "shaggy" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/jagged_teeth + name = "Jagged teeth" + icon_state = "jagged" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/blank_face + name = "Blank round face (use with monster mouth)" + icon_state = "blankface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/monster_mouth + name = "Monster mouth" + icon_state = "monster" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/saber_teeth + name = "Saber teeth" + icon_state = "saber" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/fangs + name = "Fangs" + icon_state = "fangs" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tusks + name = "Tusks" + icon_state = "tusks" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_face + name = "Otie face" + icon_state = "otieface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_nose + name = "Otie nose" + icon_state = "otie_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otienose_lite + name = "Short otie nose" + icon_state = "otienose_lite" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/backstripes + name = "Back stripes" + icon_state = "otiestripes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/belly_butt + name = "Belly and butt" + icon_state = "bellyandbutt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/fingers_toes + name = "Fingers and toes" + icon_state = "fingerstoes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/otie_socks + name = "Fingerless socks" + icon_state = "otiesocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/corvid_beak + name = "Corvid beak" + icon_state = "corvidbeak" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/corvid_belly + name = "Corvid belly" + icon_state = "corvidbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_body + name = "Cow markings" + icon_state = "cowbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_nose + name = "Cow nose" + icon_state = "cownose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zmask + name = "Eye mask" + icon_state = "zmask" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zbody + name = "Thick jagged stripes" + icon_state = "zbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/znose + name = "Jagged snout" + icon_state = "znose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_nose + name = "Otter nose" + icon_state = "otternose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_face + name = "Otter face" + icon_state = "otterface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/deer_face + name = "Deer face" + icon_state = "deerface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sharkface + name = "Akula snout" + icon_state = "sharkface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_face + name = "Shepherd snout" + icon_state = "shepface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_back + name = "Shepherd back" + icon_state = "shepback" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_male + name = "Zorren Male Torso" + icon_state = "zorren_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_female + name = "Zorren Female Torso" + icon_state = "zorren_belly_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_back_patch + name = "Zorren Back Patch" + icon_state = "zorren_backpatch" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/zorren_face_male + name = "Zorren Male Face" + icon_state = "zorren_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_face_female + name = "Zorren Female Face" + icon_state = "zorren_face_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_male + name = "Zorren Male Muzzle" + icon_state = "zorren_muzzle" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_female + name = "Zorren Female Muzzle" + icon_state = "zorren_muzzle_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_socks + name = "Zorren Socks" + icon_state = "zorren_socks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/zorren_longsocks + name = "Zorren Longsocks" + icon_state = "zorren_longsocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/tesh_feathers + name = "Teshari Feathers" + icon_state = "tesh-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/harpy_feathers + name = "Rapala leg Feather" + icon_state = "harpy-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/harpy_legs + name = "Rapala leg coloring" + icon_state = "harpy-leg" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/chooves + name = "Cloven hooves" + icon_state = "chooves" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT) + +/datum/sprite_accessory/marking/vr/body_tone + name = "Body toning (for emergency contrast loss)" + icon_state = "btone" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/gloss + name = "Full body gloss" + icon_state = "gloss" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/eboop_panels + name = "Eggnerd FBP panels" + icon_state = "eboop" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/osocks_rarm + name = "Modular Longsock (right arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_ARM,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/osocks_larm + name = "Modular Longsock (left arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_ARM,BP_L_HAND) + +/datum/sprite_accessory/marking/vr/osocks_rleg + name = "Modular Longsock (right leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_FOOT,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/osocks_lleg + name = "Modular Longsock (left leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_L_LEG) + +/datum/sprite_accessory/marking/vr/animeeyesinner + name = "Anime Eyes Inner" + icon_state = "animeeyesinner" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/animeeyesouter + name = "Anime Eyes Outer" + icon_state = "animeeyesouter" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/panda_eye_marks + name = "Panda Eye Markings" + icon_state = "eyes_panda" + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/marking/vr/catwomantorso + name = "Catwoman chest stripes" + icon_state = "catwomanchest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/catwomangroin + name = "Catwoman groin stripes" + icon_state = "catwomangroin" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN) + +/datum/sprite_accessory/marking/vr/catwoman_rleg + name = "Catwoman right leg stripes" + icon_state = "catwomanright" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_LEG) + +/datum/sprite_accessory/marking/vr/catwoman_lleg + name = "Catwoman left leg stripes" + icon_state = "catwomanleft" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG) + +/datum/sprite_accessory/marking/vr/teshi_small_feathers + name = "Teshari small wingfeathers" + icon_state = "teshi_sf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights + name = "Ward - Spirit FBP Lights" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_lights_body + name = "Ward - Spirit FBP Lights (body)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights_head + name = "Ward - Spirit FBP Lights (head)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels + name = "Ward - Spirit FBP Panels" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels_body + name = "Ward - Spirit FBP Panels (body)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_panels_head + name = "Ward - Spirit FBP Panels (head)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_head + name = "Squid Head" + icon_state = "tentaclehead" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_mouth + name = "Tentacle Mouth" + icon_state = "tentaclemouth" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/rosette + name = "Rosettes" + icon_state = "rosette" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) +/* +werewolf_nose + name = "Werewolf nose" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +werewolf_face + name = "Werewolf face" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +werewolf_belly + name = "Werewolf belly" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + species_allowed = list(SPECIES_WEREBEAST) + +werewolf_socks + name = "Werewolf socks" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + species_allowed = list(SPECIES_WEREBEAST) + +shadekin_snoot + name = "Shadekin Snoot" + icon_state = "shadekin-snoot" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) +*/ +/datum/sprite_accessory/marking/vr/taj_nose_alt + name = "Nose Color, alt. (Taj)" + icon_state = "taj_nosealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/talons + name = "Talons" + icon_state = "talons" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/claws + name = "Claws" + icon_state = "claws" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/equine_snout //Why the long face? Works best with sergal bodytype. + name = "Equine Snout" + icon_state = "donkey" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/equine_nose + name = "Equine Nose" + icon_state = "dnose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm new file mode 100644 index 0000000000..fd23037699 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm @@ -0,0 +1,725 @@ +//VOREStation Body Markings and Overrides +//Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD + +/datum/sprite_accessory/marking //Override for base markings + color_blend_mode = ICON_ADD + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + +/datum/sprite_accessory/marking/vr + icon = 'icons/mob/human_races/markings_vr.dmi' + +/datum/sprite_accessory/marking/vr/vulp_belly + name = "belly fur (Vulp)" + icon_state = "vulp_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_fullbelly + name = "full belly fur (Vulp)" + icon_state = "vulp_fullbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_crest + name = "belly crest (Vulp)" + icon_state = "vulp_crest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vulp_nose + name = "nose (Vulp)" + icon_state = "vulp_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_short_nose + name = "nose, short (Vulp)" + icon_state = "vulp_short_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/snoutstripe + name = "snout stripe (Vulp)" + icon_state = "snoutstripe" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_face + name = "face (Vulp)" + icon_state = "vulp_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_facealt + name = "face, alt. (Vulp)" + icon_state = "vulp_facealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_earsface + name = "ears and face (Vulp)" + icon_state = "vulp_earsface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/vulp_all + name = "all head highlights (Vulp)" + icon_state = "vulp_all" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergal_full + name = "Sergal Markings" + icon_state = "sergal_full" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/sergal_full_female + name = "Sergal Markings (Female)" + icon_state = "sergal_full_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + species_allowed = list("Sergal") + +/datum/sprite_accessory/marking/vr/monoeye + name = "Monoeye" + icon_state = "monoeye" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spidereyes + name = "Spider Eyes" + icon_state = "spidereyes" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sergaleyes + name = "Sergal Eyes" + icon_state = "eyes_sergal" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/brows + name = "Eyebrows" + icon_state = "brows" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/nevrean_female + name = "Female Nevrean beak" + icon_state = "nevrean_f" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = FEMALE + +/datum/sprite_accessory/marking/vr/nevrean_male + name = "Male Nevrean beak" + icon_state = "nevrean_m" + body_parts = list(BP_HEAD) + color_blend_mode = ICON_MULTIPLY + gender = MALE + +/datum/sprite_accessory/marking/vr/spots + name = "Spots" + icon_state = "spots" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/shaggy_mane + name = "Shaggy mane/feathers" + icon_state = "shaggy" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/jagged_teeth + name = "Jagged teeth" + icon_state = "jagged" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/blank_face + name = "Blank round face (use with monster mouth)" + icon_state = "blankface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/monster_mouth + name = "Monster mouth" + icon_state = "monster" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/saber_teeth + name = "Saber teeth" + icon_state = "saber" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/fangs + name = "Fangs" + icon_state = "fangs" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tusks + name = "Tusks" + icon_state = "tusks" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_face + name = "Otie face" + icon_state = "otieface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otie_nose + name = "Otie nose" + icon_state = "otie_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otienose_lite + name = "Short otie nose" + icon_state = "otienose_lite" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/backstripes + name = "Back stripes" + icon_state = "otiestripes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/belly_butt + name = "Belly and butt" + icon_state = "bellyandbutt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/fingers_toes + name = "Fingers and toes" + icon_state = "fingerstoes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/otie_socks + name = "Fingerless socks" + icon_state = "otiesocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/corvid_beak + name = "Corvid beak" + icon_state = "corvidbeak" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/corvid_belly + name = "Corvid belly" + icon_state = "corvidbelly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_body + name = "Cow markings" + icon_state = "cowbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/cow_nose + name = "Cow nose" + icon_state = "cownose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zmask + name = "Eye mask" + icon_state = "zmask" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/zbody + name = "Thick jagged stripes" + icon_state = "zbody" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/znose + name = "Jagged snout" + icon_state = "znose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_nose + name = "Otter nose" + icon_state = "otternose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/otter_face + name = "Otter face" + icon_state = "otterface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/deer_face + name = "Deer face" + icon_state = "deerface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sharkface + name = "Akula snout" + icon_state = "sharkface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_face + name = "Shepherd snout" + icon_state = "shepface" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/sheppy_back + name = "Shepherd back" + icon_state = "shepback" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_male + name = "Zorren Male Torso" + icon_state = "zorren_belly" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_belly_female + name = "Zorren Female Torso" + icon_state = "zorren_belly_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/zorren_back_patch + name = "Zorren Back Patch" + icon_state = "zorren_backpatch" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/zorren_face_male + name = "Zorren Male Face" + icon_state = "zorren_face" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_face_female + name = "Zorren Female Face" + icon_state = "zorren_face_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_male + name = "Zorren Male Muzzle" + icon_state = "zorren_muzzle" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = MALE + +/datum/sprite_accessory/marking/vr/zorren_muzzle_female + name = "Zorren Female Muzzle" + icon_state = "zorren_muzzle_female" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + gender = FEMALE + +/datum/sprite_accessory/marking/vr/zorren_socks + name = "Zorren Socks" + icon_state = "zorren_socks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/zorren_longsocks + name = "Zorren Longsocks" + icon_state = "zorren_longsocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/tesh_feathers + name = "Teshari Feathers" + icon_state = "tesh-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/harpy_feathers + name = "Rapala leg Feather" + icon_state = "harpy-feathers" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/harpy_legs + name = "Rapala leg coloring" + icon_state = "harpy-leg" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/chooves + name = "Cloven hooves" + icon_state = "chooves" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT) + +/datum/sprite_accessory/marking/vr/body_tone + name = "Body toning (for emergency contrast loss)" + icon_state = "btone" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/gloss + name = "Full body gloss" + icon_state = "gloss" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/eboop_panels + name = "Eggnerd FBP panels" + icon_state = "eboop" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/osocks_rarm + name = "Modular Longsock (right arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_ARM,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/osocks_larm + name = "Modular Longsock (left arm)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_ARM,BP_L_HAND) + +/datum/sprite_accessory/marking/vr/osocks_rleg + name = "Modular Longsock (right leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_FOOT,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/osocks_lleg + name = "Modular Longsock (left leg)" + icon_state = "osocks" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_L_LEG) + +/datum/sprite_accessory/marking/vr/animeeyesinner + name = "Anime Eyes Inner" + icon_state = "animeeyesinner" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/animeeyesouter + name = "Anime Eyes Outer" + icon_state = "animeeyesouter" + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/panda_eye_marks + name = "Panda Eye Markings" + icon_state = "eyes_panda" + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/marking/vr/catwomantorso + name = "Catwoman chest stripes" + icon_state = "catwomanchest" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_TORSO) + +/datum/sprite_accessory/marking/vr/catwomangroin + name = "Catwoman groin stripes" + icon_state = "catwomangroin" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN) + +/datum/sprite_accessory/marking/vr/catwoman_rleg + name = "Catwoman right leg stripes" + icon_state = "catwomanright" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_R_LEG) + +/datum/sprite_accessory/marking/vr/catwoman_lleg + name = "Catwoman left leg stripes" + icon_state = "catwomanleft" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG) + +/datum/sprite_accessory/marking/vr/teshi_small_feathers + name = "Teshari small wingfeathers" + icon_state = "teshi_sf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights + name = "Ward - Spirit FBP Lights" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_lights_body + name = "Ward - Spirit FBP Lights (body)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_lights_head + name = "Ward - Spirit FBP Lights (head)" + icon_state = "lights" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels + name = "Ward - Spirit FBP Panels" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/spirit_panels_body + name = "Ward - Spirit FBP Panels (body)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) + +/datum/sprite_accessory/marking/vr/spirit_panels_head + name = "Ward - Spirit FBP Panels (head)" + icon_state = "panels" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_head + name = "Squid Head" + icon_state = "tentaclehead" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/tentacle_mouth + name = "Tentacle Mouth" + icon_state = "tentaclemouth" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/rosette + name = "Rosettes" + icon_state = "rosette" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) + +/datum/sprite_accessory/marking/vr/werewolf_nose + name = "Werewolf nose" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf_nose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/werewolf_face + name = "Werewolf face" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/werewolf_belly + name = "Werewolf belly" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_GROIN,BP_TORSO) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/werewolf_socks + name = "Werewolf socks" + icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' + icon_state = "werewolf" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) + species_allowed = list(SPECIES_WEREBEAST) + +/datum/sprite_accessory/marking/vr/shadekin_snoot + name = "Shadekin Snoot" + icon_state = "shadekin-snoot" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/marking/vr/taj_nose_alt + name = "Nose Color, alt. (Taj)" + icon_state = "taj_nosealt" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/talons + name = "Talons" + icon_state = "talons" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) + +/datum/sprite_accessory/marking/vr/claws + name = "Claws" + icon_state = "claws" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/equine_snout //Why the long face? Works best with sergal bodytype. + name = "Equine Snout" + icon_state = "donkey" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/equine_nose + name = "Equine Nose" + icon_state = "dnose" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/bee_stripes + name = "bee stripes" + icon_state = "beestripes" + body_parts = list(BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/vas_toes + name = "Bug Paws (Vasilissan)" + icon_state = "vas_toes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT) + + //CitRP stuff +/datum/sprite_accessory/marking/vr/vox_alt + name = "Vox Alternate" + icon_state = "bay_vox" + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) + species_allowed = list(SPECIES_VOX) + +/datum/sprite_accessory/marking/vr/vox_alt_eyes + name = "Alternate Vox Eyes" + icon_state = "bay_vox_eyes" + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_VOX) + +/datum/sprite_accessory/marking/vr/c_beast_body + name = "Cyber Body" + icon_state = "c_beast_body" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN) + +/datum/sprite_accessory/marking/vr/c_beast_plating + name = "Cyber Plating (Use w/ Cyber Body)" + icon_state = "c_beast_plating" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM) + +/datum/sprite_accessory/marking/vr/c_beast_band + name = "Cyber Band (Use w/ Cybertech head)" + icon_state = "c_beast_band" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/c_beast_cheek_a + name = "Cyber Beast Cheeks A (Use A, B and C)" + icon_state = "c_beast_a" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/c_beast_cheek_b + name = "Cyber Beast Cheeks B (Use A, B and C)" + icon_state = "c_beast_b" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/c_beast_cheek_c + name = "Cyber Beast Cheeks C (Use A, B and C)" + icon_state = "c_beast_c" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/teshari_large_eyes + name = "Teshari large eyes" + icon_state = "teshlarge_eyes" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/teshari_coat + name = "Teshari coat" + icon_state = "tesh_coat" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/teshari_pattern_male + name = "Teshari male pattern" + icon_state = "tesh-pattern-male" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/teshari_pattern_female + name = "Teshari female pattern" + icon_state = "tesh-pattern-fem" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) + species_allowed = list(SPECIES_TESHARI) + +/datum/sprite_accessory/marking/vr/voxscales + name = "Vox Scales" + icon_state = "Voxscales" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_HEAD) + +/datum/sprite_accessory/marking/vr/voxclaws + name = "Vox Claws" + icon_state = "Voxclaws" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) + +/datum/sprite_accessory/marking/vr/voxbeak + name = "Vox Beak" + icon_state = "Voxscales" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathihood + name = "Cobra Hood" + icon_state = "unathihood" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathidoublehorns + name = "Double Unathi Horns" + icon_state = "unathidoublehorns" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathihorns + name = "Unathi Horns" + icon_state = "unathihorns" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathiramhorns + name = "Unathi Ram Horns" + icon_state = "unathiramhorns" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathishortspines + name = "Unathi Short Spines" + icon_state = "unathishortspines" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathilongspines + name = "Unathi Long Spines" + icon_state = "unathilongspines" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathishortfrills + name = "Unathi Short Frills" + icon_state = "unathishortfrills" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) + +/datum/sprite_accessory/marking/vr/unathilongfrills + name = "Unathi Long Frills" + icon_state = "unathilongfrills" + color_blend_mode = ICON_MULTIPLY + body_parts = list(BP_HEAD) diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm new file mode 100644 index 0000000000..012591a895 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_tail.dm @@ -0,0 +1,941 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Tail Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/tail + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/tails.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/extra_overlay // Icon state of an additional overlay to blend in. + var/extra_overlay2 //Tertiary. + var/show_species_tail = 0 // If false, do not render species' tail. + var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it + var/desc = "You should not see this..." + var/ani_state // State when wagging/animated + var/extra_overlay_w // Wagging state for extra overlay + var/extra_overlay2_w // Tertiary wagging. + var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff. + var/icon/clip_mask_icon = null //Icon file used for clip mask. + var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits. + var/icon/clip_mask = null //Instantiated clip mask of given icon and state + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/New() + . = ..() + if(clip_mask_icon && clip_mask_state) + clip_mask = icon(icon = clip_mask_icon, icon_state = clip_mask_state) + +// Species-unique tails + +// Everyone tails + +/datum/sprite_accessory/tail/invisible + name = "hide species-sprite tail" + icon = null + icon_state = null + + species_allowed = list(SPECIES_TAJ, SPECIES_UNATHI, SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/squirrel_orange + name = "squirel, orange" + desc = "" + icon_state = "squirrel-orange" + +/datum/sprite_accessory/tail/squirrel_red + name = "squirrel, red" + desc = "" + icon_state = "squirrel-red" + +/datum/sprite_accessory/tail/squirrel + name = "squirrel, colorable" + desc = "" + icon_state = "squirrel" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kitty + name = "kitty, colorable, downwards" + desc = "" + icon_state = "kittydown" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/kittyup + name = "kitty, colorable, upwards" + desc = "" + icon_state = "kittyup" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/tiger_white + name = "tiger, colorable" + desc = "" + icon_state = "tiger" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigerinnerwhite" + +/datum/sprite_accessory/tail/stripey + name = "stripey taj, colorable" + desc = "" + icon_state = "stripeytail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "stripeytail_mark" + + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/stripeytail_brown + name = "stripey taj, brown" + desc = "" + icon_state = "stripeytail-brown" + +/datum/sprite_accessory/tail/chameleon + name = "Chameleon, colorable" + desc = "" + icon_state = "chameleon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/bunny + name = "bunny, colorable" + desc = "" + icon_state = "bunny" + do_colouration = 1 + +/datum/sprite_accessory/tail/bear_brown + name = "bear, brown" + desc = "" + icon_state = "bear-brown" + +/datum/sprite_accessory/tail/bear + name = "bear, colorable" + desc = "" + icon_state = "bear" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/dragon + name = "dragon, colorable" + desc = "" + icon_state = "dragon" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wolf_grey + name = "wolf, grey" + desc = "" + icon_state = "wolf-grey" + +/datum/sprite_accessory/tail/wolf_green + name = "wolf, green" + desc = "" + icon_state = "wolf-green" + +/datum/sprite_accessory/tail/wisewolf + name = "wolf, wise" + desc = "" + icon_state = "wolf-wise" + +/datum/sprite_accessory/tail/blackwolf + name = "wolf, black" + desc = "" + icon_state = "wolf" + +/datum/sprite_accessory/tail/wolf + name = "wolf, colorable" + desc = "" + icon_state = "wolf" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wolfinner" + +/datum/sprite_accessory/tail/mouse_pink + name = "mouse, pink" + desc = "" + icon_state = "mouse-pink" + +/datum/sprite_accessory/tail/mouse + name = "mouse, colorable" + desc = "" + icon_state = "mouse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/horse + name = "horse tail, colorable" + desc = "" + icon_state = "horse" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/cow + name = "cow tail, colorable" + desc = "" + icon_state = "cow" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/fantail + name = "avian fantail, colorable" + desc = "" + icon_state = "fantail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wagtail + name = "avian wagtail, colorable" + desc = "" + icon_state = "wagtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreandc + name = "nevrean tail, dual-color" + desc = "" + icon_state = "nevreantail_dc" + extra_overlay = "nevreantail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc + name = "nevrean wagtail, dual-color" + desc = "" + icon_state = "wagtail" + extra_overlay = "wagtail_dc_tail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/nevreanwagdc_alt + name = "nevrean wagtail, marked, dual-color" + desc = "" + icon_state = "wagtail2_dc" + extra_overlay = "wagtail2_dc_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/crossfox + name = "cross fox" + desc = "" + icon_state = "crossfox" + +/datum/sprite_accessory/tail/beethorax + name = "bee thorax" + desc = "" + icon_state = "beethorax" + +/datum/sprite_accessory/tail/doublekitsune + name = "double kitsune tail, colorable" + desc = "" + icon_state = "doublekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/spade_color + name = "spade-tail (colorable)" + desc = "" + icon_state = "spadetail-black" + do_colouration = 1 + +/datum/sprite_accessory/tail/snag + name = "xenomorph tail 1" + desc = "" + icon_state = "snag" + +/datum/sprite_accessory/tail/xenotail + name = "xenomorph tail 2" + desc = "" + icon_state = "xenotail" + +/datum/sprite_accessory/tail/eboop + name = "EGN mech tail (dual color)" + desc = "" + icon_state = "eboop" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "eboop_mark" + +/datum/sprite_accessory/tail/ketrai_wag + name = "fennix tail (vwag)" + desc = "" + icon_state = "ketraitail" + ani_state = "ketraitail_w" + //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone. + +/datum/sprite_accessory/tail/ketrainew_wag + name = "new fennix tail (vwag)" + desc = "" + icon_state = "ketraitailnew" + ani_state = "ketraitailnew_w" + +/datum/sprite_accessory/tail/redpanda + name = "red panda" + desc = "" + icon_state = "redpanda" + +/datum/sprite_accessory/tail/ringtail + name = "ringtail, colorable" + desc = "" + icon_state = "ringtail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ringtail_mark" + +/datum/sprite_accessory/tail/satyr + name = "goat legs, colorable" + desc = "" + icon_state = "satyr" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/human_races/sprite_accessories/taurs.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. + +/datum/sprite_accessory/tail/tailmaw + name = "tailmaw, colorable" + desc = "" + icon_state = "tailmaw" + color_blend_mode = ICON_MULTIPLY + do_colouration = 1 + +/datum/sprite_accessory/tail/curltail + name = "curltail (vwag)" + desc = "" + icon_state = "curltail" + ani_state = "curltail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "curltail_mark" + extra_overlay_w = "curltail_mark_w" + +/datum/sprite_accessory/tail/shorttail + name = "shorttail (vwag)" + desc = "" + icon_state = "straighttail" + ani_state = "straighttail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sneptail + name = "Snep/Furry Tail (vwag)" + desc = "" + icon_state = "sneptail" + ani_state = "sneptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sneptail_mark" + extra_overlay_w = "sneptail_mark_w" + + +/datum/sprite_accessory/tail/tiger_new + name = "tiger tail (vwag)" + desc = "" + icon_state = "tigertail" + ani_state = "tigertail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "tigertail_mark" + extra_overlay_w = "tigertail_mark_w" + +/datum/sprite_accessory/tail/vulp_new + name = "new vulp tail (vwag)" + desc = "" + icon_state = "vulptail" + ani_state = "vulptail_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "vulptail_mark" + extra_overlay_w = "vulptail_mark_w" + +/datum/sprite_accessory/tail/otietail + name = "otie tail (vwag)" + desc = "" + icon_state = "otie" + ani_state = "otie_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/newtailmaw + name = "new tailmaw (vwag)" + desc = "" + icon_state = "newtailmaw" + ani_state = "newtailmaw_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/ztail + name = "jagged flufftail" + desc = "" + icon_state = "ztail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/snaketail + name = "snake tail, colorable" + desc = "" + icon_state = "snaketail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/vulpan_alt + name = "vulpkanin alt style, colorable" + desc = "" + icon_state = "vulptail_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/sergaltaildc + name = "sergal, dual-color" + desc = "" + icon_state = "sergal" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "sergal_mark" + +/datum/sprite_accessory/tail/skunktail + name = "skunk, dual-color" + desc = "" + icon_state = "skunktail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "skunktail_mark" + +/datum/sprite_accessory/tail/deertail + name = "deer, dual-color" + desc = "" + icon_state = "deertail" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "deertail_mark" + +/datum/sprite_accessory/tail/teshari_fluffytail + name = "Teshari alternative, colorable" + desc = "" + icon_state = "teshari_fluffytail" + extra_overlay = "teshari_fluffytail_mark" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/nightstalker + name = "Nightstalker, colorable" + desc = "" + icon_state = "nightstalker" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +//For all species tails. Includes haircolored tails. +/datum/sprite_accessory/tail/special + name = "Blank tail. Do not select." + icon = 'icons/effects/species_tails.dmi' + +/datum/sprite_accessory/tail/special/unathi + name = "unathi tail" + desc = "" + icon_state = "sogtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/tajaran + name = "tajaran tail" + desc = "" + icon_state = "tajtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/sergal + name = "sergal tail" + desc = "" + icon_state = "sergtail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akula + name = "akula tail" + desc = "" + icon_state = "sharktail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevrean + name = "nevrean tail" + desc = "" + icon_state = "nevreantail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalis + name = "armalis tail" + desc = "" + icon_state = "armalis_tail_humanoid_s" + +/datum/sprite_accessory/tail/special/xenodrone + name = "xenomorph drone tail" + desc = "" + icon_state = "xenos_drone_tail_s" + +/datum/sprite_accessory/tail/special/xenosentinel + name = "xenomorph sentinel tail" + desc = "" + icon_state = "xenos_sentinel_tail_s" + +/datum/sprite_accessory/tail/special/xenohunter + name = "xenomorph hunter tail" + desc = "" + icon_state = "xenos_hunter_tail_s" + +/datum/sprite_accessory/tail/special/xenoqueen + name = "xenomorph queen tail" + desc = "" + icon_state = "xenos_queen_tail_s" + +/datum/sprite_accessory/tail/special/monkey + name = "monkey tail" + desc = "" + icon_state = "chimptail_s" + +/datum/sprite_accessory/tail/special/seromitail + name = "seromi tail" + desc = "" + icon_state = "seromitail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/seromitailfeathered + name = "seromi tail w/ feathers" + desc = "" + icon_state = "seromitail_s" + extra_overlay = "seromitail_feathers_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TESHARI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/unathihc + name = "unathi tail, colorable" + desc = "" + icon_state = "sogtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_UNATHI, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/tajaranhc + name = "tajaran tail, colorable" + desc = "" + icon_state = "tajtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + species_allowed = list(SPECIES_TAJ, SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/tail/special/sergalhc + name = "sergal tail, colorable" + desc = "" + icon_state = "sergtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/akulahc + name = "akula tail, colorable" + desc = "" + icon_state = "sharktail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/nevreanhc + name = "nevrean tail, colorable" + desc = "" + icon_state = "nevreantail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/foxhc + name = "highlander zorren tail, colorable" + desc = "" + icon_state = "foxtail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/fennechc + name = "flatland zorren tail, colorable" + desc = "" + icon_state = "fentail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/armalishc + name = "armalis tail, colorable" + desc = "" + icon_state = "armalis_tail_humanoid_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenodronehc + name = "xenomorph drone tail, colorable" + desc = "" + icon_state = "xenos_drone_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenosentinelhc + name = "xenomorph sentinel tail, colorable" + desc = "" + icon_state = "xenos_sentinel_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenohunterhc + name = "xenomorph hunter tail, colorable" + desc = "" + icon_state = "xenos_hunter_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/xenoqueenhc + name = "xenomorph queen tail, colorable" + desc = "" + icon_state = "xenos_queen_tail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/monkeyhc + name = "monkey tail, colorable" + desc = "" + icon_state = "chimptail_hc_s" + do_colouration = 1 + +/datum/sprite_accessory/tail/special/seromitailhc + name = "seromi tail, colorable" + desc = "" + icon_state = "seromitail_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/seromitailfeatheredhc + name = "seromi tail w/ feathers, colorable" + desc = "" + icon_state = "seromitail_feathers_hc_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/special/vulpan + name = "vulpkanin, colorable" + desc = "" + icon_state = "vulptail_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + + +/datum/sprite_accessory/tail/zenghu_taj + name = "Zeng-Hu Tajaran Synth tail" + desc = "" + icon_state = "zenghu_taj" + +//Taurs moved to a separate file due to extra code around them + +//Buggo Abdomens! + +/datum/sprite_accessory/tail/buggo + name = "Bug abdomen, colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobee + name = "Bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + +/datum/sprite_accessory/tail/buggobeefull + name = "Bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + +/datum/sprite_accessory/tail/buggounder + name = "Bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + +/datum/sprite_accessory/tail/buggofirefly + name = "Bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggo_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + +/datum/sprite_accessory/tail/buggofat + name = "Fat bug abdomen, colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggofatbee + name = "Fat bug abdomen, bee top, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggofatbeefull + name = "Fat bug abdomen, bee full, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggofatunder + name = "Fat bug abdomen, underside, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofatfirefly + name = "Fat bug abdomen, firefly, dual-colorable" + desc = "" + icon_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_markings" + +/datum/sprite_accessory/tail/buggowag + name = "Bug abdomen, colorable, vwag change" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggobeewag + name = "Bug abdomen, bee top, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_markings" + extra_overlay_w = "buggofatbee_markings" + +/datum/sprite_accessory/tail/buggobeefullwag + name = "Bug abdomen, bee full, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_markings" + extra_overlay_w = "buggofatbeefull_markings" + +/datum/sprite_accessory/tail/buggounderwag + name = "Bug abdomen, underside, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_markings" + extra_overlay_w = "buggofatunder_markings" + +/datum/sprite_accessory/tail/buggofireflywag + name = "Bug abdomen, firefly, dual color, vwag" + desc = "" + icon_state = "buggo_s" + ani_state = "buggofat_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_markings" + extra_overlay_w = "buggofatfirefly_markings" + +//Vass buggo variants! + +/datum/sprite_accessory/tail/buggovass + name = "Bug abdomen, vass, colorable" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbee + name = "Bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefull + name = "Bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunder + name = "Bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfirefly + name = "Bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggo_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovassfat + name = "Fat bug abdomen, vass, colorable" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassfatbee + name = "Fat bug abdomen, bee top, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatbeefull + name = "Fat bug abdomen, bee full, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatunder + name = "Fat bug abdomen, underside, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfatfirefly + name = "Fat bug abdomen, firefly, dc, vass" + desc = "" + icon_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/buggovasswag + name = "Bug abdomen, vass, colorable, vwag change" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/buggovassbeewag + name = "Bug abdomen, bee top, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobee_vass_markings" + extra_overlay_w = "buggofatbee_vass_markings" + +/datum/sprite_accessory/tail/buggovassbeefullwag + name = "Bug abdomen, bee full, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggobeefull_vass_markings" + extra_overlay_w = "buggofatbeefull_vass_markings" + +/datum/sprite_accessory/tail/buggovassunderwag + name = "Bug abdomen, underside, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggounder_vass_markings" + extra_overlay_w = "buggofatunder_vass_markings" + +/datum/sprite_accessory/tail/buggovassfireflywag + name = "Bug abdomen, firefly, dc, vass, vwag" + desc = "" + icon_state = "buggo_vass_s" + ani_state = "buggofat_vass_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "buggofirefly_vass_markings" + extra_overlay_w = "buggofatfirefly_vass_markings" + +/datum/sprite_accessory/tail/tail_smooth + name = "Smooth Lizard Tail, colorable" + desc = "" + icon_state = "tail_smooth" + ani_state = "tail_smooth_w" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/triplekitsune_colorable + name = "Kitsune 3 tails, colorable" + desc = "" + icon_state = "triplekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "triplekitsune_tips" + +/datum/sprite_accessory/tail/ninekitsune_colorable + name = "Kitsune 9 tails, colorable" + desc = "" + icon_state = "ninekitsune" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "ninekitsune-tips" + +/datum/sprite_accessory/tail/shadekin_short + name = "Shadekin Short Tail, colorable" + desc = "" + icon_state = "shadekin-short" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts + name = "Ward-Takahashi Tail" + desc = "" + icon_state = "wardtakahashi_vulp" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/tail/wartacosushi_tail_dc + name = "Ward-Takahashi Tail, dual-color" + desc = "" + icon_state = "wardtakahashi_vulp_dc" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "wardtakahashi_vulp_dc_mark" diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm similarity index 51% rename from code/modules/vore/appearance/sprite_accessories_vr.dm rename to code/modules/mob/new_player/sprite_accessories_tail_vr.dm index 60db457887..d76244aba7 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm @@ -1,946 +1,3 @@ -/* - Hello and welcome to VOREStation sprite_accessories: For a more general overview - please read sprite_accessories.dm. This file is for ears and tails. - This is intended to be friendly for people with little to no actual coding experience. - !!WARNING!!: changing existing accessory information can be VERY hazardous to savefiles, - to the point where you may completely corrupt a server's savefiles. Please refrain - from doing this unless you absolutely know what you are doing, and have defined a - conversion in savefile.dm -*/ - -// Add Additional variable onto sprite_accessory -/datum/sprite_accessory - // Ckey of person allowed to use this, if defined. - list/ckeys_allowed = null - apply_restrictions = FALSE //whether to apply restrictions for specific tails/ears/wings - -/* -//////////////////////////// -/ =--------------------= / -/ == Ear Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/ears - name = "You should not see this..." - icon = 'icons/mob/vore/ears_vr.dmi' - do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color - - color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/extra_overlay2 - var/desc = "You should not see this..." - -// Species-unique ears - -/datum/sprite_accessory/ears/shadekin - name = "Shadekin Ears, colorable" - desc = "" - icon_state = "shadekin" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -// Ears avaliable to anyone - -/datum/sprite_accessory/ears/alt_ram_horns - name = "Solid ram horns" - desc = "" - icon_state = "ram_horns_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/hyena - name = "hyena ears, dual-color" - desc = "" - icon_state = "hyena" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "hyena-inner" - -/datum/sprite_accessory/ears/moth - name = "moth antennae" - desc = "" - icon_state = "moth" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/squirrel_orange - name = "squirel, orange" - desc = "" - icon_state = "squirrel-orange" - -/datum/sprite_accessory/ears/squirrel_red - name = "squirrel, red" - desc = "" - icon_state = "squirrel-red" - -/datum/sprite_accessory/ears/bunny_white - name = "bunny, white" - desc = "" - icon_state = "bunny" - -/datum/sprite_accessory/ears/bear_brown - name = "bear, brown" - desc = "" - icon_state = "bear-brown" - -/datum/sprite_accessory/ears/bear_panda - name = "bear, panda" - desc = "" - icon_state = "panda" - -/datum/sprite_accessory/ears/wolf_grey - name = "wolf, grey" - desc = "" - icon_state = "wolf-grey" - -/datum/sprite_accessory/ears/wolf_green - name = "wolf, green" - desc = "" - icon_state = "wolf-green" - -/datum/sprite_accessory/ears/wisewolf - name = "wolf, wise" - desc = "" - icon_state = "wolf-wise" - -/datum/sprite_accessory/ears/mouse_grey - name = "mouse, grey" - desc = "" - icon_state = "mouse-grey" - -/datum/sprite_accessory/ears/bee - name = "bee antennae" - desc = "" - icon_state = "bee" - -/datum/sprite_accessory/ears/antennae - name = "antennae, colorable" - desc = "" - icon_state = "antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/curly_bug - name = "curly antennae, colorable" - desc = "" - icon_state = "curly_bug" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/dual_robot - name = "synth antennae, colorable" - desc = "" - icon_state = "dual_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/right_robot - name = "right synth, colorable" - desc = "" - icon_state = "right_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/left_robot - name = "left synth, colorable" - desc = "" - icon_state = "left_robot_antennae" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/oni_h1 - name = "oni horns" - desc = "" - icon_state = "oni-h1" - -/datum/sprite_accessory/ears/oni_h1_c - name = "oni horns, colorable" - desc = "" - icon_state = "oni-h1_c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/demon_horns1 - name = "demon horns" - desc = "" - icon_state = "demon-horns1" - -/datum/sprite_accessory/ears/demon_horns1_c - name = "demon horns, colorable" - desc = "" - icon_state = "demon-horns1_c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/demon_horns2 - name = "demon horns, colorable(outward)" - desc = "" - icon_state = "demon-horns2" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/dragon_horns - name = "dragon horns, colorable" - desc = "" - icon_state = "dragon-horns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/foxears - name = "highlander zorren ears" - desc = "" - icon_state = "foxears" - -/datum/sprite_accessory/ears/fenears - name = "flatland zorren ears" - desc = "" - icon_state = "fenears" - -/datum/sprite_accessory/ears/sergal //Redundant - name = "Sergal ears" - icon_state = "serg_plain_s" - -/datum/sprite_accessory/ears/foxearshc - name = "highlander zorren ears, colorable" - desc = "" - icon_state = "foxearshc" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/fenearshc - name = "flatland zorren ears, colorable" - desc = "" - icon_state = "fenearshc" - extra_overlay = "fenears-inner" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/sergalhc - name = "Sergal ears, colorable" - icon_state = "serg_plain_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/mousehc - name = "mouse, colorable" - desc = "" - icon_state = "mouse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "mouseinner" - -/datum/sprite_accessory/ears/mousehcno - name = "mouse, colorable, no inner" - desc = "" - icon_state = "mouse" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/wolfhc - name = "wolf, colorable" - desc = "" - icon_state = "wolf" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "wolfinner" - -/datum/sprite_accessory/ears/bearhc - name = "bear, colorable" - desc = "" - icon_state = "bear" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/smallbear - name = "small bear" - desc = "" - icon_state = "smallbear" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/squirrelhc - name = "squirrel, colorable" - desc = "" - icon_state = "squirrel" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/kittyhc - name = "kitty, colorable" - desc = "" - icon_state = "kitty" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "kittyinner" - -/datum/sprite_accessory/ears/bunnyhc - name = "bunny, colorable" - desc = "" - icon_state = "bunny" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/antlers - name = "antlers" - desc = "" - icon_state = "antlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/antlers_e - name = "antlers with ears" - desc = "" - icon_state = "cow-nohorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "antlers_mark" - -/datum/sprite_accessory/ears/smallantlers - name = "small antlers" - desc = "" - icon_state = "smallantlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/smallantlers_e - name = "small antlers with ears" - desc = "" - icon_state = "smallantlers" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "deer" - -/datum/sprite_accessory/ears/deer - name = "deer ears" - desc = "" - icon_state = "deer" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/cow - name = "cow, horns" - desc = "" - icon_state = "cow" - -/datum/sprite_accessory/ears/cowc - name = "cow, horns, colorable" - desc = "" - icon_state = "cow-c" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/cow_nohorns - name = "cow, no horns" - desc = "" - icon_state = "cow-nohorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/caprahorns - name = "caprine horns" - desc = "" - icon_state = "caprahorns" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/otie - name = "otie, colorable" - desc = "" - icon_state = "otie" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "otie-inner" - -/datum/sprite_accessory/ears/donkey - name = "donkey, colorable" - desc = "" - icon_state = "donkey" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "otie-inner" - -/datum/sprite_accessory/ears/zears - name = "jagged ears" - desc = "" - icon_state = "zears" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/elfs - name = "elven ears" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/sleek - name = "sleek ears" - desc = "" - icon_state = "sleek" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/drake - name = "drake frills" - desc = "" - icon_state = "drake" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/vulp - name = "vulpkanin, dual-color" - desc = "" - icon_state = "vulp" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulp-inner" - -/datum/sprite_accessory/ears/vulp_short - name = "vulpkanin short" - desc = "" - icon_state = "vulp_terrier" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/vulp_short_dc - name = "vulpkanin short, dual-color" - desc = "" - icon_state = "vulp_terrier" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulp_terrier-inner" - -/datum/sprite_accessory/ears/vulp_jackal - name = "vulpkanin thin, dual-color" - desc = "" - icon_state = "vulp_jackal" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "vulp_jackal-inner" - -/datum/sprite_accessory/ears/bunny_floppy - name = "floopy bunny ears (colorable)" - desc = "" - icon_state = "floppy_bun" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/teshari - name = "Teshari (colorable)" - desc = "" - icon_state = "teshari" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshariinner" - -/datum/sprite_accessory/ears/tesharihigh - name = "Teshari upper ears (colorable)" - desc = "" - icon_state = "tesharihigh" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tesharihighinner" - -/datum/sprite_accessory/ears/tesharilow - name = "Teshari lower ears (colorable)" - desc = "" - icon_state = "tesharilow" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "tesharilowinner" - -/datum/sprite_accessory/ears/tesh_pattern_ear_male - name = "Teshari male ear pattern (colorable)" - desc = "" - icon_state = "teshari" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshari_male_pattern" - -/datum/sprite_accessory/ears/tesh_pattern_ear_female - name = "Teshari female ear pattern (colorable)" - desc = "" - icon_state = "teshari" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "teshari_female_pattern" - -/datum/sprite_accessory/ears/inkling - name = "colorable mature inkling hair" - desc = "" - icon = 'icons/mob/human_face_vr.dmi' - icon_state = "inkling-colorable" - color_blend_mode = ICON_MULTIPLY - do_colouration = 1 - -/datum/sprite_accessory/ears/large_dragon - name = "Large dragon horns" - desc = "" - icon_state = "big_liz" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -// Special snowflake ears go below here. - -/datum/sprite_accessory/ears/molenar_kitsune - name = "quintail kitsune ears (Molenar)" - desc = "" - icon_state = "molenar-kitsune" - -/datum/sprite_accessory/ears/lilimoth_antennae - name = "citheronia antennae (Kira72)" - desc = "" - icon_state = "lilimoth_antennae" - -/datum/sprite_accessory/ears/molenar_deathclaw - name = "deathclaw ears (Molenar)" - desc = "" - icon_state = "molenar-deathclaw" - -/datum/sprite_accessory/ears/miria_fluffdragon - name = "fluffdragon ears (Miria Masters)" - desc = "" - icon_state = "miria-fluffdragonears" - -/datum/sprite_accessory/ears/miria_kitsune - name = "kitsune ears (Miria Masters)" - desc = "" - icon_state = "miria-kitsuneears" - -/datum/sprite_accessory/ears/runac - name = "fennecsune ears (Runac)" - desc = "" - icon_state = "runac" - -/datum/sprite_accessory/ears/kerena - name = "wingwolf ears (Kerena)" - desc = "" - icon_state = "kerena" - -/datum/sprite_accessory/ears/rosey - name = "tritail kitsune ears (Rosey)" - desc = "" - icon_state = "rosey" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/aronai - name = "aronai ears/head (Aronai)" - desc = "" - icon_state = "aronai" - -/datum/sprite_accessory/ears/holly - name = "tigress ears (Holly Sharp)" - desc = "" - icon_state = "tigressears" - -/datum/sprite_accessory/ears/molenar_inkling - name = "teal mature inkling hair (Kari Akiren)" - desc = "" - icon_state = "molenar-tentacle" - -/datum/sprite_accessory/ears/shock - name = "pharoah hound ears (Shock Diamond)" - desc = "" - icon_state = "shock" - -/datum/sprite_accessory/ears/alurane - name = "alurane ears/hair (Pumila)" - desc = "" - icon_state = "alurane-ears" - -/datum/sprite_accessory/ears/frost - name = "Frost antenna" - desc = "" - icon_state = "frosted_tips" - -/datum/sprite_accessory/ears/sylv_pip - name = "sylveon ears and ribbons (Pip Shyner)" - desc = "" - icon_state = "pipears" - -/datum/sprite_accessory/ears/elf_caprine_colorable - name = "Caprine horns with pointy ears, colorable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "caprahorns" - -/datum/sprite_accessory/ears/elf_oni_colorable - name = "oni horns with pointy ears, colorable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "oni-h1_c" - -/datum/sprite_accessory/ears/elf_demon_colorable - name = "Demon horns with pointy ears, colorable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "demon-horns1_c" - -/datum/sprite_accessory/ears/elf_demon_outwards_colorable - name = "Demon horns with pointy ears, outwards, colourable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "demon-horns2" - -/datum/sprite_accessory/ears/elf_dragon_colorable - name = "Dragon horns with pointy ears, colourable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "dragon-horns" - -/datum/sprite_accessory/ears/synthhorns_plain - name = "Synth horns, plain" - desc = "" - icon_state = "synthhorns_plain" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "synthhorns_plain_light" - -/datum/sprite_accessory/ears/synthhorns_thick - name = "Synth horns, thick" - desc = "" - icon_state = "synthhorns_thick" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "synthhorns_thick_light" - -/datum/sprite_accessory/ears/synthhorns_curly - name = "Synth horns, curly" - desc = "" - icon_state = "synthhorns_curled" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - - -/datum/sprite_accessory/ears/forward_curled_demon_horns_bony - name = "Succubus horns, colourable" - desc = "" - icon_state = "succu-horns_b" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/forward_curled_demon_horns_bony_with_colorable_ears - name = "Succubus horns with pointy ears, colourable" - desc = "" - icon_state = "elfs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "succu-horns_b" - -/datum/sprite_accessory/ears/chorns_nubbydogs - name = "Nubby Chorns" - desc = "" - icon_state = "chorn_nubby" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_herk - name = "Herk Chorns" - desc = "" - icon_state = "chorn_herk" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_bork - name = "Bork Chorns" - desc = "" - icon_state = "chorn_bork" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_bull - name = "Bull Chorns" - desc = "" - icon_state = "chorn_bull" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_bicarrot - name = "Bicarrot Chorns" - desc = "" - icon_state = "chorn_bicarrot" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_longcarrot - name = "Long Carrot Chorns" - desc = "" - icon_state = "chorn_longcarrot" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_shortcarrot - name = "Short Carrot Chorns" - desc = "" - icon_state = "chorn_shortcarrot" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_scorp - name = "Scorp Chorns" - desc = "" - icon_state = "chorn_scorp" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_ocean - name = "Ocean Chorns" - desc = "" - icon_state = "chorn_ocean" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/ears/chorns_chub - name = "Chub Chorns" - desc = "" - icon_state = "chorn_chub" - do_colouration = 0 - color_blend_mode = ICON_MULTIPLY - - - - -/* -//////////////////////////// -/ =--------------------= / -/ == Wing Definitions == / -/ =--------------------= / -//////////////////////////// -*/ -/datum/sprite_accessory/wing - name = "You should not see this..." - icon = 'icons/mob/vore/wings_vr.dmi' - do_colouration = 0 //Set to 1 to enable coloration using the tail color. - - color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/extra_overlay2 //Tertiary. - var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it. If the clothing is bulky enough to hide a tail, it should also hide wings. - // var/show_species_tail = 1 // Just so // TODO - Seems not needed ~Leshana - var/desc = "You should not see this..." - var/ani_state // State when flapping/animated - var/extra_overlay_w // Flapping state for extra overlay - var/extra_overlay2_w - -/datum/sprite_accessory/wing/shock //Unable to split the tail from the wings in the sprite, so let's just classify it as wings. - name = "pharoah hound tail (Shock Diamond)" - desc = "" - icon_state = "shock" - -/datum/sprite_accessory/wing/featheredlarge //Made by Natje! - name = "large feathered wings (colorable)" - desc = "" - icon_state = "feathered2" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here. - name = "spider legs" - desc = "" - icon_state = "spider-legs" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/moth - name = "moth wings" - desc = "" - icon_state = "moth" - -/datum/sprite_accessory/wing/mothc - name = "moth wings, colorable" - desc = "" - icon_state = "moth" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/dragonfly - name = "dragonfly" - desc = "" - icon_state = "dragonfly" - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/citheroniamoth - name = "citheronia wings" - desc = "" - icon_state = "citheronia_wings" - -/datum/sprite_accessory/wing/feathered - name = "feathered wings, colorable" - desc = "" - icon_state = "feathered" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/feathered_medium - name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys. - desc = "" - icon_state = "feathered3" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/bat_black - name = "bat wings, black" - desc = "" - icon_state = "bat-black" - -/datum/sprite_accessory/wing/bat_color - name = "bat wings, colorable" - desc = "" - icon_state = "bat-color" - do_colouration = 1 - -/datum/sprite_accessory/wing/bat_red - name = "bat wings, red" - desc = "" - icon_state = "bat-red" - -/datum/sprite_accessory/wing/harpywings - name = "harpy wings, colorable" - desc = "" - icon_state = "harpywings" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/harpywings_alt - name = "harpy wings alt, archeopteryx" - desc = "" - icon_state = "harpywings_alt" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_altmarkings" - -/datum/sprite_accessory/wing/harpywings_alt_neckfur - name = "harpy wings alt, archeopteryx & neckfur" - desc = "" - icon_state = "harpywings_alt" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_altmarkings" - extra_overlay2 = "neckfur" - -/datum/sprite_accessory/wing/harpywings_bat - name = "harpy wings, bat" - desc = "" - icon_state = "harpywings_bat" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_batmarkings" - -/datum/sprite_accessory/wing/harpywings_bat_neckfur - name = "harpy wings, bat & neckfur" - desc = "" - icon_state = "harpywings_bat" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "harpywings_batmarkings" - extra_overlay2 = "neckfur" - -/datum/sprite_accessory/wing/neckfur - name = "neck fur" - desc = "" - icon_state = "neckfur" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/feathered - name = "feathered wings, colorable" - desc = "" - icon_state = "feathered" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/beewings - name = "bee wings" - desc = "" - icon_state = "beewings" - -/datum/sprite_accessory/wing/sepulchre - name = "demon wings (Sepulchre)" - desc = "" - icon_state = "sepulchre_wings" - -/datum/sprite_accessory/wing/miria_fluffdragon - name = "fluffdragon wings (Miria Masters)" - desc = "" - icon_state = "miria-fluffdragontail" - -/datum/sprite_accessory/wing/scree - name = "green taj wings (Scree)" - desc = "" - icon_state = "scree-wings" - -/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings? - name = "gazer eyestalks" - desc = "" - icon_state = "liquidfirefly-eyestalks" - -/datum/sprite_accessory/wing/moth_full - name = "moth antenna and wings" - desc = "" - icon_state = "moth_full" - -/datum/sprite_accessory/wing/moth_full_gray - name = "moth antenna and wings, colorable" - desc = "" - icon_state = "moth_full_gray" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/kerena - name = "wingwolf wings (Kerena)" - desc = "" - icon_state = "kerena-wings" - -/datum/sprite_accessory/wing/snag - name = "xenomorph backplate" - desc = "" - icon_state = "snag-backplate" - -/datum/sprite_accessory/wing/sepulchre_c_yw - name = "demon wings (colorable)" - desc = "" - icon_state = "sepulchre_wingsc" - do_colouration = 1 - -/datum/sprite_accessory/wing/cyberdragon - name = "Cyber dragon wing (colorable)" - desc = "" - icon_state = "cyberdragon_s" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/wing/cyberdragon_red - name = "Cyber dragon wing (red)" - desc = "" - icon_state = "cyberdragon_red_s" - do_colouration = 0 - -/datum/sprite_accessory/wing/cyberdoe - name = "Cyber doe wing" - desc = "" - icon_state = "cyberdoe_s" - do_colouration = 0 - -/datum/sprite_accessory/wing/drago_wing - name = "Cybernetic Dragon wings" - desc = "" - icon_state = "drago_wing" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - extra_overlay = "drago_wing_2" - /* //////////////////////////// / =--------------------= / @@ -952,20 +9,7 @@ name = "You should not see this..." icon = 'icons/mob/vore/tails_vr.dmi' do_colouration = 0 //Set to 1 to enable coloration using the tail color. - - color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/extra_overlay // Icon state of an additional overlay to blend in. - var/extra_overlay2 //Tertiary. - var/show_species_tail = 0 // If false, do not render species' tail. - var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it - var/desc = "You should not see this..." - var/ani_state // State when wagging/animated - var/extra_overlay_w // Wagging state for extra overlay - var/extra_overlay2_w // Tertiary wagging. - var/list/hide_body_parts = list() //Uses organ tag defines. Bodyparts in this list do not have their icons rendered, allowing for more spriter freedom when doing taur/digitigrade stuff. - var/icon/clip_mask_icon = null //Icon file used for clip mask. - var/clip_mask_state = null //Icon state to generate clip mask. Clip mask is used to 'clip' off the lower part of clothing such as jumpsuits & full suits. - var/icon/clip_mask = null //Instantiated clip mask of given icon and state + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use /datum/sprite_accessory/tail/New() . = ..() @@ -1202,36 +246,43 @@ name = "quintail kitsune tails (Molenar)" desc = "" icon_state = "molenar-kitsune" + ckeys_allowed = list("molenar") /datum/sprite_accessory/tail/miria_fluffdragon name = "fluffdragon tail (Miria Masters)" desc = "" icon_state = "miria-fluffdragontail" + ckeys_allowed = list("miriamasters") /datum/sprite_accessory/tail/miria_kitsune name = "Black kitsune tails (Miria Masters)" desc = "" icon_state = "miria-kitsunetail" + ckeys_allowed = list("miriamasters") /datum/sprite_accessory/tail/molenar_deathclaw name = "deathclaw bits (Molenar)" desc = "" icon_state = "molenar-deathclaw" + ckeys_allowed = list("molenar","silvertalismen","jertheace") /datum/sprite_accessory/tail/runac name = "fennecsune tails (Runac)" desc = "" icon_state = "runac" + ckeys_allowed = list("rebcom1807") /datum/sprite_accessory/tail/reika //Leaving this since it was too hard to split the wings from the tail. name = "fox tail (+ beewings) (Reika)" desc = "" icon_state = "reika" + ckeys_allowed = list("rikaru19xjenkins") /datum/sprite_accessory/tail/rosey name = "tritail kitsune tails (Rosey)" desc = "" icon_state = "rosey_three" + ckeys_allowed = list("joey4298") /datum/sprite_accessory/tail/rosey2 name = "pentatail kitsune tails (Rosey)" //I predict seven tails next. ~CK @@ -1239,32 +290,38 @@ icon_state = "rosey_five" do_colouration = 1 color_blend_mode = ICON_MULTIPLY + ckeys_allowed = list("joey4298") /datum/sprite_accessory/tail/scree name = "green taj tail (Scree)" desc = "" icon_state = "scree" + ckeys_allowed = list("scree") /datum/sprite_accessory/tail/aronai name = "aronai tail (Aronai)" desc = "" icon_state = "aronai" + ckeys_allowed = list("arokha") /datum/sprite_accessory/tail/cabletail name = "cabletail" desc = "cabletail" icon_state = "cabletail" + ckeys_allowed = list("tucker0666") /datum/sprite_accessory/tail/featherfluff_tail name = "featherfluff_tail" desc = "" icon_state = "featherfluff_tail" + ckeys_allowed = list("tucker0666") /datum/sprite_accessory/tail/ketrai_wag name = "fennix tail (vwag)" desc = "" icon_state = "ketraitail" ani_state = "ketraitail_w" + //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone. /datum/sprite_accessory/tail/ketrainew_wag name = "new fennix tail (vwag)" @@ -1289,6 +346,7 @@ name = "tigress tail (Holly)" desc = "" icon_state = "tigresstail" + ckeys_allowed = list("hoodoo") /datum/sprite_accessory/tail/satyr name = "goat legs, colorable" @@ -1928,6 +986,8 @@ icon_state = "shadekin-short" do_colouration = 1 color_blend_mode = ICON_MULTIPLY + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) /datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts name = "Ward-Takahashi Tail" @@ -2078,30 +1138,3 @@ do_colouration = 1 color_blend_mode = ICON_MULTIPLY ckeys_allowed = list("prettiebyrd") - -/* -//////////////////////////// -/ =--------------------= / -/ == Misc Definitions == / -/ =--------------------= / -//////////////////////////// -*/ - -// Yes, I have to add all of this just to make some glowy hair. -// No, this isn't a character creation option, but... I guess in the future it could be, if anyone wants that? - -/datum/sprite_accessory/hair_accessory - name = "You should not see this..." - icon = 'icons/mob/vore/hair_accessories_vr.dmi' - do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color - - var/ignores_lighting = 0 // Whether or not this hair accessory will ignore lighting and glow in the dark. - color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 - var/desc = "You should not see this..." - -/datum/sprite_accessory/hair_accessory/verie_hair_glow - name = "verie's hair glow" - desc = "" - icon_state = "verie_hair_glow" - ignores_lighting = 1 - //ckeys_allowed = list("vitoras") // This probably won't come into play EVER but better safe than sorry diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm new file mode 100644 index 0000000000..748a6904b4 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_taur.dm @@ -0,0 +1,349 @@ +/datum/riding/taur + keytype = /obj/item/weapon/material/twohanded/riding_crop // Crack! + nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. + key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. + only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. + +/datum/riding/taur/handle_vehicle_layer() + if(ridden.has_buckled_mobs()) + ridden.layer = initial(ridden.layer) + else + var/mob/living/L = ridden + if(!(istype(L) && (L.status_flags & HIDING))) + ridden.layer = initial(ridden.layer) + +/datum/riding/taur/ride_check(mob/living/M) + var/mob/living/L = ridden + if(L.stat) + force_dismount(M) + return FALSE + return TRUE + +/datum/riding/taur/force_dismount(mob/M) + . = ..() + ridden.visible_message("[M] stops riding [ridden]!") + +//Hoooo boy. +/datum/riding/taur/get_offsets(pass_index) // list(dir = x, y, layer) + var/mob/living/L = ridden + var/scale_x = L.icon_scale_x + var/scale_y = L.icon_scale_y + + var/list/values = list( + "[NORTH]" = list(0, 8*scale_y, ABOVE_MOB_LAYER), + "[SOUTH]" = list(0, 8*scale_y, BELOW_MOB_LAYER), + "[EAST]" = list(-10*scale_x, 8*scale_y, ABOVE_MOB_LAYER), + "[WEST]" = list(10*scale_x, 8*scale_y, ABOVE_MOB_LAYER)) + + return values + +//Human overrides for taur riding +/mob/living/carbon/human + max_buckled_mobs = 1 //Yeehaw + can_buckle = TRUE + buckle_movable = TRUE + buckle_lying = FALSE + +/mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE) + if(forced) + return ..() // Skip our checks + if(!isTaurTail(tail_style)) + return FALSE + else + var/datum/sprite_accessory/tail/taur/taurtype = tail_style + if(!taurtype.can_ride) + return FALSE + if(lying) + return FALSE + if(!ishuman(M)) + return FALSE + if(M in buckled_mobs) + return FALSE +// if(M.size_multiplier > size_multiplier * 1.2) +// to_chat(M,"This isn't a pony show! You need to be bigger for them to ride.") +// return FALSE + if(M.loc != src.loc) + if(M.Adjacent(src)) + M.forceMove(get_turf(src)) + + var/mob/living/carbon/human/H = M + + if(isTaurTail(H.tail_style)) + to_chat(src,"Too many legs. TOO MANY LEGS!!") + return FALSE + + . = ..() + if(.) + buckled_mobs[M] = "riding" + +/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use. + return + +/mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1)) + set name = "Taur Mount/Dismount" + set category = "Abilities" + set desc = "Let people ride on you." + + if(LAZYLEN(buckled_mobs)) + var/datum/riding/R = riding_datum + for(var/rider in buckled_mobs) + R.force_dismount(rider) + return + if (stat != CONSCIOUS) + return + if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled) + return + if(buckle_mob(M)) + visible_message("[M] starts riding [name]!") + +/mob/living/carbon/human/attack_hand(mob/user as mob) + if(LAZYLEN(buckled_mobs)) + //We're getting off! + if(user in buckled_mobs) + riding_datum.force_dismount(user) + //We're kicking everyone off! + if(user == src) + for(var/rider in buckled_mobs) + riding_datum.force_dismount(rider) + else + . = ..() + +/* +//////////////////////////// +/ =--------------------= / +/ == Taur Definitions == / +/ =--------------------= / +//////////////////////////// +*/ + +// Taur sprites are now a subtype of tail since they are mutually exclusive anyway. + +/datum/sprite_accessory/tail/taur + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/taurs.dmi' + do_colouration = 1 // Yes color, using tail color + color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY + + var/icon/suit_sprites = null //File for suit sprites, if any. + var/icon/under_sprites = null + + var/icon_sprite_tag // This is where we put stuff like _Horse, so we can assign icons easier. + + var/can_ride = FALSE //whether we're real rideable taur or just in that category. + + hide_body_parts = list(BP_L_LEG, BP_L_FOOT, BP_R_LEG, BP_R_FOOT) //Exclude pelvis just in case. + clip_mask_icon = 'icons/mob/human_races/sprite_accessories/taurs.dmi' + clip_mask_state = "taur_clip_mask_def" //Used to clip off the lower part of suits & uniforms. + +// Species-unique long tails/taurhalves + +// Tails/taurhalves for everyone + +/datum/sprite_accessory/tail/taur/wolf + name = "Wolf (Taur)" + icon_state = "wolf_s" + under_sprites = 'icons/mob/taursuits_wolf.dmi' + suit_sprites = 'icons/mob/taursuits_wolf.dmi' + icon_sprite_tag = "wolf" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/fatwolf + name = "Fat Wolf (Taur)" + icon_state = "fatwolf_s" + icon_sprite_tag = "wolf" //This could be modified later. + +/datum/sprite_accessory/tail/taur/wolf/wolf_2c + name = "Wolf dual-color (Taur)" + icon_state = "wolf_s" + extra_overlay = "wolf_markings" + //icon_sprite_tag = "wolf2c" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c + name = "Fat Wolf dual-color (Taur)" + icon_state = "fatwolf_s" + extra_overlay = "fatwolf_markings" + //icon_sprite_tag = "fatwolf2c" + +/datum/sprite_accessory/tail/taur/wolf/synthwolf + name = "SynthWolf dual-color (Taur)" + icon_state = "synthwolf_s" + extra_overlay = "synthwolf_markings" + //icon_sprite_tag = "synthwolf" + +/datum/sprite_accessory/tail/taur/naga + name = "Naga (Taur)" + icon_state = "naga_s" + suit_sprites = 'icons/mob/taursuits_naga.dmi' + //icon_sprite_tag = "naga" + +/datum/sprite_accessory/tail/taur/naga/naga_2c + name = "Naga dual-color (Taur)" + icon_state = "naga_s" + extra_overlay = "naga_markings" + //icon_sprite_tag = "naga2c" + +/datum/sprite_accessory/tail/taur/horse + name = "Horse (Taur)" + icon_state = "horse_s" + under_sprites = 'icons/mob/taursuits_horse.dmi' + suit_sprites = 'icons/mob/taursuits_horse.dmi' + icon_sprite_tag = "horse" + +/datum/sprite_accessory/tail/taur/horse/synthhorse + name = "SynthHorse dual-color (Taur)" + icon_state = "synthhorse_s" + extra_overlay = "synthhorse_markings" + //icon_sprite_tag = "synthhorse" + +/datum/sprite_accessory/tail/taur/cow + name = "Cow (Taur)" + icon_state = "cow_s" + suit_sprites = 'icons/mob/taursuits_cow.dmi' + icon_sprite_tag = "cow" + +/datum/sprite_accessory/tail/taur/deer + name = "Deer dual-color (Taur)" + icon_state = "deer_s" + extra_overlay = "deer_markings" + suit_sprites = 'icons/mob/taursuits_deer.dmi' + icon_sprite_tag = "deer" + +/datum/sprite_accessory/tail/taur/lizard + name = "Lizard (Taur)" + icon_state = "lizard_s" + suit_sprites = 'icons/mob/taursuits_lizard.dmi' + icon_sprite_tag = "lizard" + +/datum/sprite_accessory/tail/taur/lizard/lizard_2c + name = "Lizard dual-color (Taur)" + icon_state = "lizard_s" + extra_overlay = "lizard_markings" + //icon_sprite_tag = "lizard2c" + +/datum/sprite_accessory/tail/taur/lizard/synthlizard + name = "SynthLizard dual-color (Taur)" + icon_state = "synthlizard_s" + extra_overlay = "synthlizard_markings" + //icon_sprite_tag = "synthlizard" + +/datum/sprite_accessory/tail/taur/spider + name = "Spider (Taur)" + icon_state = "spider_s" + suit_sprites = 'icons/mob/taursuits_spider.dmi' + icon_sprite_tag = "spider" + +/datum/sprite_accessory/tail/taur/tents + name = "Tentacles (Taur)" + icon_state = "tent_s" + icon_sprite_tag = "tentacle" + can_ride = 0 + +/datum/sprite_accessory/tail/taur/feline + name = "Feline (Taur)" + icon_state = "feline_s" + suit_sprites = 'icons/mob/taursuits_feline.dmi' + icon_sprite_tag = "feline" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/fatfeline + name = "Fat Feline (Taur)" + icon_state = "fatfeline_s" + //icon_sprite_tag = "fatfeline" + +/datum/sprite_accessory/tail/taur/fatfeline_wag + name = "Fat Feline (Taur) (vwag)" + icon_state = "fatfeline_s" + ani_state = "fatfeline_w" + +/datum/sprite_accessory/tail/taur/feline/feline_2c + name = "Feline dual-color (Taur)" + icon_state = "feline_s" + extra_overlay = "feline_markings" + //icon_sprite_tag = "feline2c" + +//TFF 22/11/19 - CHOMPStation port of fat taur sprites +/datum/sprite_accessory/tail/taur/feline/fatfeline_2c + name = "Fat Feline dual-color (Taur)" + icon_state = "fatfeline_s" + extra_overlay = "fatfeline_markings" + //icon_sprite_tag = "fatfeline2c" + +/datum/sprite_accessory/tail/taur/feline/synthfeline + name = "SynthFeline dual-color (Taur)" + icon_state = "synthfeline_s" + extra_overlay = "synthfeline_markings" + //icon_sprite_tag = "synthfeline" + +/datum/sprite_accessory/tail/taur/slug + name = "Slug (Taur)" + icon_state = "slug_s" + suit_sprites = 'icons/mob/taursuits_slug.dmi' + icon_sprite_tag = "slug" + +/datum/sprite_accessory/tail/taur/frog + name = "Frog (Taur)" + icon_state = "frog_s" + icon_sprite_tag = "frog" + +/datum/sprite_accessory/tail/taur/thicktentacles + name = "Thick Tentacles (Taur)" + icon_state = "tentacle_s" + can_ride = 0 + icon_sprite_tag = "thick_tentacles" + +/datum/sprite_accessory/tail/taur/drake //Enabling on request, no suit compatibility but then again see 2 above. + name = "Drake (Taur)" + icon_state = "drake_s" + extra_overlay = "drake_markings" + suit_sprites = 'icons/mob/taursuits_drake.dmi' + icon_sprite_tag = "drake" + +/datum/sprite_accessory/tail/taur/otie + name = "Otie (Taur)" + icon_state = "otie_s" + extra_overlay = "otie_markings" + suit_sprites = 'icons/mob/taursuits_otie.dmi' + icon_sprite_tag = "otie" + +/datum/sprite_accessory/tail/taur/alraune/alraune_2c + name = "Alraune (dual color)" + icon_state = "alraunecolor_s" + ani_state = "alraunecolor_closed_s" + ckeys_allowed = null + do_colouration = 1 + extra_overlay = "alraunecolor_markings" + extra_overlay_w = "alraunecolor_closed_markings" + clip_mask_state = "taur_clip_mask_alraune" + icon_sprite_tag = "alraune" + +/datum/sprite_accessory/tail/taur/wasp + name = "Wasp (dual color)" + icon_state = "wasp_s" + extra_overlay = "wasp_markings" + clip_mask_state = "taur_clip_mask_wasp" + icon_sprite_tag = "wasp" + +/datum/sprite_accessory/tail/taur/mermaid + name = "Mermaid (Taur)" + icon_state = "mermaid_s" + can_ride = 0 + icon_sprite_tag = "mermaid" + +/datum/sprite_accessory/tail/taur/shadekin_tail + name = "Shadekin Tail" + icon_state = "shadekin_s" + can_ride = 0 + hide_body_parts = null + clip_mask_icon = null + clip_mask_state = null + //apply_restrictions = TRUE + //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) + +/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_2c + name = "Shadekin Tail (dual color)" + extra_overlay = "shadekin_markings" + +/datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_long + name = "Shadekin Long Tail" + icon_state = "shadekin_long_s" diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm similarity index 88% rename from code/modules/vore/appearance/sprite_accessories_taur_vr.dm rename to code/modules/mob/new_player/sprite_accessories_taur_vr.dm index db65f1dfa5..0464214518 100644 --- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm @@ -1,117 +1,3 @@ -/datum/riding/taur - keytype = /obj/item/weapon/material/twohanded/fluff/riding_crop // Crack! - nonhuman_key_exemption = FALSE // If true, nonhumans who can't hold keys don't need them, like borgs and simplemobs. - key_name = "a riding crop" // What the 'keys' for the thing being rided on would be called. - only_one_driver = TRUE // If true, only the person in 'front' (first on list of riding mobs) can drive. - -/datum/riding/taur/handle_vehicle_layer() - if(ridden.has_buckled_mobs()) - ridden.layer = initial(ridden.layer) - else - var/mob/living/L = ridden - if(!(istype(L) && (L.status_flags & HIDING))) - ridden.layer = initial(ridden.layer) - -/datum/riding/taur/ride_check(mob/living/M) - var/mob/living/L = ridden - if(L.stat) - force_dismount(M) - return FALSE - return TRUE - -/datum/riding/taur/force_dismount(mob/M) - . = ..() - ridden.visible_message("[M] stops riding [ridden]!") - -//Hoooo boy. -/datum/riding/taur/get_offsets(pass_index) // list(dir = x, y, layer) - var/mob/living/L = ridden - var/scale = L.size_multiplier - - var/list/values = list( - "[NORTH]" = list(0, 8*scale, ABOVE_MOB_LAYER), - "[SOUTH]" = list(0, 8*scale, BELOW_MOB_LAYER), - "[EAST]" = list(-10*scale, 8*scale, ABOVE_MOB_LAYER), - "[WEST]" = list(10*scale, 8*scale, ABOVE_MOB_LAYER)) - - return values - -//Human overrides for taur riding -/mob/living/carbon/human - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - -/mob/living/carbon/human/buckle_mob(mob/living/M, forced = FALSE, check_loc = TRUE) - if(forced) - return ..() // Skip our checks - if(!isTaurTail(tail_style)) - return FALSE - else - var/datum/sprite_accessory/tail/taur/taurtype = tail_style - if(!taurtype.can_ride) - return FALSE - if(lying) - return FALSE - if(!ishuman(M)) - return FALSE - if(M in buckled_mobs) - return FALSE - if(M.size_multiplier > size_multiplier * 1.2) - to_chat(M,"This isn't a pony show! You need to be bigger for them to ride.") - return FALSE - if(M.loc != src.loc) - if(M.Adjacent(src)) - M.forceMove(get_turf(src)) - - var/mob/living/carbon/human/H = M - - if(isTaurTail(H.tail_style)) - var/datum/sprite_accessory/tail/taur/ridertype = H.tail_style - if(ridertype.can_ride) - if(istype(ridertype, /datum/sprite_accessory/tail/taur/naga) || istype(ridertype, /datum/sprite_accessory/tail/taur/slug)) - to_chat(src,"Too few legs. TOO FEW LEGS!!") - return FALSE - to_chat(src,"Too many legs. TOO MANY LEGS!!") - return FALSE - - . = ..() - if(.) - buckled_mobs[M] = "riding" - -/mob/living/carbon/human/MouseDrop_T(mob/living/M, mob/living/user) //Prevention for forced relocation caused by can_buckle. Base proc has no other use. - return - -/mob/living/carbon/human/proc/taur_mount(var/mob/living/M in living_mobs(1)) - set name = "Taur Mount/Dismount" - set category = "Abilities" - set desc = "Let people ride on you." - - if(LAZYLEN(buckled_mobs)) - var/datum/riding/R = riding_datum - for(var/rider in buckled_mobs) - R.force_dismount(rider) - return - if (stat != CONSCIOUS) - return - if(!can_buckle || !istype(M) || !M.Adjacent(src) || M.buckled) - return - if(buckle_mob(M)) - visible_message("[M] starts riding [name]!") - -/mob/living/carbon/human/attack_hand(mob/user as mob) - if(LAZYLEN(buckled_mobs)) - //We're getting off! - if(user in buckled_mobs) - riding_datum.force_dismount(user) - //We're kicking everyone off! - if(user == src) - for(var/rider in buckled_mobs) - riding_datum.force_dismount(rider) - else - . = ..() - /* //////////////////////////// / =--------------------= / @@ -128,12 +14,7 @@ do_colouration = 1 // Yes color, using tail color color_blend_mode = ICON_MULTIPLY // The sprites for taurs are designed for ICON_MULTIPLY - var/icon/suit_sprites = null //File for suit sprites, if any. - var/icon/under_sprites = null - - var/icon_sprite_tag // This is where we put stuff like _Horse, so we can assign icons easier. - - var/can_ride = 1 //whether we're real rideable taur or just in that category + can_ride = TRUE //whether we're real rideable taur or just in that category //Could do nested lists but it started becoming a nightmare. It'd be more fun for lookups of a_intent and m_intent, but then subtypes need to //duplicate all the messages, and it starts getting awkward. These are singletons, anyway! @@ -592,12 +473,12 @@ name = "Shadekin Long Tail" icon_state = "shadekin_long_s" -/datum/sprite_accessory/tail/taur/pawcow // this grabs suit sprites from the normal cow, the outline is the same except for the tail +/datum/sprite_accessory/tail/taur/pawcow // this grabs suit sprites from the normal cow, the outline is the same name = "Cow w/ paws (Taur)" icon_state = "pawcow_s" extra_overlay = "pawcow_markings" suit_sprites = 'icons/mob/taursuits_cow_vr.dmi' - icon_sprite_tag = "pawcow" + icon_sprite_tag = "cow" msg_owner_disarm_run = "You quickly push %prey to the ground with your paw!" msg_prey_disarm_run = "%owner pushes you down to the ground with their paw!" diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index ede9fb32de..1b7142a368 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -603,738 +603,29 @@ species_allowed = list(SPECIES_VULPKANIN) gender = NEUTER -//VOREStation Body Markings and Overrides -//Reminder: BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD - -/datum/sprite_accessory/marking //Override for base markings - color_blend_mode = ICON_ADD - -/datum/sprite_accessory/marking/vr - icon = 'icons/mob/human_races/markings_vr.dmi' - - vulp_belly - name = "belly fur (Vulp)" - icon_state = "vulp_belly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - vulp_fullbelly - name = "full belly fur (Vulp)" - icon_state = "vulp_fullbelly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - vulp_crest - name = "belly crest (Vulp)" - icon_state = "vulp_crest" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - vulp_nose - name = "nose (Vulp)" - icon_state = "vulp_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_short_nose - name = "nose, short (Vulp)" - icon_state = "vulp_short_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - snoutstripe - name = "snout stripe (Vulp)" - icon_state = "snoutstripe" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_face - name = "face (Vulp)" - icon_state = "vulp_face" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_facealt - name = "face, alt. (Vulp)" - icon_state = "vulp_facealt" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_earsface - name = "ears and face (Vulp)" - icon_state = "vulp_earsface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - vulp_all - name = "all head highlights (Vulp)" - icon_state = "vulp_all" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sergal_full - name = "Sergal Markings" - icon_state = "sergal_full" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - species_allowed = list("Sergal") - - sergal_full_female - name = "Sergal Markings (Female)" - icon_state = "sergal_full_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - species_allowed = list("Sergal") - - monoeye - name = "Monoeye" - icon_state = "monoeye" - body_parts = list(BP_HEAD) - - spidereyes - name = "Spider Eyes" - icon_state = "spidereyes" - body_parts = list(BP_HEAD) - - sergaleyes - name = "Sergal Eyes" - icon_state = "eyes_sergal" - body_parts = list(BP_HEAD) - - closedeyes - name = "Closed Eyes" - icon_state = "eyes_closed" - body_parts = list(BP_HEAD) - - brows - name = "Eyebrows" - icon_state = "brows" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - nevrean_female - name = "Female Nevrean beak" - icon_state = "nevrean_f" - body_parts = list(BP_HEAD) - color_blend_mode = ICON_MULTIPLY - gender = FEMALE - - nevrean_male - name = "Male Nevrean beak" - icon_state = "nevrean_m" - body_parts = list(BP_HEAD) - color_blend_mode = ICON_MULTIPLY - gender = MALE - - spots - name = "Spots" - icon_state = "spots" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) - - shaggy_mane - name = "Shaggy mane/feathers" - icon_state = "shaggy" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO) - - jagged_teeth - name = "Jagged teeth" - icon_state = "jagged" - body_parts = list(BP_HEAD) - - blank_face - name = "Blank round face (use with monster mouth)" - icon_state = "blankface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - monster_mouth - name = "Monster mouth" - icon_state = "monster" - body_parts = list(BP_HEAD) - - saber_teeth - name = "Saber teeth" - icon_state = "saber" - body_parts = list(BP_HEAD) - - fangs - name = "Fangs" - icon_state = "fangs" - body_parts = list(BP_HEAD) - - tusks - name = "Tusks" - icon_state = "tusks" - body_parts = list(BP_HEAD) - - otie_face - name = "Otie face" - icon_state = "otieface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otie_nose - name = "Otie nose" - icon_state = "otie_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otienose_lite - name = "Short otie nose" - icon_state = "otienose_lite" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - backstripes - name = "Back stripes" - icon_state = "otiestripes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_HEAD) - - belly_butt - name = "Belly and butt" - icon_state = "bellyandbutt" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN,BP_TORSO) - - fingers_toes - name = "Fingers and toes" - icon_state = "fingerstoes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) - - otie_socks - name = "Fingerless socks" - icon_state = "otiesocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - - corvid_beak - name = "Corvid beak" - icon_state = "corvidbeak" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - corvid_belly - name = "Corvid belly" - icon_state = "corvidbelly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD) - - cow_body - name = "Cow markings" - icon_state = "cowbody" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - cow_nose - name = "Cow nose" - icon_state = "cownose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - zmask - name = "Eye mask" - icon_state = "zmask" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - zbody - name = "Thick jagged stripes" - icon_state = "zbody" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO) - - znose - name = "Jagged snout" - icon_state = "znose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otter_nose - name = "Otter nose" - icon_state = "otternose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - otter_face - name = "Otter face" - icon_state = "otterface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - deer_face - name = "Deer face" - icon_state = "deerface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sharkface - name = "Akula snout" - icon_state = "sharkface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sheppy_face - name = "Shepherd snout" - icon_state = "shepface" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - sheppy_back - name = "Shepherd back" - icon_state = "shepback" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - zorren_belly_male - name = "Zorren Male Torso" - icon_state = "zorren_belly" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - zorren_belly_female - name = "Zorren Female Torso" - icon_state = "zorren_belly_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO,BP_GROIN) - - zorren_back_patch - name = "Zorren Back Patch" - icon_state = "zorren_backpatch" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO) - - zorren_face_male - name = "Zorren Male Face" - icon_state = "zorren_face" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = MALE - - zorren_face_female - name = "Zorren Female Face" - icon_state = "zorren_face_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = FEMALE - - zorren_muzzle_male - name = "Zorren Male Muzzle" - icon_state = "zorren_muzzle" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = MALE - - zorren_muzzle_female - name = "Zorren Female Muzzle" - icon_state = "zorren_muzzle_female" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - gender = FEMALE - - zorren_socks - name = "Zorren Socks" - icon_state = "zorren_socks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - - zorren_longsocks - name = "Zorren Longsocks" - icon_state = "zorren_longsocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - - tesh_feathers - name = "Teshari Feathers" - icon_state = "tesh-feathers" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) - - harpy_feathers - name = "Rapala leg Feather" - icon_state = "harpy-feathers" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG) - - harpy_legs - name = "Rapala leg coloring" - icon_state = "harpy-leg" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) - - chooves - name = "Cloven hooves" - icon_state = "chooves" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT) - - alurane - name = "Alurane Body" - icon_state = "alurane" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - ckeys_allowed = list("natje") - - body_tone - name = "Body toning (for emergency contrast loss)" - icon_state = "btone" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) - - gloss - name = "Full body gloss" - icon_state = "gloss" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - eboop_panels - name = "Eggnerd FBP panels" - icon_state = "eboop" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - osocks_rarm - name = "Modular Longsock (right arm)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_R_ARM,BP_R_HAND) - - osocks_larm - name = "Modular Longsock (left arm)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_ARM,BP_L_HAND) - - osocks_rleg - name = "Modular Longsock (right leg)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_R_FOOT,BP_R_LEG) - - osocks_lleg - name = "Modular Longsock (left leg)" - icon_state = "osocks" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_L_LEG) - - animeeyesinner - name = "Anime Eyes Inner" - icon_state = "animeeyesinner" - body_parts = list(BP_HEAD) - - animeeyesouter - name = "Anime Eyes Outer" - icon_state = "animeeyesouter" - body_parts = list(BP_HEAD) - - panda_eye_marks - name = "Panda Eye Markings" - icon_state = "eyes_panda" - body_parts = list(BP_HEAD) - species_allowed = list("Human") - - catwomantorso - name = "Catwoman chest stripes" - icon_state = "catwomanchest" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_TORSO) - - catwomangroin - name = "Catwoman groin stripes" - icon_state = "catwomangroin" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN) - - catwoman_rleg - name = "Catwoman right leg stripes" - icon_state = "catwomanright" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_R_LEG) - - catwoman_lleg - name = "Catwoman left leg stripes" - icon_state = "catwomanleft" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG) - - teshi_small_feathers - name = "Teshari small wingfeathers" - icon_state = "teshi_sf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) - - spirit_lights - name = "Ward - Spirit FBP Lights" - icon_state = "lights" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD) - - spirit_lights_body - name = "Ward - Spirit FBP Lights (body)" - icon_state = "lights" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO) - - spirit_lights_head - name = "Ward - Spirit FBP Lights (head)" - icon_state = "lights" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - spirit_panels - name = "Ward - Spirit FBP Panels" - icon_state = "panels" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - spirit_panels_body - name = "Ward - Spirit FBP Panels (body)" - icon_state = "panels" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) - - spirit_panels_head - name = "Ward - Spirit FBP Panels (head)" - icon_state = "panels" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - tentacle_head - name = "Squid Head" - icon_state = "tentaclehead" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - tentacle_mouth - name = "Tentacle Mouth" - icon_state = "tentaclemouth" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - rosette - name = "Rosettes" - icon_state = "rosette" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) - - werewolf_nose - name = "Werewolf nose" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf_nose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_WEREBEAST) - - werewolf_face - name = "Werewolf face" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_WEREBEAST) - - werewolf_belly - name = "Werewolf belly" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_GROIN,BP_TORSO) - species_allowed = list(SPECIES_WEREBEAST) - - werewolf_socks - name = "Werewolf socks" - icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' - icon_state = "werewolf" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) - species_allowed = list(SPECIES_WEREBEAST) - - shadekin_snoot - name = "Shadekin Snoot" - icon_state = "shadekin-snoot" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_SHADEKIN_YW) //YW edits - - taj_nose_alt - name = "Nose Color, alt. (Taj)" - icon_state = "taj_nosealt" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - talons - name = "Talons" - icon_state = "talons" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) - - claws - name = "Claws" - icon_state = "claws" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_HAND,BP_R_HAND) - - equine_snout //Why the long face? Works best with sergal bodytype. - name = "Equine Snout" - icon_state = "donkey" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - equine_nose - name = "Equine Nose" - icon_state = "dnose" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - bee_stripes - name = "bee stripes" - icon_state = "beestripes" - body_parts = list(BP_TORSO,BP_GROIN) - - vas_toes - name = "Bug Paws (Vasilissan)" - icon_state = "vas_toes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT) - - //CitRP stuff - vox_alt - name = "Vox Alternate" - icon_state = "bay_vox" - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) - species_allowed = list(SPECIES_VOX) - - vox_alt_eyes - name = "Alternate Vox Eyes" - icon_state = "bay_vox_eyes" - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_VOX) - - c_beast_body - name = "Cyber Body" - icon_state = "c_beast_body" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN) - - c_beast_plating - name = "Cyber Plating (Use w/ Cyber Body)" - icon_state = "c_beast_plating" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM) - - c_beast_band - name = "Cyber Band (Use w/ Cybertech head)" - icon_state = "c_beast_band" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - c_beast_cheek_a - name = "Cyber Beast Cheeks A (Use A, B and C)" - icon_state = "c_beast_a" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - c_beast_cheek_b - name = "Cyber Beast Cheeks B (Use A, B and C)" - icon_state = "c_beast_b" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - c_beast_cheek_c - name = "Cyber Beast Cheeks C (Use A, B and C)" - icon_state = "c_beast_c" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - teshari_large_eyes - name = "Teshari large eyes" - icon_state = "teshlarge_eyes" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - - teshari_coat - name = "Teshari coat" - icon_state = "tesh_coat" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - - teshari_pattern_male - name = "Teshari male pattern" - icon_state = "tesh-pattern-male" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - - teshari_pattern_female - name = "Teshari female pattern" - icon_state = "tesh-pattern-fem" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) - species_allowed = list(SPECIES_TESHARI) - - voxscales - name = "Vox Scales" - icon_state = "Voxscales" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_HEAD) - - voxclaws - name = "Vox Claws" - icon_state = "Voxclaws" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) - - voxbeak - name = "Vox Beak" - icon_state = "Voxscales" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathihood - name = "Cobra Hood" - icon_state = "unathihood" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathidoublehorns - name = "Double Unathi Horns" - icon_state = "unathidoublehorns" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathihorns - name = "Unathi Horns" - icon_state = "unathihorns" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathiramhorns - name = "Unathi Ram Horns" - icon_state = "unathiramhorns" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathishortspines - name = "Unathi Short Spines" - icon_state = "unathishortspines" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathilongspines - name = "Unathi Long Spines" - icon_state = "unathilongspines" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathishortfrills - name = "Unathi Short Frills" - icon_state = "unathishortfrills" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) - - unathilongfrills - name = "Unathi Long Frills" - icon_state = "unathilongfrills" - color_blend_mode = ICON_MULTIPLY - body_parts = list(BP_HEAD) +/* +//////////////////////////// +/ =--------------------= / +/ == Misc Definitions == / +/ =--------------------= / +//////////////////////////// +*/ + +// Yes, I have to add all of this just to make some glowy hair. +// No, this isn't a character creation option, but... I guess in the future it could be, if anyone wants that? + +/datum/sprite_accessory/hair_accessory + name = "You should not see this..." + icon = 'icons/mob/vore/hair_accessories_vr.dmi' + do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color + + var/ignores_lighting = 0 // Whether or not this hair accessory will ignore lighting and glow in the dark. + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/desc = "You should not see this..." + +/datum/sprite_accessory/hair_accessory/verie_hair_glow + name = "verie's hair glow" + desc = "" + icon_state = "verie_hair_glow" + ignores_lighting = 1 + //ckeys_allowed = list("vitoras") // This probably won't come into play EVER but better safe than sorry diff --git a/code/modules/mob/new_player/sprite_accessories_wing.dm b/code/modules/mob/new_player/sprite_accessories_wing.dm new file mode 100644 index 0000000000..486e81f4b1 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_wing.dm @@ -0,0 +1,152 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Wing Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/wing + name = "You should not see this..." + icon = 'icons/mob/human_races/sprite_accessories/wings.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/extra_overlay // Icon state of an additional overlay to blend in. + var/extra_overlay2 //Tertiary. + var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it. If the clothing is bulky enough to hide a tail, it should also hide wings. + // var/show_species_tail = 1 // Just so // TODO - Seems not needed ~Leshana + var/desc = "You should not see this..." + var/ani_state // State when flapping/animated + var/extra_overlay_w // Flapping state for extra overlay + var/extra_overlay2_w + + species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) + +/datum/sprite_accessory/wing/featheredlarge //Made by Natje! + name = "large feathered wings (colorable)" + desc = "" + icon_state = "feathered2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here. + name = "spider legs" + desc = "" + icon_state = "spider-legs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/moth + name = "moth wings" + desc = "" + icon_state = "moth" + +/datum/sprite_accessory/wing/mothc + name = "moth wings, colorable" + desc = "" + icon_state = "moth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/dragonfly + name = "dragonfly" + desc = "" + icon_state = "dragonfly" + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered_medium + name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys. + desc = "" + icon_state = "feathered3" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/bat_black + name = "bat wings, black" + desc = "" + icon_state = "bat-black" + +/datum/sprite_accessory/wing/bat_color + name = "bat wings, colorable" + desc = "" + icon_state = "bat-color" + do_colouration = 1 + +/datum/sprite_accessory/wing/bat_red + name = "bat wings, red" + desc = "" + icon_state = "bat-red" + +/datum/sprite_accessory/wing/harpywings + name = "harpy wings, colorable" + desc = "" + icon_state = "harpywings" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/beewings + name = "bee wings" + desc = "" + icon_state = "beewings" + +/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings? + name = "gazer eyestalks" + desc = "" + icon_state = "liquidfirefly-eyestalks" + //ckeys_allowed = list("liquidfirefly","seiga") //At request. + +/datum/sprite_accessory/wing/moth_full + name = "moth antenna and wings" + desc = "" + icon_state = "moth_full" + +/datum/sprite_accessory/wing/moth_full_gray + name = "moth antenna and wings, colorable" + desc = "" + icon_state = "moth_full_gray" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/snag + name = "xenomorph backplate" + desc = "" + icon_state = "snag-backplate" + +/datum/sprite_accessory/wing/sepulchre_c_yw + name = "demon wings (colorable)" + desc = "" + icon_state = "sepulchre_wingsc" + do_colouration = 1 + +/datum/sprite_accessory/wing/cyberdragon + name = "Cyber dragon wing (colorable)" + desc = "" + icon_state = "cyberdragon_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/cyberdragon_red + name = "Cyber dragon wing (red)" + desc = "" + icon_state = "cyberdragon_red_s" + do_colouration = 0 + +/datum/sprite_accessory/wing/cyberdoe + name = "Cyber doe wing" + desc = "" + icon_state = "cyberdoe_s" + do_colouration = 0 diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm new file mode 100644 index 0000000000..7cc4dfc081 --- /dev/null +++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm @@ -0,0 +1,227 @@ +/* +//////////////////////////// +/ =--------------------= / +/ == Wing Definitions == / +/ =--------------------= / +//////////////////////////// +*/ +/datum/sprite_accessory/wing + name = "You should not see this..." + icon = 'icons/mob/vore/wings_vr.dmi' + do_colouration = 0 //Set to 1 to enable coloration using the tail color. + species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use + color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + +/datum/sprite_accessory/wing/shock //Unable to split the tail from the wings in the sprite, so let's just classify it as wings. + name = "pharoah hound tail (Shock Diamond)" + desc = "" + icon_state = "shock" + ckeys_allowed = list("icowom") + +/datum/sprite_accessory/wing/featheredlarge //Made by Natje! + name = "large feathered wings (colorable)" + desc = "" + icon_state = "feathered2" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/spider_legs //Not really /WINGS/ but they protrude from the back, kinda. Might as well have them here. + name = "spider legs" + desc = "" + icon_state = "spider-legs" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/moth + name = "moth wings" + desc = "" + icon_state = "moth" + +/datum/sprite_accessory/wing/mothc + name = "moth wings, colorable" + desc = "" + icon_state = "moth" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/dragonfly + name = "dragonfly" + desc = "" + icon_state = "dragonfly" + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/citheroniamoth + name = "citheronia wings" + desc = "" + icon_state = "citheronia_wings" + ckeys_allowed = list("kira72") + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered_medium + name = "medium feathered wings, colorable" // Keekenox made these feathery things with a little bit more shape to them than the other wings. They are medium sized wing boys. + desc = "" + icon_state = "feathered3" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/bat_black + name = "bat wings, black" + desc = "" + icon_state = "bat-black" + +/datum/sprite_accessory/wing/bat_color + name = "bat wings, colorable" + desc = "" + icon_state = "bat-color" + do_colouration = 1 + +/datum/sprite_accessory/wing/bat_red + name = "bat wings, red" + desc = "" + icon_state = "bat-red" + +/datum/sprite_accessory/wing/harpywings + name = "harpy wings, colorable" + desc = "" + icon_state = "harpywings" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/harpywings_alt + name = "harpy wings alt, archeopteryx" + desc = "" + icon_state = "harpywings_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_altmarkings" + +/datum/sprite_accessory/wing/harpywings_alt_neckfur + name = "harpy wings alt, archeopteryx & neckfur" + desc = "" + icon_state = "harpywings_alt" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_altmarkings" + extra_overlay2 = "neckfur" + +/datum/sprite_accessory/wing/harpywings_bat + name = "harpy wings, bat" + desc = "" + icon_state = "harpywings_bat" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_batmarkings" + +/datum/sprite_accessory/wing/harpywings_bat_neckfur + name = "harpy wings, bat & neckfur" + desc = "" + icon_state = "harpywings_bat" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "harpywings_batmarkings" + extra_overlay2 = "neckfur" + +/datum/sprite_accessory/wing/neckfur + name = "neck fur" + desc = "" + icon_state = "neckfur" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/beewings + name = "bee wings" + desc = "" + icon_state = "beewings" + +/datum/sprite_accessory/wing/sepulchre + name = "demon wings (Sepulchre)" + desc = "" + icon_state = "sepulchre_wings" + ckeys_allowed = list("sepulchre") + +/datum/sprite_accessory/wing/miria_fluffdragon + name = "fluffdragon wings (Miria Masters)" + desc = "" + icon_state = "miria-fluffdragontail" + ckeys_allowed = list("miriamasters") + +/datum/sprite_accessory/wing/scree + name = "green taj wings (Scree)" + desc = "" + icon_state = "scree-wings" + ckeys_allowed = list("scree") + +/datum/sprite_accessory/wing/liquidfirefly_gazer //I g-guess this could be considered wings? + name = "gazer eyestalks" + desc = "" + icon_state = "liquidfirefly-eyestalks" + //ckeys_allowed = list("liquidfirefly","seiga") //At request. + +/datum/sprite_accessory/wing/moth_full + name = "moth antenna and wings" + desc = "" + icon_state = "moth_full" + +/datum/sprite_accessory/wing/moth_full_gray + name = "moth antenna and wings, colorable" + desc = "" + icon_state = "moth_full_gray" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/kerena + name = "wingwolf wings (Kerena)" + desc = "" + icon_state = "kerena-wings" + ckeys_allowed = list("somekindofpony") + +/datum/sprite_accessory/wing/snag + name = "xenomorph backplate" + desc = "" + icon_state = "snag-backplate" + +/datum/sprite_accessory/wing/sepulchre_c_yw + name = "demon wings (colorable)" + desc = "" + icon_state = "sepulchre_wingsc" + do_colouration = 1 + +/datum/sprite_accessory/wing/cyberdragon + name = "Cyber dragon wing (colorable)" + desc = "" + icon_state = "cyberdragon_s" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + +/datum/sprite_accessory/wing/cyberdragon_red + name = "Cyber dragon wing (red)" + desc = "" + icon_state = "cyberdragon_red_s" + do_colouration = 0 + +/datum/sprite_accessory/wing/cyberdoe + name = "Cyber doe wing" + desc = "" + icon_state = "cyberdoe_s" + do_colouration = 0 + +/datum/sprite_accessory/wing/drago_wing + name = "Cybernetic Dragon wings" + desc = "" + icon_state = "drago_wing" + do_colouration = 1 + color_blend_mode = ICON_MULTIPLY + extra_overlay = "drago_wing_2" diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 02c939bd19..ce8e1f6f8a 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -82,7 +82,7 @@ return 0 else if(ismob(src)) //VOREStation Edit Start. Are they a mob, and are they currently flying?? - var/mob/H = src + var/mob/living/H = src if(H.flying) if(H.incapacitated(INCAPACITATION_ALL)) to_chat(src, "You can't fly in your current state.") diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index d9b21f6cec..88d5c89b26 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -29,6 +29,7 @@ // Appearance vars. var/nonsolid // Snowflake warning, reee. Used for slime limbs. + var/transparent // As above, so below. Used for transparent limbs. var/icon_name = null // Icon state base. var/body_part = null // Part flag var/icon_position = 0 // Used in mob overlay layering calculations. @@ -1396,4 +1397,8 @@ Note that amputating the affected organ does in fact remove the infection from t for(var/obj/item/organ/external/L in organs) for(var/obj/item/I in L.implants) if(!istype(I,/obj/item/weapon/implant) && !istype(I,/obj/item/device/nif)) //VOREStation Add - NIFs - return 1 \ No newline at end of file + return 1 + +/obj/item/organ/external/proc/is_hidden_by_tail() + if(owner && owner.tail_style && owner.tail_style.hide_body_parts && (organ_tag in owner.tail_style.hide_body_parts)) + return 1 diff --git a/code/modules/organs/organ_external_vr.dm b/code/modules/organs/organ_external_vr.dm index 1742259864..0e3fb07d9e 100644 --- a/code/modules/organs/organ_external_vr.dm +++ b/code/modules/organs/organ_external_vr.dm @@ -1,6 +1,3 @@ -/obj/item/organ/external - var/transparent = 0 //For better slime limbs - //Sideways override for nanoform limbs (ugh) /obj/item/organ/external/robotize(var/company, var/skip_prosthetics = FALSE, var/keep_organs = FALSE) var/original_robotic = robotic @@ -16,7 +13,3 @@ min_broken_damage = o_min_broken_damage else return ..() - -/obj/item/organ/external/proc/is_hidden_by_tail() - if(owner && owner.tail_style && owner.tail_style.hide_body_parts && (organ_tag in owner.tail_style.hide_body_parts)) - return 1 \ No newline at end of file diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 86e71c4fc2..6239577b8d 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -122,7 +122,7 @@ var/global/list/limb_icon_cache = list() if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed)) var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_MULTIPLY) // VOREStation edit + facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), facial_hair_style.color_blend_mode) res.add_overlay(facial_s) //Head hair diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 4ccb1fe6c0..17c77c9863 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -455,6 +455,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ company = "Zeng-Hu" desc = "This limb has a rubbery fleshtone covering with visible seams." icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_main.dmi' + species_alternates = list(SPECIES_TAJ = "Zeng-Hu - Tajaran") unavailable_to_build = 1 skin_tone = 1 modular_bodyparts = MODULAR_BODYPART_PROSTHETIC //VOREStation Edit - remove the restrictions diff --git a/code/modules/organs/robolimbs_custom.dm b/code/modules/organs/robolimbs_custom.dm new file mode 100644 index 0000000000..15df0c98c8 --- /dev/null +++ b/code/modules/organs/robolimbs_custom.dm @@ -0,0 +1,175 @@ +/datum/robolimb + var/includes_tail //Cyberlimbs dmi includes a tail sprite to wear. + var/includes_wing //Cyberlimbs dmi includes a wing sprite to wear. + var/list/whitelisted_to //List of ckeys that are allowed to pick this in charsetup. + +//////////////// For-specific-character fluff ones ///////////////// May be viable to place these into a custom_item subfolder, in order to allow CI Repo integration. + +// verkister : Rahwoof Boop +/datum/robolimb/eggnerdltd + company = "Eggnerd Prototyping Ltd." + desc = "This limb has a slight salvaged handicraft vibe to it. The CE-marking on it is definitely not the standardized one, it looks more like a hand-written sharpie monogram." + icon = 'icons/mob/human_races/cyberlimbs/_fluff_vr/rahboop.dmi' + blood_color = "#5e280d" + includes_tail = 1 + unavailable_to_build = 1 + +/obj/item/weapon/disk/limb/eggnerdltd + company = "Eggnerd Prototyping Ltd." +// icon = 'icons/obj/items_vr.dmi' +// icon_state = "verkdisk" + +//////////////// General VS-only ones ///////////////// +/datum/robolimb/talon //They're buildable by default due to being extremely basic. + company = "Talon LLC" + desc = "This metallic limb is sleek and featuresless apart from some exposed motors" + icon = 'icons/mob/human_races/cyberlimbs/talon/talon_main.dmi' //Sprited by: Viveret + +/obj/item/weapon/disk/limb/talon + company = "Talon LLC" + +/datum/robolimb/zenghu_taj //This wasn't indented. At all. It's a miracle this didn't break literally everything. + company = "Zeng-Hu - Tajaran" + desc = "This limb has a rubbery fleshtone covering with visible seams." + icon = 'icons/mob/human_races/cyberlimbs/zenghu/zenghu_taj.dmi' + unavailable_to_build = 1 + parts = list(BP_HEAD) + +/datum/robolimb/eggnerdltdred + company = "Eggnerd Prototyping Ltd. (Red)" + desc = "A slightly more refined limb variant from Eggnerd Prototyping. Its got red plating instead of orange." + icon = 'icons/mob/human_races/cyberlimbs/rahboopred/rahboopred.dmi' + blood_color = "#5e280d" + includes_tail = 1 + unavailable_to_build = 1 + +/obj/item/weapon/disk/limb/eggnerdltdred + company = "Eggnerd Prototyping Ltd. (Red)" +// icon = 'icons/obj/items_vr.dmi' +// icon_state = "verkdisk" + + +//Darkside Incorperated synthetic augmentation list! Many current most used fuzzy and notsofuzzy races made into synths here. + +/datum/robolimb/dsi_tajaran + company = "DSI - Tajaran" + desc = "This limb feels soft and fluffy, realistic design and squish. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSITajaran/dsi_tajaran.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Tajara" + +/datum/robolimb/dsi_tajaran/New() + species_cannot_use = GLOB.all_species.Copy() +// species_cannot_use -= SPECIES_TAJ + +/obj/item/weapon/disk/limb/dsi_tajaran + company = "DSI - Tajaran" + +/datum/robolimb/dsi_lizard + company = "DSI - Lizard" + desc = "This limb feels smooth and scalie, realistic design and squish. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSILizard/dsi_lizard.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Unathi" + +/datum/robolimb/dsi_lizard/New() + species_cannot_use = GLOB.all_species.Copy() +// species_cannot_use -= SPECIES_UNATHI + +/obj/item/weapon/disk/limb/dsi_lizard + company = "DSI - Lizard" +/* +/datum/robolimb/dsi_sergal + company = "DSI - Sergal" + desc = "This limb feels soft and fluffy, realistic design and toned muscle. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSISergal/dsi_sergal.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Sergal" + +/obj/item/weapon/disk/limb/dsi_sergal + company = "DSI - Sergal" + +/datum/robolimb/dsi_nevrean + company = "DSI - Nevrean" + desc = "This limb feels soft and feathery, lightweight, realistic design and squish. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSINevrean/dsi_nevrean.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Nevrean" + +/obj/item/weapon/disk/limb/dsi_nevrean + company = "DSI - Nevrean" + +/datum/robolimb/dsi_vulpkanin + company = "DSI - Vulpkanin" + desc = "This limb feels soft and fluffy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSIVulpkanin/dsi_vulpkanin.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Vulpkanin" + +/obj/item/weapon/disk/limb/dsi_vulpkanin + company = "DSI - Vulpkanin" + +/datum/robolimb/dsi_akula + company = "DSI - Akula" + desc = "This limb feels soft and fleshy, realistic design and squish. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSIAkula/dsi_akula.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Akula" + +/obj/item/weapon/disk/limb/dsi_akula + company = "DSI - Akula" + +/datum/robolimb/dsi_spider + company = "DSI - Vasilissan" + desc = "This limb feels hard and chitinous, realistic design. Seems a little mischievous. By Darkside Incorperated." + icon = 'icons/mob/human_races/cyberlimbs/DSISpider/dsi_spider.dmi' + blood_color = "#ffe2ff" + lifelike = 1 + unavailable_to_build = 1 + includes_tail = 1 + skin_tone = 1 + suggested_species = "Vasilissan" + +/obj/item/weapon/disk/limb/dsi_spider + company = "DSI - Vasilissan" +*/ +/datum/robolimb/dsi_teshari + company = "DSI - Teshari" + desc = "This limb has a thin synthflesh casing with a few connection ports." + icon = 'icons/mob/human_races/cyberlimbs/DSITeshari/dsi_teshari.dmi' + lifelike = 1 + skin_tone = 1 + suggested_species = "Teshari" + +/datum/robolimb/dsi_teshari/New() + species_cannot_use = GLOB.all_species.Copy() +// species_cannot_use -= SPECIES_TESHARI +// species_cannot_use -= SPECIES_CUSTOM + ..() + +/obj/item/weapon/disk/limb/dsi_teshari + company = "DSI - Teshari" diff --git a/code/modules/organs/robolimbs_vr.dm b/code/modules/organs/robolimbs_vr.dm index 2ed4d60fcd..b93a37fd5a 100644 --- a/code/modules/organs/robolimbs_vr.dm +++ b/code/modules/organs/robolimbs_vr.dm @@ -1,8 +1,3 @@ -/datum/robolimb - var/includes_tail //Cyberlimbs dmi includes a tail sprite to wear. - var/includes_wing //Cyberlimbs dmi includes a wing sprite to wear. - var/list/whitelisted_to //List of ckeys that are allowed to pick this in charsetup. - //CitRP Port var/const/cyberbeast_monitor_styles = "blank=cyber_blank;\ default=cyber_default;\ diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index 1c4fb5ee27..79eb04f255 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -266,6 +266,8 @@ encased = "skull" base_miss_chance = 40 var/can_intake_reagents = 1 + var/eye_icons = 'icons/mob/human_face_alt.dmi' + var/head_offset = 0 var/eye_icon = "eyes_s" force = 3 throwforce = 7 @@ -324,6 +326,54 @@ "You make \the [I] kiss \the [src]!.") return ..() +/obj/item/organ/external/head/get_icon() + ..() + overlays.Cut() + if(!owner || !owner.species) + return + + for(var/M in markings) + var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] + var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") + mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) + overlays |= mark_s //So when it's not on your body, it has icons + mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons + icon_cache_key += "[M][markings[M]["color"]]" + + if(owner.should_have_organ(O_EYES))//Moved on top of markings. + var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] + if(eye_icon) + var/icon/eyes_icon = new/icon(eye_icons, eye_icon) + if(eyes) + if(owner.species.appearance_flags & HAS_EYE_COLOR) + eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) + else + eyes_icon.Blend(rgb(128,0,0), ICON_ADD) + mob_icon.Blend(eyes_icon, ICON_OVERLAY) + overlays |= eyes_icon + + if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) + var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") + overlays |= lip_icon + mob_icon.Blend(lip_icon, ICON_OVERLAY) + + if(owner.f_style) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] + if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed)) + var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + if(facial_hair_style.do_colouration) + facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) + overlays |= image(facial_s, "pixel_y" = head_offset) + + if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))) + var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] + if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed)) + var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") + if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) + hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY) + overlays |= image(hair_s, "pixel_y" = head_offset) + return mob_icon + /obj/item/organ/external/head/skrell eye_icon = "skrell_eyes_s" diff --git a/code/modules/organs/subtypes/standard_vr.dm b/code/modules/organs/subtypes/standard_vr.dm index bf429cb878..754f7d4bf8 100644 --- a/code/modules/organs/subtypes/standard_vr.dm +++ b/code/modules/organs/subtypes/standard_vr.dm @@ -1,58 +1,8 @@ //For custom heads with custom parts since the base code is restricted to a single icon file. -/obj/item/organ/external/head/vr/get_icon() - - ..() - overlays.Cut() - if(!owner || !owner.species) - return - - for(var/M in markings) - var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] - var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") - mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) - overlays |= mark_s //So when it's not on your body, it has icons - mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons - icon_cache_key += "[M][markings[M]["color"]]" - - if(owner.should_have_organ(O_EYES))//Moved on top of markings. - var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] - if(eye_icon) - var/icon/eyes_icon = new/icon(eye_icons_vr, eye_icon_vr) - if(eyes) - if(owner.species.appearance_flags & HAS_EYE_COLOR) - eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) - else - eyes_icon.Blend(rgb(128,0,0), ICON_ADD) - mob_icon.Blend(eyes_icon, ICON_OVERLAY) - overlays |= eyes_icon - - if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) - var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") - overlays |= lip_icon - mob_icon.Blend(lip_icon, ICON_OVERLAY) - - if(owner.f_style) - var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] - if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed)) - var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") - if(facial_hair_style.do_colouration) - facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) - overlays |= image(facial_s, "pixel_y" = head_offset) - - if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))) - var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] - if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed)) - var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") - if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) - hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_MULTIPLY) - overlays |= image(hair_s, "pixel_y" = head_offset) - return mob_icon - /obj/item/organ/external/head/vr var/eye_icons_vr = 'icons/mob/human_face_vr.dmi' var/eye_icon_vr = "blank_eyes" - var/head_offset = 0 eye_icon = "blank_eyes" /obj/item/organ/external/head/vr/sergal diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index d64c6afd0c..a7513d0773 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -16,6 +16,18 @@ reagent_state = SOLID color = "#e9e6e4" +//VOREStation Edit +/datum/reagent/calcium/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + if(ishuman(M) && rand(1,10000) == 1) + var/mob/living/carbon/human/H = M + for(var/obj/item/organ/external/O in H.bad_external_organs) + if(O.status & ORGAN_BROKEN) + O.mend_fracture() + H.custom_pain("You feel the agonizing power of calcium mending your bones!",60) + H.AdjustWeakened(1) + break // Only mend one bone, whichever comes first in the list +//VOREStation Edit End + /datum/reagent/carbon name = "Carbon" id = "carbon" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index fb6eb6b0cc..f2dbac9f69 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -1140,6 +1140,16 @@ return M.heal_organ_damage(0.5 * removed, 0) holder.remove_reagent("capsaicin", 10 * removed) + //VOREStation Edit + if(ishuman(M) && rand(1,10000) == 1) + var/mob/living/carbon/human/H = M + for(var/obj/item/organ/external/O in H.bad_external_organs) + if(O.status & ORGAN_BROKEN) + O.mend_fracture() + H.custom_pain("You feel the agonizing power of calcium mending your bones!",60) + H.AdjustWeakened(1) + break // Only mend one bone, whichever comes first in the list + //VOREStation Edit End /datum/reagent/drink/milk/cream name = "Cream" diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm index 6f8c1e0c9d..8e4578fd25 100644 --- a/code/modules/resleeving/designer.dm +++ b/code/modules/resleeving/designer.dm @@ -385,9 +385,6 @@ ASSERT(istype(B)) var/datum/category_item/player_setup_item/general/basic/G = CG.items_by_name["Basic"] ASSERT(istype(G)) - CG = CC.categories_by_name["VORE"] - var/datum/category_item/player_setup_item/vore/ears/E = CG.items_by_name["Appearance"] - ASSERT(istype(E)) if(params["target_href"] == "bio_gender") var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", active_br.bodygender) as null|anything in G.get_genders() @@ -408,12 +405,6 @@ active_br.mydna.dna.ResetUIFrom(mannequin) update_preview_icon() return 1 - action = E.OnTopic(list2params(href_list), href_list, user) - if(action & TOPIC_UPDATE_PREVIEW && mannequin && active_br) - E.copy_to_mob(mannequin) - active_br.mydna.dna.ResetUIFrom(mannequin) - update_preview_icon() - return 1 // Fake subtype of preferences we can use to steal code from player_setup /datum/preferences/designer/New() diff --git a/code/modules/vore/appearance/preferences_vr.dm b/code/modules/vore/appearance/preferences_vr.dm index 5897cb2a48..01caeda13d 100644 --- a/code/modules/vore/appearance/preferences_vr.dm +++ b/code/modules/vore/appearance/preferences_vr.dm @@ -20,36 +20,3 @@ var/r_acc3 = 30 var/g_acc3 = 30 var/b_acc3 = 30 - var/datum/sprite_accessory/ears/ear_style = null - var/r_ears = 30 - var/g_ears = 30 - var/b_ears = 30 - var/r_ears2 = 30 - var/g_ears2 = 30 - var/b_ears2 = 30 - var/r_ears3 = 30 //Trust me, we could always use more colour. No japes. - var/g_ears3 = 30 - var/b_ears3 = 30 - var/datum/sprite_accessory/tail/tail_style = null - var/r_tail = 30 - var/g_tail = 30 - var/b_tail = 30 - var/r_tail2 = 30 - var/g_tail2 = 30 - var/b_tail2 = 30 - var/r_tail3 = 30 - var/g_tail3 = 30 - var/b_tail3 = 30 - var/datum/sprite_accessory/wing/wing_style = null - var/r_wing = 30 - var/g_wing = 30 - var/b_wing = 30 - var/r_wing2 = 30 - var/g_wing2 = 30 - var/b_wing2 = 30 - var/r_wing3 = 30 - var/g_wing3 = 30 - var/b_wing3 = 30 - - // Custom Species Name - var/custom_species diff --git a/code/modules/vore/appearance/update_icons_vr.dm b/code/modules/vore/appearance/update_icons_vr.dm index 9185db35f3..15ebcc7c9f 100644 --- a/code/modules/vore/appearance/update_icons_vr.dm +++ b/code/modules/vore/appearance/update_icons_vr.dm @@ -1,25 +1,3 @@ -var/global/list/wing_icon_cache = list() - -/mob/living/carbon/human/proc/get_ears_overlay() - if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) - var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state) - if(ear_style.do_colouration) - ears_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), ear_style.color_blend_mode) - - if(ear_style.extra_overlay) - var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay) - overlay.Blend(rgb(src.r_ears2, src.g_ears2, src.b_ears2), ear_style.color_blend_mode) - ears_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(ear_style.extra_overlay2) //MORE COLOURS IS BETTERER - var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay2) - overlay.Blend(rgb(src.r_ears3, src.g_ears3, src.b_ears3), ear_style.color_blend_mode) - ears_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - return ears_s - return null - /mob/living/carbon/human/proc/get_hair_accessory_overlay() if(hair_accessory_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) var/icon/hair_acc_s = icon(hair_accessory_style.icon, hair_accessory_style.icon_state) @@ -27,99 +5,3 @@ var/global/list/wing_icon_cache = list() hair_acc_s.Blend(rgb(src.r_ears, src.g_ears, src.b_ears), hair_accessory_style.color_blend_mode) return hair_acc_s return null - - -/mob/living/carbon/human/proc/get_tail_image() - //If you are FBP with tail style and didn't set a custom one - var/datum/robolimb/model = isSynthetic() - if(istype(model) && model.includes_tail && !tail_style) - var/icon/tail_s = new/icon("icon" = synthetic.icon, "icon_state" = "tail") - tail_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) - return image(tail_s) - - //If you have a custom tail selected - if(tail_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL && !isTaurTail(tail_style))) - var/icon/tail_s = new/icon("icon" = tail_style.icon, "icon_state" = wagging && tail_style.ani_state ? tail_style.ani_state : tail_style.icon_state) - if(tail_style.do_colouration) - tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode) - if(tail_style.extra_overlay) - var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay) - if(wagging && tail_style.ani_state) - overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w) - overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - else - overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(tail_style.extra_overlay2) - var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2) - if(wagging && tail_style.ani_state) - overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2_w) - overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - else - overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(isTaurTail(tail_style)) - var/datum/sprite_accessory/tail/taur/taurtype = tail_style - if(taurtype.can_ride && !riding_datum) - riding_datum = new /datum/riding/taur(src) - verbs |= /mob/living/carbon/human/proc/taur_mount - verbs |= /mob/living/proc/toggle_rider_reins - return image(tail_s, "pixel_x" = -16) - else - return image(tail_s) - return null - -/mob/living/carbon/human/proc/get_wing_image() - if(QDESTROYING(src)) - return - - //If you are FBP with wing style and didn't set a custom one - if((synthetic && synthetic.includes_wing && !wing_style) && !wings_hidden) - var/icon/wing_s = new/icon("icon" = synthetic.icon, "icon_state" = "wing") //I dunno. If synths have some custom wing? - wing_s.Blend(rgb(src.r_skin, src.g_skin, src.b_skin), species.color_mult ? ICON_MULTIPLY : ICON_ADD) - return image(wing_s) - - //If you have custom wings selected - if((wing_style && !(wear_suit && wear_suit.flags_inv & HIDETAIL)) && !wings_hidden) - var/icon/wing_s = new/icon("icon" = wing_style.icon, "icon_state" = flapping && wing_style.ani_state ? wing_style.ani_state : wing_style.icon_state) - if(wing_style.do_colouration) - wing_s.Blend(rgb(src.r_wing, src.g_wing, src.b_wing), wing_style.color_blend_mode) - if(wing_style.extra_overlay) - var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay) - overlay.Blend(rgb(src.r_wing2, src.g_wing2, src.b_wing2), wing_style.color_blend_mode) - wing_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - if(wing_style.extra_overlay2) - var/icon/overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2) - if(wing_style.ani_state) - overlay = new/icon("icon" = wing_style.icon, "icon_state" = wing_style.extra_overlay2_w) - overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) - wing_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - else - overlay.Blend(rgb(src.r_wing3, src.g_wing3, src.b_wing3), wing_style.color_blend_mode) - wing_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) - - return image(wing_s) - - -// TODO - Move this to where it should go ~Leshana -/mob/proc/stop_flying() - if(QDESTROYING(src)) - return - flying = FALSE - return 1 - -/mob/living/carbon/human/stop_flying() - if((. = ..())) - update_wing_showing() \ No newline at end of file diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 6448ca90d1..7f7f33e0e4 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -18,7 +18,6 @@ var/vore_verb = "ingest" // Verb for eating with this in messages var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else - var/emote_time = 60 SECONDS // How long between stomach emotes at prey var/nutrition_percent = 100 // Nutritional percentage per tick in digestion mode var/digest_brute = 0.5 // Brute damage per tick in digestion mode var/digest_burn = 0.5 // Burn damage per tick in digestion mode @@ -41,6 +40,10 @@ var/obj/item/weapon/storage/vore_egg/ownegg // Is this belly creating an egg? var/egg_type = "Egg" // Default egg type and path. var/egg_path = /obj/item/weapon/storage/vore_egg + var/list/emote_lists = list() // Idle emotes that happen on their own, depending on the bellymode. Contains lists of strings indexed by bellymode + var/emote_time = 60 // How long between stomach emotes at prey (in seconds) + var/emote_active = TRUE // Are we even giving emotes out at all or not? + var/next_emote = 0 // When we're supposed to print our next emote, as a world.time //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. //Actual full digest modes @@ -56,7 +59,6 @@ var/tmp/mob/living/owner // The mob whose belly this is. var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human) var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again. - var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a world.time var/tmp/recent_sound = FALSE // Prevent audio spam // Don't forget to watch your commas at the end of each line if you change these. @@ -113,11 +115,6 @@ var/contamination_flavor = "Generic" // Determines descriptions of contaminated items var/contamination_color = "green" // Color of contamination overlay - //Mostly for being overridden on precreated bellies on mobs. Could be VV'd into - //a carbon's belly if someone really wanted. No UI for carbons to adjust this. - //List has indexes that are the digestion mode strings, and keys that are lists of strings. - var/tmp/list/emote_lists = list() - // Lets you do a fullscreen overlay. Set to an icon_state string. var/belly_fullscreen = "" var/disable_hud = FALSE @@ -152,6 +149,8 @@ "digest_messages_prey", "examine_messages", "emote_lists", + "emote_time", + "emote_active", "mode_flags", "item_digest_mode", "contaminates", @@ -784,6 +783,8 @@ dupe.belly_fullscreen = belly_fullscreen dupe.disable_hud = disable_hud dupe.egg_type = egg_type + dupe.emote_time = emote_time + dupe.emote_active = emote_active //// Object-holding variables //struggle_messages_outside - strings diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index fde1947431..428871edf9 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -55,8 +55,8 @@ ///////////////////// Early Non-Mode Handling ///////////////////// var/list/EL = emote_lists[digest_mode] - if(LAZYLEN(EL) && touchable_mobs && next_emote <= world.time) - next_emote = world.time + emote_time + if(LAZYLEN(EL) && touchable_mobs && next_emote <= world.time && emote_active) + next_emote = world.time + (emote_time SECONDS) for(var/mob/living/M in contents) if(digest_mode == DM_DIGEST && !M.digestable) continue // don't give digesty messages to indigestible people diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index e837e08cc4..0c8123b003 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -24,7 +24,6 @@ var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr. var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time. var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon. - var/tail_alt = 0 // Tail layer toggle. var/permit_healbelly = TRUE var/can_be_drop_prey = FALSE var/can_be_drop_pred = TRUE // Mobs are pred by default. diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 2a09884e6b..2d5e4d36e9 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -156,6 +156,8 @@ "digest_burn" = selected.digest_burn, "bulge_size" = selected.bulge_size, "shrink_grow_size" = selected.shrink_grow_size, + "emote_time" = selected.emote_time, + "emote_active" = selected.emote_active, "belly_fullscreen" = selected.belly_fullscreen, "possible_fullscreens" = icon_states('icons/mob/screen_full_vore.dmi'), ) @@ -834,6 +836,16 @@ var/new_new_damage = CLAMP(new_damage, 0, 6) host.vore_selected.digest_brute = new_new_damage . = TRUE + if("b_emoteactive") + host.vore_selected.emote_active = !host.vore_selected.emote_active + . = TRUE + if("b_emotetime") + var/new_time = input(user, "Choose the period it takes for idle belly emotes to be shown to prey. Measured in seconds, Minimum 1 minute, Maximum 10 minutes.", "Set Belly Emote Delay.", host.vore_selected.digest_brute) + if(new_time == null) + return FALSE + var/new_new_time = CLAMP(new_time, 60, 600) + host.vore_selected.emote_time = new_new_time + . = TRUE if("b_escapable") if(host.vore_selected.escapable == 0) //Possibly escapable and special interactions. host.vore_selected.escapable = 1 diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 86543ca635..1d3f326137 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -991,23 +991,6 @@ /obj/item/weapon/material/twohanded/fluff/New(var/newloc) ..(newloc," ") //See materials_vr_dmi for more information as to why this is a blank space. -//General use. -/obj/item/weapon/material/twohanded/fluff/riding_crop - name = "riding crop" - desc = "A steel rod, a little over a foot long with a widened grip and a thick, leather patch at the end. Made to smack naughty submissives." - //force_wielded = 0.05 //Stings, but does jack shit for damage, provided you don't hit someone 100 times. 1 damage with hardness of 60. - force_divisor = 0.05 //Required in order for the X attacks Y message to pop up. - unwielded_force_divisor = 1 // One here, too. - applies_material_colour = 0 - unbreakable = 1 - base_icon = "riding_crop" - icon_state = "riding_crop0" - attack_verb = list("cropped","spanked","swatted","smacked","peppered") -//1R1S: Malady Blanche -/obj/item/weapon/material/twohanded/fluff/riding_crop/malady - name = "Malady's riding crop" - desc = "An infernum made riding crop with Malady Blanche engraved in the shaft. It's a little worn from how many butts it has spanked." - //jacknoir413:Areax Third /obj/item/weapon/melee/baton/fluff/stunstaff name = "Electrostaff" diff --git a/icons/effects/species_tails.dmi b/icons/effects/species_tails.dmi new file mode 100644 index 0000000000..5fea0671c6 Binary files /dev/null and b/icons/effects/species_tails.dmi differ diff --git a/icons/mob/human_races/markings_alt.dmi b/icons/mob/human_races/markings_alt.dmi new file mode 100644 index 0000000000..e9fcad5e63 Binary files /dev/null and b/icons/mob/human_races/markings_alt.dmi differ diff --git a/icons/mob/human_races/sprite_accessories/ears.dmi b/icons/mob/human_races/sprite_accessories/ears.dmi new file mode 100644 index 0000000000..243b901e8e Binary files /dev/null and b/icons/mob/human_races/sprite_accessories/ears.dmi differ diff --git a/icons/mob/human_races/sprite_accessories/tails.dmi b/icons/mob/human_races/sprite_accessories/tails.dmi new file mode 100644 index 0000000000..5e4a27597f Binary files /dev/null and b/icons/mob/human_races/sprite_accessories/tails.dmi differ diff --git a/icons/mob/human_races/sprite_accessories/taurs.dmi b/icons/mob/human_races/sprite_accessories/taurs.dmi new file mode 100644 index 0000000000..69d0a91388 Binary files /dev/null and b/icons/mob/human_races/sprite_accessories/taurs.dmi differ diff --git a/icons/mob/human_races/sprite_accessories/wings.dmi b/icons/mob/human_races/sprite_accessories/wings.dmi new file mode 100644 index 0000000000..2042d667f2 Binary files /dev/null and b/icons/mob/human_races/sprite_accessories/wings.dmi differ diff --git a/icons/mob/items/lefthand_material.dmi b/icons/mob/items/lefthand_material.dmi index a2f035cd58..7fbcc1131f 100644 Binary files a/icons/mob/items/lefthand_material.dmi and b/icons/mob/items/lefthand_material.dmi differ diff --git a/icons/mob/items/righthand_material.dmi b/icons/mob/items/righthand_material.dmi index 6895183a5b..ac51aa86f1 100644 Binary files a/icons/mob/items/righthand_material.dmi and b/icons/mob/items/righthand_material.dmi differ diff --git a/icons/mob/limb_mask.dmi b/icons/mob/limb_mask.dmi index ba4d0e3456..4d83672aa4 100644 Binary files a/icons/mob/limb_mask.dmi and b/icons/mob/limb_mask.dmi differ diff --git a/icons/mob/mecha.dmi b/icons/mob/mecha.dmi index a6d3b13773..975e46371d 100644 Binary files a/icons/mob/mecha.dmi and b/icons/mob/mecha.dmi differ diff --git a/icons/mob/suit_vr.dmi b/icons/mob/suit_vr.dmi index 79a9d12b76..e3d9079bbf 100644 Binary files a/icons/mob/suit_vr.dmi and b/icons/mob/suit_vr.dmi differ diff --git a/icons/mob/taursuits_cow.dmi b/icons/mob/taursuits_cow.dmi new file mode 100644 index 0000000000..ce592d5edb Binary files /dev/null and b/icons/mob/taursuits_cow.dmi differ diff --git a/icons/mob/taursuits_deer.dmi b/icons/mob/taursuits_deer.dmi new file mode 100644 index 0000000000..6c53a6f4d0 Binary files /dev/null and b/icons/mob/taursuits_deer.dmi differ diff --git a/icons/mob/taursuits_drake.dmi b/icons/mob/taursuits_drake.dmi new file mode 100644 index 0000000000..ca0db57532 Binary files /dev/null and b/icons/mob/taursuits_drake.dmi differ diff --git a/icons/mob/taursuits_feline.dmi b/icons/mob/taursuits_feline.dmi new file mode 100644 index 0000000000..1d4c597e02 Binary files /dev/null and b/icons/mob/taursuits_feline.dmi differ diff --git a/icons/mob/taursuits_horse.dmi b/icons/mob/taursuits_horse.dmi new file mode 100644 index 0000000000..4162463c69 Binary files /dev/null and b/icons/mob/taursuits_horse.dmi differ diff --git a/icons/mob/taursuits_lizard.dmi b/icons/mob/taursuits_lizard.dmi new file mode 100644 index 0000000000..a6b9858f17 Binary files /dev/null and b/icons/mob/taursuits_lizard.dmi differ diff --git a/icons/mob/taursuits_naga.dmi b/icons/mob/taursuits_naga.dmi new file mode 100644 index 0000000000..7df326318c Binary files /dev/null and b/icons/mob/taursuits_naga.dmi differ diff --git a/icons/mob/taursuits_otie.dmi b/icons/mob/taursuits_otie.dmi new file mode 100644 index 0000000000..06e083854e Binary files /dev/null and b/icons/mob/taursuits_otie.dmi differ diff --git a/icons/mob/taursuits_slug.dmi b/icons/mob/taursuits_slug.dmi new file mode 100644 index 0000000000..98692375f3 Binary files /dev/null and b/icons/mob/taursuits_slug.dmi differ diff --git a/icons/mob/taursuits_spider.dmi b/icons/mob/taursuits_spider.dmi new file mode 100644 index 0000000000..b8090eceaa Binary files /dev/null and b/icons/mob/taursuits_spider.dmi differ diff --git a/icons/mob/taursuits_wolf.dmi b/icons/mob/taursuits_wolf.dmi new file mode 100644 index 0000000000..0f638ea6d3 Binary files /dev/null and b/icons/mob/taursuits_wolf.dmi differ diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi index a00d6bb489..87f0b32cc2 100644 Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ diff --git a/icons/obj/clothing/suits_vr.dmi b/icons/obj/clothing/suits_vr.dmi index 97a2d4e58a..738f0a8d5b 100644 Binary files a/icons/obj/clothing/suits_vr.dmi and b/icons/obj/clothing/suits_vr.dmi differ diff --git a/maps/expedition_vr/aerostat/_aerostat.dm b/maps/expedition_vr/aerostat/_aerostat.dm index cca08c6930..e5c53b5140 100644 --- a/maps/expedition_vr/aerostat/_aerostat.dm +++ b/maps/expedition_vr/aerostat/_aerostat.dm @@ -134,7 +134,7 @@ VIRGO2_TURF_CREATE(/turf/simulated/mineral) if(mineral) return - var/mineral_name = pickweight(list("marble" = 5, "uranium" = 5, "platinum" = 5, "hematite" = 5, "carbon" = 5, "diamond" = 5, "gold" = 5, "silver" = 5, "lead" = 5, "verdantium" = 5, "rutile" = 20)) + var/mineral_name = pickweight(list("marble" = 5, "uranium" = 5, "platinum" = 5, "hematite" = 5, "carbon" = 5, "diamond" = 5, "gold" = 5, "silver" = 5, "lead" = 5, "verdantium" = 5, "rutile" = 10, "copper" = 5, "tin" = 5, "bauxite" = 5)) if(mineral_name && (mineral_name in ore_data)) mineral = ore_data[mineral_name] diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm index a5f89e44a4..20edb75efd 100644 --- a/maps/tether/tether-06-station2.dmm +++ b/maps/tether/tether-06-station2.dmm @@ -7054,7 +7054,8 @@ /obj/machinery/door/firedoor/glass, /obj/machinery/door/airlock/science{ name = "Pathfinder"; - req_access = list(62,43,67) + req_access = list(62,43,67); + req_one_access = newlist() }, /obj/structure/disposalpipe/segment, /obj/structure/cable/green{ diff --git a/maps/tether/tether_turfs.dm b/maps/tether/tether_turfs.dm index 0b99a2a8d7..a0b7b960dd 100644 --- a/maps/tether/tether_turfs.dm +++ b/maps/tether/tether_turfs.dm @@ -69,6 +69,10 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) "uranium" = 10, "platinum" = 10, "hematite" = 20, + "copper" = 8, + "tin" = 4, + "bauxite" = 4, + "rutile" = 4, "carbon" = 20, "diamond" = 1, "gold" = 8, @@ -82,6 +86,10 @@ VIRGO3B_TURF_CREATE(/turf/simulated/mineral/floor) "uranium" = 5, "platinum" = 5, "hematite" = 35, + "copper" = 15, + "tin" = 10, + "bauxite" = 10, + "rutile" = 10, "carbon" = 35, "gold" = 3, "silver" = 3, diff --git a/tgui/packages/tgui/interfaces/VorePanel.js b/tgui/packages/tgui/interfaces/VorePanel.js index 05a0f3f69e..60cd967d75 100644 --- a/tgui/packages/tgui/interfaces/VorePanel.js +++ b/tgui/packages/tgui/interfaces/VorePanel.js @@ -167,6 +167,8 @@ const VoreSelectedBelly = (props, context) => { digest_burn, bulge_size, shrink_grow_size, + emote_time, + emote_active, addons, contaminates, contaminate_flavor, @@ -394,6 +396,18 @@ const VoreSelectedBelly = (props, context) => { onClick={() => act("set_attribute", { attribute: "b_grow_shrink" })} content={shrink_grow_size * 100 + "%"} /> + +