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 eb0559a717..e09ff39775 100644
Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ
diff --git a/icons/mob/vore/wings_vr.dmi b/icons/mob/vore/wings_vr.dmi
new file mode 100644
index 0000000000..ff9ad121d6
Binary files /dev/null and b/icons/mob/vore/wings_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index e9b9e99e4c..0d0103d460 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1798,9 +1798,11 @@
#include "code\modules\mob\living\carbon\human\stripping.dm"
#include "code\modules\mob\living\carbon\human\unarmed_attack.dm"
#include "code\modules\mob\living\carbon\human\update_icons.dm"
+#include "code\modules\mob\living\carbon\human\update_icons_vr.dm"
#include "code\modules\mob\living\carbon\human\species\species.dm"
#include "code\modules\mob\living\carbon\human\species\species_attack.dm"
#include "code\modules\mob\living\carbon\human\species\species_getters.dm"
+#include "code\modules\mob\living\carbon\human\species\species_getters_vr.dm"
#include "code\modules\mob\living\carbon\human\species\species_helpers.dm"
#include "code\modules\mob\living\carbon\human\species\species_hud.dm"
#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm"