From a2f346df0f549a5cea4293f8a5ebc1c1cbd3c57a Mon Sep 17 00:00:00 2001 From: killer653 Date: Thu, 10 Aug 2017 07:12:22 -0400 Subject: [PATCH] Makes wings their own seperate entity on char setup --- code/_helpers/global_lists_vr.dm | 7 + code/game/dna/dna2.dm | 16 +- code/game/dna/dna2_helpers.dm | 7 + .../client/preference_setup/vore/01_ears.dm | 60 +++++++ .../mob/living/carbon/human/emote_vr.dm | 20 +++ .../living/carbon/human/human_defines_vr.dm | 1 + .../human/species/species_getters_vr.dm | 7 + .../living/carbon/human/species/species_vr.dm | 8 +- .../human/species/station/station_vr.dm | 5 - .../mob/living/carbon/human/update_icons.dm | 5 +- .../living/carbon/human/update_icons_vr.dm | 65 ++++++++ code/modules/organs/robolimbs_vr.dm | 1 + code/modules/resleeving/designer.dm | 8 + .../modules/vore/appearance/preferences_vr.dm | 4 + .../vore/appearance/sprite_accessories_vr.dm | 150 ++++++++++-------- .../vore/appearance/update_icons_vr.dm | 2 +- code/modules/vore/eating/bellymodes_vr.dm | 4 + icons/mob/vore/taurs_vr.dmi | Bin 42989 -> 44347 bytes icons/mob/vore/wings_vr.dmi | Bin 0 -> 12214 bytes vorestation.dme | 2 + 20 files changed, 299 insertions(+), 73 deletions(-) create mode 100644 code/modules/mob/living/carbon/human/species/species_getters_vr.dm create mode 100644 code/modules/mob/living/carbon/human/update_icons_vr.dm create mode 100644 icons/mob/vore/wings_vr.dmi diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 4680bf9254..225c32aa48 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -4,6 +4,7 @@ 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 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/positive_traits = list() // Positive custom species traits, indexed by path @@ -127,6 +128,12 @@ var/global/list/tf_egg_types = list( 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 species traits paths = typesof(/datum/trait) - /datum/trait for(var/path in paths) diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index e13f50075a..eb340f83d6 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -39,7 +39,11 @@ #define DNA_UI_TAIL_R 20 #define DNA_UI_TAIL_G 21 #define DNA_UI_TAIL_B 22 -#define DNA_UI_LENGTH 22 // Update this when you add something, or you WILL break shit. +#define DNA_UI_WING_STYLE 23 //VOREStation Edit +#define DNA_UI_WING_R 24 //VOREStation Edit +#define DNA_UI_WING_G 25 //VOREStation Edit +#define DNA_UI_WING_B 26 //VOREStation Edit +#define DNA_UI_LENGTH 26 // Update this when you add something, or you WILL break shit. //VOREStation Edit to 26 #define DNA_SE_LENGTH 27 // For later: @@ -160,6 +164,11 @@ var/global/list/datum/dna/gene/dna_genes[0] if(character.tail_style) tail_style = tail_styles_list.Find(character.tail_style.type) + // Demi Wings + var/wing_style = 0 + if(character.wing_style) + wing_style = wing_styles_list.Find(character.wing_style.type) + // Playerscale (This assumes list is sorted big->small) var/size_multiplier = player_sizes_list.len // If fail to find, take smallest for(var/N in player_sizes_list) @@ -179,11 +188,16 @@ var/global/list/datum/dna/gene/dna_genes[0] SetUIValueRange(DNA_UI_EAR_STYLE, ear_style + 1, ear_styles_list.len + 1, 1) SetUIValueRange(DNA_UI_TAIL_STYLE, tail_style + 1, tail_styles_list.len + 1, 1) SetUIValueRange(DNA_UI_PLAYERSCALE, size_multiplier, player_sizes_list.len, 1) + SetUIValueRange(DNA_UI_WING_STYLE, wing_style + 1, wing_styles_list.len + 1, 1) SetUIValueRange(DNA_UI_TAIL_R, character.r_tail, 255, 1) SetUIValueRange(DNA_UI_TAIL_G, character.g_tail, 255, 1) SetUIValueRange(DNA_UI_TAIL_B, character.b_tail, 255, 1) + SetUIValueRange(DNA_UI_WING_R, character.r_wing, 255, 1) + SetUIValueRange(DNA_UI_WING_G, character.g_wing, 255, 1) + SetUIValueRange(DNA_UI_WING_B, character.b_wing, 255, 1) + // VORE Station Edit End SetUIValueRange(DNA_UI_HAIR_R, character.r_hair, 255, 1) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index 662a522d4a..156c98e52f 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -189,6 +189,13 @@ else if((0 < tail) && (tail <= tail_styles_list.len)) H.tail_style = tail_styles_list[tail_styles_list[tail]] + //Wing + var/wing = dna.GetUIValueRange(DNA_UI_WING_STYLE, wing_styles_list.len + 1) - 1 + if(wing <= 1) + H.wing_style = null + else if((0 < wing) && (wing <= wing_styles_list.len)) + H.wing_style = wing_styles_list[wing_styles_list[wing]] + // Playerscale var/size = dna.GetUIValueRange(DNA_UI_PLAYERSCALE, player_sizes_list.len) if((0 < size) && (size <= player_sizes_list.len)) diff --git a/code/modules/client/preference_setup/vore/01_ears.dm b/code/modules/client/preference_setup/vore/01_ears.dm index 5064aa58bd..100eb8d372 100644 --- a/code/modules/client/preference_setup/vore/01_ears.dm +++ b/code/modules/client/preference_setup/vore/01_ears.dm @@ -17,6 +17,10 @@ var/r_tail2 = 30 // For extra overlay. var/g_tail2 = 30 // For extra overlay. var/b_tail2 = 30 // For extra 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/dress_mob = TRUE // Definition of the stuff for Ears @@ -36,6 +40,10 @@ S["r_tail2"] >> pref.r_tail2 S["g_tail2"] >> pref.g_tail2 S["b_tail2"] >> pref.b_tail2 + S["wing_style"] >> pref.wing_style + S["r_wing"] >> pref.r_wing + S["g_wing"] >> pref.g_wing + S["b_wing"] >> pref.b_wing /datum/category_item/player_setup_item/vore/ears/save_character(var/savefile/S) S["ear_style"] << pref.ear_style @@ -49,6 +57,10 @@ S["r_tail2"] << pref.r_tail2 S["g_tail2"] << pref.g_tail2 S["b_tail2"] << pref.b_tail2 + S["wing_style"] << pref.wing_style + S["r_wing"] << pref.r_wing + S["g_wing"] << pref.g_wing + S["b_wing"] << pref.b_wing /datum/category_item/player_setup_item/vore/ears/sanitize_character() pref.red_ear = sanitize_integer(pref.red_ear, 0, 255, initial(pref.red_ear)) @@ -60,10 +72,15 @@ 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_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)) if(pref.ear_style) pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style)) if(pref.tail_style) pref.tail_style = sanitize_inlist(pref.tail_style, tail_styles_list, initial(pref.tail_style)) + if(pref.wing_style) + pref.wing_style = sanitize_inlist(pref.wing_style, wing_styles_list, 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] @@ -77,6 +94,12 @@ character.r_tail2 = pref.r_tail2 character.b_tail2 = pref.b_tail2 character.g_tail2 = pref.g_tail2 + 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 + + /datum/category_item/player_setup_item/vore/ears/content(var/mob/user) . += "

VORE Station Settings

" @@ -119,6 +142,20 @@ if (T.extra_overlay) . += "Change Secondary Color
__

" + 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/T = wing_styles_list[pref.wing_style] + if (T.do_colouration) + . += "Change Color
__

" + /datum/category_item/player_setup_item/vore/ears/OnTopic(var/href,var/list/href_list, var/mob/user) if(!CanUseTopic(user)) return TOPIC_NOACTION @@ -178,6 +215,29 @@ pref.b_tail2 = hex2num(copytext(new_tailc2, 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) || (user.ckey in instance.ckeys_allowed)) + pretty_wing_styles[instance.name] = path + + // Present choice to user + var/selection = input(user, "Pick wings", "Character Preference") as null|anything in pretty_wing_styles + pref.wing_style = pretty_wing_styles[selection] + + 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["toggle_clothing"]) pref.dress_mob = !pref.dress_mob return TOPIC_REFRESH_UPDATE_PREVIEW diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm index b001a4ca7b..dba378a338 100644 --- a/code/modules/mob/living/carbon/human/emote_vr.dm +++ b/code/modules/mob/living/carbon/human/emote_vr.dm @@ -7,6 +7,12 @@ message = "[wagging ? "starts" : "stops"] wagging their tail." else return 1 + if ("vflap") + if(toggle_wing_vr(message = 1)) + m_type = 1 + message = "[flapping ? "starts" : "stops"] flapping their wings." + else + return 1 if ("mlem") message = "mlems [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] tongue up over [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] nose. Mlem." m_type = 1 @@ -102,3 +108,17 @@ 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) + src << "You don't have a tail that supports this." + return 0 + + if(setting != null) + flapping = setting + else + flapping = !flapping + + update_wing_showing() + return 1 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 2f3f423681..fabc19d584 100644 --- a/code/modules/mob/living/carbon/human/human_defines_vr.dm +++ b/code/modules/mob/living/carbon/human/human_defines_vr.dm @@ -4,4 +4,5 @@ b_skin = 179 var/wagging = 0 //UGH. + var/flapping = 0 var/vantag_pref = VANTAG_NONE //What's my status? diff --git a/code/modules/mob/living/carbon/human/species/species_getters_vr.dm b/code/modules/mob/living/carbon/human/species/species_getters_vr.dm new file mode 100644 index 0000000000..4ba9305acc --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/species_getters_vr.dm @@ -0,0 +1,7 @@ + +/datum/species/proc/get_wing_hair(var/mob/living/carbon/human/H) //I have no idea what this is even used for other than teshari, but putting it in just in case. + return wing_hair //Since the tail has it. +/datum/species/proc/get_wing(var/mob/living/carbon/human/H) + return wing +/datum/species/proc/get_wing_animation(var/mob/living/carbon/human/H) + return wing_animation \ No newline at end of file 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 3772bf8470..7e330ad2af 100644 --- a/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -9,4 +9,10 @@ //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 \ No newline at end of file + //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 + var/wing_hair + var/wing + var/wing_animation + var/icobase_wing \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/station/station_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_vr.dm index 8398e9f7bd..0bef1972b8 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_vr.dm @@ -331,8 +331,3 @@ gluttonous = 0 spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED min_age = 18 - -/datum/species - holder_type = /obj/item/weapon/holder/micro //This allows you to pick up crew - min_age = 18 - diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 877dff5ece..ad7d7be356 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -135,7 +135,8 @@ Please contact me on #coderbus IRC. ~Carn x #define FIRE_LAYER 27 //If you're on fire #define WATER_LAYER 28 //If you're submerged in water. #define TARGETED_LAYER 29 //BS12: Layer for the target overlay from weapon targeting system -#define TOTAL_LAYERS 30 +#define WING_LAYER 30 //VOREStation edit. Simply move this up a number if things are added. +#define TOTAL_LAYERS 31 //VOREStation edit. Add it to the number polaris has but +1 to accomidate the wing_layer. ////////////////////////////////// /mob/living/carbon/human @@ -338,6 +339,7 @@ var/global/list/damage_icon_parts = list() //tail update_tail_showing(0) + update_wing_showing(0) //VOREStation edit //UNDERWEAR OVERLAY /mob/living/carbon/human/proc/update_underwear(var/update_icons=1) @@ -836,6 +838,7 @@ var/global/list/damage_icon_parts = list() update_inv_w_uniform(0) update_inv_shoes(0) update_tail_showing(0) + update_wing_showing(0)//VOREStation Edit if(update_icons) update_icons() diff --git a/code/modules/mob/living/carbon/human/update_icons_vr.dm b/code/modules/mob/living/carbon/human/update_icons_vr.dm new file mode 100644 index 0000000000..b440cf0f00 --- /dev/null +++ b/code/modules/mob/living/carbon/human/update_icons_vr.dm @@ -0,0 +1,65 @@ +/mob/living/carbon/human/proc/get_wing_icon() + var/icon_key = "[species.get_race_key(src)][r_skin][g_skin][b_skin][r_hair][g_hair][b_hair]" + var/icon/wing_icon = wing_icon_cache[icon_key] + if(!wing_icon) + //generate a new one + var/species_wing_anim = species.get_wing_animation(src) + if(species.icobase_wing) species_wing_anim = species.icobase + if(!species_wing_anim) species_wing_anim = 'icons/effects/species.dmi' + wing_icon = new/icon(species_wing_anim) + if(species.color_mult) + wing_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_MULTIPLY) + else + wing_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD) + // The following will not work with animated wings. + var/use_species_wing = species.get_wing_hair(src) + if(use_species_wing) + var/icon/hair_icon = icon('icons/effects/species.dmi', "[species.get_wing(src)]_[use_species_wing]") + hair_icon.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD) + wing_icon.Blend(hair_icon, ICON_OVERLAY) + wing_icon_cache[icon_key] = wing_icon + + return wing_icon + +/mob/living/carbon/human/proc/set_wing_state(var/t_state) + var/image/wing_overlay = overlays_standing[WING_LAYER] + + if(wing_overlay && species.get_wing_animation(src)) + wing_overlay.icon_state = t_state + return wing_overlay + return null + +/mob/living/carbon/human/proc/animate_wing_reset(var/update_icons=1) + if(stat != DEAD) + set_wing_state("[species.get_wing(src)]_idle[rand(0,9)]") + else + set_wing_state("[species.get_wing(src)]_static") + toggle_wing_vr(0) + if(update_icons) + update_icons() + +/mob/living/carbon/human/proc/get_wing_image() + //If you are FBP with tail 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) + return image(wing_s) + else + return image(wing_s) + return null + +/mob/living/carbon/human/proc/update_wing_showing(var/update_icons=1) + overlays_standing[WING_LAYER] = null + + overlays_standing[WING_LAYER] = get_wing_image() + if(overlays_standing[WING_LAYER]) + if(update_icons) + update_icons() + return diff --git a/code/modules/organs/robolimbs_vr.dm b/code/modules/organs/robolimbs_vr.dm index cd5eb27674..9bc38581a5 100644 --- a/code/modules/organs/robolimbs_vr.dm +++ b/code/modules/organs/robolimbs_vr.dm @@ -1,5 +1,6 @@ /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 ///////////////// diff --git a/code/modules/resleeving/designer.dm b/code/modules/resleeving/designer.dm index 598eb7b8d0..a69e3a574c 100644 --- a/code/modules/resleeving/designer.dm +++ b/code/modules/resleeving/designer.dm @@ -109,6 +109,14 @@ temp["colorHref"] = "tail_color" styles["Tail"] = temp + temp = list("styleHref" = "wing_style", "style" = "Normal") + if(mannequin.wing_style) + temp["style"] = mannequin.wing_style.name + if(mannequin.wing_style.do_colouration) + temp["color"] = MOB_HEX_COLOR(mannequin, wing) + temp["colorHref"] = "wing_color" + styles["Tail"] = temp + temp = list("styleHref" = "hair_style", "style" = mannequin.h_style) if(mannequin.species && (mannequin.species.appearance_flags & HAS_HAIR_COLOR)) temp["color"] = MOB_HEX_COLOR(mannequin, hair) diff --git a/code/modules/vore/appearance/preferences_vr.dm b/code/modules/vore/appearance/preferences_vr.dm index f9302e8ed0..1a5e3129c9 100644 --- a/code/modules/vore/appearance/preferences_vr.dm +++ b/code/modules/vore/appearance/preferences_vr.dm @@ -21,6 +21,10 @@ var/r_tail2 = 30 var/g_tail2 = 30 var/b_tail2 = 30 + var/datum/sprite_accessory/tail/wing_style = null + var/r_wing = 30 + var/g_wing = 30 + var/b_wing = 30 // Custom Species Name var/custom_species diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm index 573b5a02b4..974ff209f5 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -279,6 +279,80 @@ icon_state = "alurane-ears" ckeys_allowed = list("natje") +/* +//////////////////////////// +/ =--------------------= / +/ == 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. + + var/color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1 + var/extra_overlay // Icon state of an additional overlay to blend in. + 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 + var/desc = "You should not see this..." + var/ani_state // State when flapping/animated + var/extra_overlay_w // Flapping state for extra overlay + +/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/feathered + name = "feathered wings, colorable" + desc = "" + icon_state = "feathered" + 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" + /* //////////////////////////// / =--------------------= / @@ -364,18 +438,6 @@ icon_state = "bunny" do_colouration = 1 -/datum/sprite_accessory/tail/mothc - name = "moth wings, colorable" - desc = "" - icon_state = "moth" - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - -/datum/sprite_accessory/tail/moth - name = "moth wings" - desc = "" - icon_state = "moth" - /datum/sprite_accessory/tail/bear_brown name = "bear, brown" desc = "" @@ -452,53 +514,48 @@ icon_state = "fantail" do_colouration = 1 color_blend_mode = ICON_MULTIPLY - +/* /datum/sprite_accessory/tail/faintailwings name = "avian fantail, colorable (+wings)" desc = "" icon_state= "fantailwings" 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/wagtailwings name = "avian wagtail, colorable (+wings)" desc = "" icon_state = "wagtailwings" do_colouration = 1 color_blend_mode = ICON_MULTIPLY - +*/ /datum/sprite_accessory/tail/crossfox name = "cross fox" desc = "" icon_state = "crossfox" - +/* /datum/sprite_accessory/tail/bee name = "bee thorax (+wings)" desc = "" icon_state = "bee" - +*/ /datum/sprite_accessory/tail/beethorax name = "bee thorax" desc = "" icon_state = "beethorax" -/datum/sprite_accessory/tail/beewings - name = "bee wings" - desc = "" - icon_state = "beewings" - -/datum/sprite_accessory/tail/moth_full +/datum/sprite_accessory/tail/moth_full //I'll... Let this one stay. The antenna itself isn't a big enough thing to be standalone. name = "moth antenna and wings" desc = "" icon_state = "moth_full" - +/* /datum/sprite_accessory/tail/succubus_purple name = "succubus, purple (+wings)" desc = "" @@ -513,45 +570,26 @@ name = "succubus, black (+wings)" desc = "" icon_state = "succubus-black" - +*/ /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/succubus_color name = "succubus, colorable (+wings)" desc = "" icon_state = "succubus-black" do_colouration = 1 - +*/ /datum/sprite_accessory/tail/spade_color name = "spade-tail (colorable)" desc = "" icon_state = "spadetail-black" do_colouration = 1 -/datum/sprite_accessory/tail/bat_black - name = "bat wings, black" - desc = "" - icon_state = "bat-black" - show_species_tail = 1 - -/datum/sprite_accessory/tail/bat_color - name = "bat wings, colorable" - desc = "" - icon_state = "bat-color" - show_species_tail = 1 - do_colouration = 1 - -/datum/sprite_accessory/tail/bat_red - name = "bat wings, red" - desc = "" - icon_state = "bat-red" - show_species_tail = 1 - /datum/sprite_accessory/tail/snag name = "xenomorph tail w/ backplate" desc = "" @@ -568,21 +606,13 @@ icon_state = "molenar-kitsune" ckeys_allowed = list("molenar") -/datum/sprite_accessory/tail/harpywings - name = "harpy wings, colorable" - desc = "" - icon_state = "harpywings" - do_colouration = 1 - show_species_tail = 1 - color_blend_mode = ICON_MULTIPLY - /datum/sprite_accessory/tail/liquidfirefly_gazer name = "gazer eyestalks" desc = "" icon_state = "liquidfirefly-eyestalks" //ckeys_allowed = list("liquidfirefly","seiga") //At request. -/datum/sprite_accessory/tail/miria_fluffdragon +/datum/sprite_accessory/tail/miria_fluffdragon //Fluff tails with wings stay under tails. name = "fluffdragon wings+tail (Miria Masters)" desc = "" icon_state = "miria-fluffdragontail" @@ -655,14 +685,6 @@ ani_state = "ketraitail_w" //ckeys_allowed = list("ketrai") //They requested it to be enabled for everyone. -/datum/sprite_accessory/tail/feathered - name = "feathered wings, colorable" - desc = "" - icon_state = "feathered" - show_species_tail = 1 - do_colouration = 1 - color_blend_mode = ICON_MULTIPLY - /datum/sprite_accessory/tail/redpanda name = "red panda" desc = "" diff --git a/code/modules/vore/appearance/update_icons_vr.dm b/code/modules/vore/appearance/update_icons_vr.dm index e66ceefa90..43ace3859b 100644 --- a/code/modules/vore/appearance/update_icons_vr.dm +++ b/code/modules/vore/appearance/update_icons_vr.dm @@ -1,5 +1,5 @@ - #define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur) +var/global/list/wing_icon_cache = list() /mob/living/carbon/human/proc/get_ears_overlay() if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 717103524b..186fdfbee0 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -525,6 +525,7 @@ if(TFchance == 1) if(P.species != O.species || P.tail_style != O.tail_style || P.custom_species != O.custom_species || P.ear_style != O.ear_style) P.tail_style = O.tail_style + P.wing_style = O.wing_style P.ear_style = O.ear_style P.species = O.species P.custom_species = O.custom_species @@ -594,6 +595,7 @@ P.g_skin = O.g_skin P.b_skin = O.b_skin P.tail_style = O.tail_style + P.wing_style = O.wing_style P.r_tail = O.r_tail P.g_tail = O.g_tail P.b_tail = O.b_tail @@ -631,6 +633,7 @@ var/mob/living/carbon/human/O = owner P.tail_style = O.tail_style + P.wing_style = O.wing_style P.ear_style = O.ear_style P.species = O.species P.custom_species = O.custom_species @@ -724,6 +727,7 @@ P.g_skin = O.g_skin P.b_skin = O.b_skin P.tail_style = O.tail_style + P.wing_style = O.wing_style P.r_tail = O.r_tail P.g_tail = O.g_tail P.b_tail = O.b_tail diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi index eb0559a717675d9c8b6535b06f0580a88ff374bd..e09ff397751e898b48df3d0ad176563159ac9f39 100644 GIT binary patch delta 7321 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 Mm35RpDA-2)A7HmYJOBUy delta 5953 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