diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index eb18d09eb3..7dd229fb7c 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -2,6 +2,9 @@
* VOREStation global lists
*/
+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
+
//stores numeric player size options indexed by name
var/global/list/player_sizes_list = list(
"Macro" = RESIZE_HUGE,
@@ -73,3 +76,20 @@ var/global/list/struggle_sounds = list(
"Squish2" = 'sound/vore/squish2.ogg',
"Squish3" = 'sound/vore/squish3.ogg',
"Squish4" = 'sound/vore/squish4.ogg')
+
+
+/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
+ return 1 // Hooks must return 1
diff --git a/code/modules/client/preference_setup/vore/01_ears.dm b/code/modules/client/preference_setup/vore/01_ears.dm
new file mode 100644
index 0000000000..17d03232ff
--- /dev/null
+++ b/code/modules/client/preference_setup/vore/01_ears.dm
@@ -0,0 +1,121 @@
+// Super Global Stuff
+/datum/category_collection/player_setup_collection/proc/copy_to_mob(var/mob/living/carbon/human/C)
+ for(var/datum/category_group/player_setup_category/PS in categories)
+ PS.copy_to_mob(C)
+
+/datum/category_group/player_setup_category/proc/copy_to_mob(var/mob/living/carbon/human/C)
+ for(var/datum/category_item/player_setup_item/PI in items)
+ PI.copy_to_mob(C)
+
+/datum/category_item/player_setup_item/proc/copy_to_mob(var/mob/living/carbon/human/C)
+ return
+
+// Global stuff that will put us on the map
+/datum/category_group/player_setup_category/vore
+ name = "VORE"
+ sort_order = 7
+ category_item_type = /datum/category_item/player_setup_item/vore
+
+// Definition of the stuff for Ears
+/datum/category_item/player_setup_item/vore/ears
+ name = "Ears"
+ sort_order = 1
+
+/datum/category_item/player_setup_item/vore/ears/load_character(var/savefile/S)
+ S["ear_style"] >> pref.ear_style
+ S["tail_style"] >> pref.tail_style
+ S["r_tail"] >> pref.r_tail
+ S["g_tail"] >> pref.g_tail
+ S["b_tail"] >> pref.b_tail
+
+/datum/category_item/player_setup_item/vore/ears/save_character(var/savefile/S)
+ S["ear_style"] << pref.ear_style
+ S["tail_style"] << pref.tail_style
+ S["r_tail"] << pref.r_tail
+ S["g_tail"] << pref.g_tail
+ S["b_tail"] << pref.b_tail
+
+/datum/category_item/player_setup_item/vore/ears/sanitize_character()
+ 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))
+ 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))
+
+/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.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
+
+/datum/category_item/player_setup_item/vore/ears/content(var/mob/user)
+ . += "
VORE Station Settings
"
+
+ pref.update_preview_icon()
+ if(pref.preview_icon_front && pref.preview_icon_side)
+ user << browse_rsc(pref.preview_icon_front, "preview_icon.png")
+ user << browse_rsc(pref.preview_icon_side, "preview_icon2.png")
+ . += "Preview
"
+ . += "

"
+
+ . += "Ears
"
+ . += " Style: [pref.ear_style ? "Custom" : "Normal"]
"
+
+ . += "Tail
"
+ . += " Style: [pref.tail_style ? "Custom" : "Normal"]
"
+ 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 \
+ \
+ "
+
+/datum/category_item/player_setup_item/vore/ears/OnTopic(var/href,var/list/href_list, var/mob/user)
+
+ if(href_list["ear_style"])
+ // Construct the list of names allowed for this user.
+ var/list/pretty_ear_styles = list("Normal")
+ 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))
+ pretty_ear_styles[instance.name] = path
+
+ // Present choice to user
+ var/selection = input(user, "Pick ears", "Character Preference") as null|anything in pretty_ear_styles
+ if(selection && selection != "Normal")
+ pref.ear_style = pretty_ear_styles[selection]
+ else
+ pref.ear_style = null
+ return TOPIC_REFRESH
+
+ else if(href_list["tail_style"])
+ // Construct the list of names allowed for this user.
+ var/list/pretty_tail_styles = list("Normal")
+ for(var/path in tail_styles_list)
+ var/datum/sprite_accessory/tail/instance = tail_styles_list[path]
+ if((!instance.ckeys_allowed) || (user.ckey in instance.ckeys_allowed))
+ pretty_tail_styles[instance.name] = path
+
+ // Present choice to user
+ var/selection = input(user, "Pick tails", "Character Preference") as null|anything in pretty_tail_styles
+ if(selection && selection != "Normal")
+ pref.tail_style = pretty_tail_styles[selection]
+ else
+ pref.tail_style = null
+ return TOPIC_REFRESH
+
+ 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
+ return ..()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index e6627cc39d..a9f52a0d2b 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -256,6 +256,11 @@ datum/preferences
/datum/preferences/proc/copy_to(mob/living/carbon/human/character, safety = 0)
// Sanitizing rather than saving as someone might still be editing when copy_to occurs.
player_setup.sanitize_setup()
+
+ // VOREStation Edit - Start
+ player_setup.copy_to_mob(character)
+ // VOREStation Edit - End
+
if(be_random_name)
real_name = random_name(identifying_gender,species)
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index b073f8ccf6..22329cf2be 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -373,6 +373,12 @@ var/global/list/damage_icon_parts = list()
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)
+ // VOREStation Edit - END
+
overlays_standing[HAIR_LAYER] = image(face_standing)
if(update_icons) update_icons()
@@ -963,6 +969,14 @@ var/global/list/damage_icon_parts = list()
/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1)
overlays_standing[TAIL_LAYER] = null
+ // VOREStation Edit - START
+ overlays_standing[TAIL_LAYER] = get_tail_image()
+ if(overlays_standing[TAIL_LAYER])
+ if(update_icons)
+ update_icons()
+ return
+ // VOREStation Edit - END
+
if(species.tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
var/icon/tail_s = get_tail_icon()
overlays_standing[TAIL_LAYER] = image(tail_s, icon_state = "[species.tail]_s")
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index 16ae76dbbb..3db8be967a 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -246,9 +246,31 @@
limb_icon.Blend(rgb(-s_tone, -s_tone, -s_tone), ICON_SUBTRACT)
preview_icon.Blend(limb_icon, ICON_OVERLAY)
- //Tail
- if(current_species && (current_species.tail))
- var/icon/temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[current_species.tail]_s")
+ //Tails
+
+ // VoreStation Edit - Start
+ var/show_species_tail = 1
+ if(src.tail_style && tail_styles_list[src.tail_style])
+ var/datum/sprite_accessory/tail/tail_meta = tail_styles_list[src.tail_style]
+ var/icon/tail_s = new/icon("icon" = tail_meta.icon, "icon_state" = tail_meta.icon_state)
+ if(tail_meta.do_colouration)
+ tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_meta.do_colouration)
+ if(tail_meta.extra_overlay)
+ var/icon/overlay = new/icon("icon" = tail_meta.icon, "icon_state" = tail_meta.extra_overlay)
+ tail_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+
+ show_species_tail = tail_meta.show_species_tail
+ if(istype(tail_meta, /datum/sprite_accessory/tail/taur))
+ preview_icon.Blend(tail_s, ICON_OVERLAY, -16)
+ else
+ preview_icon.Blend(tail_s, ICON_OVERLAY)
+ // VoreStation Edit - End
+
+ if(show_species_tail && current_species && (current_species.tail))
+ var/icon/temp = new/icon(
+ "icon" = (current_species.icobase_tail ? current_species.icobase : 'icons/effects/species.dmi'),
+ "icon_state" = "[current_species.tail]_s")
if(current_species && (current_species.appearance_flags & HAS_SKIN_COLOR))
temp.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
if(current_species && (current_species.appearance_flags & HAS_SKIN_TONE))
@@ -284,6 +306,19 @@
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
eyes_s.Blend(facial_s, ICON_OVERLAY)
+ // VoreStation Edit - Start
+ // Ear Items
+ var/datum/sprite_accessory/ears/ears_meta = ear_styles_list[src.ear_style]
+ if(ears_meta)
+ var/icon/ears_s = icon("icon" = ears_meta.icon, "icon_state" = ears_meta.icon_state)
+ if(ears_meta.do_colouration)
+ ears_s.Blend(rgb(src.r_hair, src.g_hair, src.b_hair), ears_meta.do_colouration)
+ if(ears_meta.extra_overlay)
+ var/icon/overlay = new/icon("icon" = ears_meta.icon, "icon_state" = ears_meta.extra_overlay)
+ ears_s.Blend(overlay, ICON_OVERLAY)
+ eyes_s.Blend(ears_s, ICON_OVERLAY)
+ // Vore Station Edit - End
+
var/icon/underwear_top_s = null
if(underwear_top && current_species.appearance_flags & HAS_UNDERWEAR)
underwear_top_s = new/icon("icon" = 'icons/mob/human.dmi', "icon_state" = underwear_top)
diff --git a/code/modules/vore/appearance/preferences_vr.dm b/code/modules/vore/appearance/preferences_vr.dm
new file mode 100644
index 0000000000..2fad10109f
--- /dev/null
+++ b/code/modules/vore/appearance/preferences_vr.dm
@@ -0,0 +1,25 @@
+/**
+ * Additional variables that must be defined on /mob/living/carbon/human
+ * for use in code that is part of the vore modules.
+ *
+ * These variables are declared here (separately from the normal human_defines.dm)
+ * in order to isolate VOREStation changes and ease merging of other codebases.
+ */
+
+// Additional vars
+/mob/living/carbon/human
+
+ // Horray Furries!
+ var/datum/sprite_accessory/ears/ear_style = null
+ var/datum/sprite_accessory/tail/tail_style = null
+ var/r_tail = 30
+ var/g_tail = 30
+ var/b_tail = 30
+
+/datum/preferences
+ // Appearance
+ var/ear_style // Type of selected ear style
+ 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
diff --git a/code/modules/vore/appearance/spider_taur_powers_vr.dm b/code/modules/vore/appearance/spider_taur_powers_vr.dm
new file mode 100644
index 0000000000..e90003b3cd
--- /dev/null
+++ b/code/modules/vore/appearance/spider_taur_powers_vr.dm
@@ -0,0 +1,44 @@
+// ---------------------------------------------
+// -!-!-!-!-!-!-!-!- READ ME -!-!-!-!-!-!-!-!-!-
+// ---------------------------------------------
+
+//Beep beep hello
+//
+//Use this file to define the exclusive abilities of the spidertaur folk
+//
+//ahuhuhuhu
+//-Antsnap
+
+obj/item/clothing/suit/web_bindings
+ icon = 'icons/obj/clothing/suits.dmi'
+ name = "web bindings"
+ desc = "A webbed cocoon that completely restrains the wearer."
+ icon_state = "web_bindings"
+ item_state = "web_bindings"
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
+ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT|HIDETAIL
+
+/* //Commenting all this out, as people keep abusing it. Sorry!
+mob/proc/weaveWeb()
+ set name = "Weave Web"
+ set category = "Species Powers"
+ if(nutrition >= 500) //People decided to abuse it. Sorry. It was asked to be made so it couldn't be spammed, and what do ya know, people are spamming it everywhere.
+ src.visible_message("\blue \the [src] weaves a web from their spinneret silk.")
+ nutrition -= 500
+ spawn(30) //3 seconds to form
+ new /obj/effect/spider/stickyweb(src.loc)
+ else
+ src << "You do not have enough nutrition to create webbing!"
+*/
+
+mob/proc/weaveWebBindings()
+ set name = "Weave Web Bindings"
+ set category = "Species Powers"
+ if(nutrition >= 30) //This isn't a huge problem. This is so you can bind people up.
+ src.visible_message("\blue \the [src] pulls silk from their spinneret and delicately weaves it into bindings.")
+ nutrition -= 30
+ spawn(30) //5 seconds to weave the bindings~
+ var/obj/item/clothing/suit/web_bindings/bindings = new() //This sprite is amazing, I must say.
+ src.put_in_hands(bindings)
+ else
+ src << "You do not have enough nutrition to create webbing!" //CK~
diff --git a/code/modules/vore/appearance/sprite_accessories_vr.dm b/code/modules/vore/appearance/sprite_accessories_vr.dm
new file mode 100644
index 0000000000..60d6c9dcb6
--- /dev/null
+++ b/code/modules/vore/appearance/sprite_accessories_vr.dm
@@ -0,0 +1,490 @@
+/*
+ Hello and welcome to VOREStation sprite_accessories: For a more general overview
+ please read sprite_accessories.dm. This file is for ears, tails, and taur bodies!
+
+ 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.
+ var/list/ckeys_allowed = null
+
+/*
+////////////////////////////
+/ =--------------------= /
+/ == Ear Definitions == /
+/ =--------------------= /
+////////////////////////////
+*/
+/datum/sprite_accessory/ears
+ name = "You should not see this..."
+ icon = 'icons/mob/vore/ears_vr.dmi'
+ do_colouration = 0 //Set to ICON_MULTIPLY or ICON_ADD to convert greyscale to the haircolor
+
+ var/extra_overlay // Icon state of an additional overlay to blend in.
+ var/desc = "You should not see this..."
+
+// Ears avaliable to anyone
+
+/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/squirrel
+ name = "squirrel, hair-colored"
+ desc = ""
+ icon_state = "squirrel"
+ do_colouration = ICON_ADD
+
+/datum/sprite_accessory/ears/kitty
+ name = "kitty, hair-colored"
+ desc = ""
+ icon_state = "kitty"
+ do_colouration = ICON_ADD
+ extra_overlay = "kittyinner"
+
+/datum/sprite_accessory/ears/bunny
+ name = "bunny, hair-colored"
+ desc = ""
+ icon_state = "bunny"
+ do_colouration = ICON_ADD
+
+/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
+ name = "bear, hair-colored"
+ desc = ""
+ icon_state = "bear"
+ do_colouration = ICON_ADD
+
+/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/wolf
+ name = "wolf, hair-colored"
+ desc = ""
+ icon_state = "wolf"
+ do_colouration = ICON_ADD
+ extra_overlay = "wolfinner"
+
+/datum/sprite_accessory/ears/mouse_grey
+ name = "mouse, grey"
+ desc = ""
+ icon_state = "mouse-grey"
+
+/datum/sprite_accessory/ears/mouse
+ name = "mouse, hair-colored"
+ desc = ""
+ icon_state = "mouse"
+ do_colouration = ICON_ADD
+ extra_overlay = "mouseinner"
+
+/datum/sprite_accessory/ears/bee
+ name = "bee antennae"
+ desc = ""
+ icon_state = "bee"
+
+/datum/sprite_accessory/ears/oni_h1
+ name = "oni horns"
+ desc = ""
+ icon_state = "oni-h1"
+
+/datum/sprite_accessory/ears/demon_horns1
+ name = "demon horns"
+ desc = ""
+ icon_state = "demon-horns1"
+
+// 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/molenar_deathclaw
+ name = "deathclaw ears (Molenar)"
+ desc = ""
+ icon_state = "molenar-deathclaw"
+ ckeys_allowed = list("molenar")
+
+/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"
+ ckeys_allowed = list("joey4298")
+
+/datum/sprite_accessory/ears/aronai
+ name = "aronai ears/head (Aronai)"
+ desc = ""
+ icon_state = "aronai"
+ ckeys_allowed = list("arokha")
+
+/*
+////////////////////////////
+/ =--------------------= /
+/ == Tail Definitions == /
+/ =--------------------= /
+////////////////////////////
+*/
+/datum/sprite_accessory/tail
+ name = "You should not see this..."
+ icon = 'icons/mob/vore/tails_vr.dmi'
+ do_colouration = 0 //Set to ICON_MULTIPLY or ICON_ADD to convert greyscale to the haircolor
+
+ var/extra_overlay // Icon state of an additional overlay to blend in.
+ 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..."
+
+/datum/sprite_accessory/tail/invisible
+ name = "hide species-sprite tail"
+ icon = null
+ icon_state = null
+
+/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, hair-colored"
+ desc = ""
+ icon_state = "squirrel"
+ do_colouration = ICON_ADD
+
+/datum/sprite_accessory/tail/kitty
+ name = "kitty, hair-colored, downwards"
+ desc = ""
+ icon_state = "kittydown"
+ do_colouration = ICON_ADD
+
+/datum/sprite_accessory/tail/kittyup
+ name = "kitty, hair-colored, upwards"
+ desc = ""
+ icon_state = "kittyup"
+ do_colouration = ICON_ADD
+
+/datum/sprite_accessory/tail/tiger_white
+ name = "tiger, hair-colored, white stripes"
+ desc = ""
+ icon_state = "tiger"
+ do_colouration = ICON_ADD
+ extra_overlay = "tigerinnerwhite"
+
+/datum/sprite_accessory/tail/tiger_black
+ name = "tiger, hair-colored, black stripes"
+ desc = ""
+ icon_state = "tiger"
+ do_colouration = ICON_ADD
+ extra_overlay = "tigerinnerblack"
+
+/datum/sprite_accessory/tail/stripey
+ name = "stripey taj, hair-colored"
+ desc = ""
+ icon_state = "stripeytail"
+ do_colouration = ICON_ADD
+
+/datum/sprite_accessory/tail/stripeytail_brown
+ name = "stripey taj, brown"
+ desc = ""
+ icon_state = "stripeytail-brown"
+
+/datum/sprite_accessory/tail/bunny
+ name = "bunny, hair-colored"
+ desc = ""
+ icon_state = "bunny"
+ do_colouration = ICON_ADD
+
+/datum/sprite_accessory/tail/bear_brown
+ name = "bear, brown"
+ desc = ""
+ icon_state = "bear-brown"
+
+/datum/sprite_accessory/tail/bear
+ name = "bear, hair-colored"
+ desc = ""
+ icon_state = "bear"
+ do_colouration = ICON_ADD
+
+/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, hair-colored"
+ desc = ""
+ icon_state = "wolf"
+ do_colouration = ICON_ADD
+ extra_overlay = "wolfinner"
+
+/datum/sprite_accessory/tail/mouse_grey
+ name = "mouse, grey"
+ desc = ""
+ icon_state = "mouse-grey"
+
+/datum/sprite_accessory/tail/crossfox
+ name = "cross fox"
+ desc = ""
+ icon_state = "crossfox"
+
+/datum/sprite_accessory/tail/mouse
+ name = "mouse, hair-colored"
+ desc = ""
+ icon_state = "mouse"
+ do_colouration = ICON_ADD
+ extra_overlay = "mouseinner"
+
+/datum/sprite_accessory/tail/bee
+ name = "bee thorax (+wings)"
+ desc = ""
+ icon_state = "bee"
+
+/datum/sprite_accessory/tail/succubus_purple
+ name = "succubus, purple (+wings)"
+ desc = ""
+ icon_state = "succubus-purple"
+
+/datum/sprite_accessory/tail/succubus_red
+ name = "succubus, red (+wings)"
+ desc = ""
+ icon_state = "succubus-red"
+
+/datum/sprite_accessory/tail/succubus_black
+ name = "succubus, black (+wings)"
+ desc = ""
+ icon_state = "succubus-black"
+
+/datum/sprite_accessory/tail/bat_black
+ name = "bat wings, black"
+ desc = ""
+ icon_state = "bat-black"
+ show_species_tail = 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 = ""
+ icon_state = "snag"
+
+/datum/sprite_accessory/tail/xenotail
+ name = "xenomorph tail"
+ desc = ""
+ icon_state = "xenotail"
+
+/datum/sprite_accessory/tail/molenar_kitsune
+ name = "quintail kitsune tails (Molenar)"
+ desc = ""
+ icon_state = "molenar-kitsune"
+ ckeys_allowed = list("molenar")
+
+/datum/sprite_accessory/tail/molenar_deathclaw
+ name = "deathclaw bits (Molenar)"
+ desc = ""
+ icon_state = "molenar-deathclaw"
+ ckeys_allowed = list("molenar","jertheace")
+
+/datum/sprite_accessory/tail/runac
+ name = "fennecsune tails (Runac)"
+ desc = ""
+ icon_state = "runac"
+ ckeys_allowed = list("rebcom1807")
+
+/datum/sprite_accessory/tail/kerena
+ name = "wingwolf tail (+wings) (Kerena)"
+ desc = ""
+ icon_state = "kerena"
+ ckeys_allowed = list("somekindofpony")
+
+/datum/sprite_accessory/tail/rosey
+ name = "tritail kitsune tails (Rosey)"
+ desc = ""
+ icon_state = "rosey"
+ ckeys_allowed = list("joey4298")
+
+/datum/sprite_accessory/tail/scree
+ name = "green taj tail (+wings) (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/feathered
+ name = "feathered wings"
+ desc = ""
+ icon_state = "feathered"
+
+// TODO - Leshana - What is this?
+/datum/sprite_accessory/tail/special
+ name = "Blank tail. Do not select."
+ icon = 'icons/effects/species.dmi'
+
+/datum/sprite_accessory/tail/special/unathi
+ name = "unathi tail"
+ desc = ""
+ icon_state = "sogtail_s"
+
+/datum/sprite_accessory/tail/special/tajaran
+ name = "tajaran tail"
+ desc = ""
+ icon_state = "tajtail_s"
+
+/datum/sprite_accessory/tail/special/sergal
+ name = "sergal tail"
+ desc = ""
+ icon_state = "sergtail_s"
+
+/datum/sprite_accessory/tail/special/akula
+ name = "akula tail"
+ desc = ""
+ icon_state = "sharktail_s"
+
+/datum/sprite_accessory/tail/special/nevrean
+ name = "nevrean tail"
+ desc = ""
+ icon_state = "nevrean_s"
+
+/datum/sprite_accessory/tail/special/unathihc
+ name = "unathi tail, hair colored"
+ desc = ""
+ icon_state = "sogtail_s"
+ do_colouration = ICON_ADD
+
+/datum/sprite_accessory/tail/special/tajaranhc
+ name = "tajaran tail, hair colored"
+ desc = ""
+ icon_state = "tajtail_s"
+ do_colouration = ICON_ADD
+
+/datum/sprite_accessory/tail/special/sergalhc
+ name = "sergal tail, hair colored"
+ desc = ""
+ icon_state = "sergtail_s"
+ do_colouration = ICON_ADD
+
+/datum/sprite_accessory/tail/special/akulahc
+ name = "akula tail, hair colored"
+ desc = ""
+ icon_state = "sharktail_s"
+ do_colouration = ICON_ADD
+
+/datum/sprite_accessory/tail/special/nevreanhc
+ name = "nevrean tail, hair colored"
+ desc = ""
+ icon_state = "nevrean_s"
+ do_colouration = ICON_ADD
+
+
+/*
+////////////////////////////
+/ =--------------------= /
+/ == 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/vore/taurs_vr.dmi'
+ do_colouration = ICON_MULTIPLY // In fact, it should use tail color!
+
+/datum/sprite_accessory/tail/taur/wolf
+ name = "Wolf"
+ icon_state = "wolf_s"
+
+/datum/sprite_accessory/tail/taur/naga
+ name = "Naga"
+ icon_state = "naga_s"
+
+/datum/sprite_accessory/tail/taur/horse
+ name = "Horse"
+ icon_state = "horse_s"
+
+/datum/sprite_accessory/tail/taur/cow
+ name = "Cow"
+ icon_state = "cow_s"
+
+/datum/sprite_accessory/tail/taur/lizard
+ name = "Lizard"
+ icon_state = "lizard_s"
+
+/datum/sprite_accessory/tail/taur/spider
+ name = "Spider"
+ icon_state = "spider_s"
diff --git a/code/modules/vore/appearance/update_icons_vr.dm b/code/modules/vore/appearance/update_icons_vr.dm
new file mode 100644
index 0000000000..9b263ba3c5
--- /dev/null
+++ b/code/modules/vore/appearance/update_icons_vr.dm
@@ -0,0 +1,30 @@
+
+#define isTaurTail(A) istype(A, /datum/sprite_accessory/tail/taur)
+
+/mob/living/carbon/human/proc/get_ears_overlay()
+ if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR)) && (src.species.get_bodytype() in ear_style.species_allowed))
+ 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_hair, src.g_hair, src.b_hair), ear_style.do_colouration)
+ if(ear_style.extra_overlay)
+ var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay)
+ ears_s.Blend(overlay, ICON_OVERLAY)
+ return ears_s
+ return null
+
+
+/mob/living/carbon/human/proc/get_tail_image()
+ 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" = tail_style.icon_state)
+ if(tail_style.do_colouration)
+ tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.do_colouration)
+ if(tail_style.extra_overlay)
+ var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay)
+ tail_s.Blend(overlay, ICON_OVERLAY)
+ qdel(overlay)
+
+ if(isTaurTail(tail_style))
+ return image(tail_s, "pixel_x" = -16)
+ else
+ return image(tail_s)
+ return null
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index 2b0f231067..9655113b5e 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -120,4 +120,4 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
S["weight_gain"] << weight_gain
S["weight_loss"] << weight_loss
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/modules/vore/resizing/resize_vr.dm b/code/modules/vore/resizing/resize_vr.dm
index c81051a3f8..3d1262ab73 100644
--- a/code/modules/vore/resizing/resize_vr.dm
+++ b/code/modules/vore/resizing/resize_vr.dm
@@ -110,7 +110,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
now_pushing = 0
if(src.get_effective_size() > tmob.get_effective_size())
var/mob/living/carbon/human/M = src
- if(0) // POLARISTODO istaur(src) && M.taur_style == 2)
+ if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You carefully slither around [tmob]."
tmob << "[src]'s huge tail slithers past beside you!"
else
@@ -118,7 +118,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
tmob << "[src] steps over you carefully!"
if(tmob.get_effective_size() > src.get_effective_size())
var/mob/living/carbon/human/M = tmob
- if(0) // POLARISTODO istaur(src) && M.taur == 2)
+ if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You jump over [tmob]'s thick tail."
tmob << "[src] bounds over your tail."
else
@@ -144,7 +144,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
tmob.Stun(4)
var/mob/living/carbon/human/M = src
- if(0) // POLARISTODO istaur(src) && M.taur_style == 2)
+ if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You carefully squish [tmob] under your tail!"
tmob << "[src] pins you under their tail!"
else
@@ -159,7 +159,7 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
tmob.apply_damage(10, HALLOSS)
var/mob/living/carbon/human/M = src
- if(0) // POLARISTODO istaur(src) && M.taur_style == 2)
+ if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You steamroller over [tmob] with your heavy tail!"
tmob << "[src] ploughs you down mercilessly with their heavy tail!"
else
@@ -176,13 +176,13 @@ var/const/RESIZE_A_SMALLTINY = (RESIZE_SMALL + RESIZE_TINY) / 2
if(istype(M) && !M.shoes)
// User is a human (capable of scooping) and not wearing shoes! Scoop into foot slot!
equip_to_slot_if_possible(tmob.get_scooped(M), slot_shoes, 0, 1)
- if(0) // POLARISTODO M.taur == 2)
+ if(istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You wrap up [tmob] with your powerful tail!"
tmob << "[src] binds you with their powerful tail!"
else
src << "You clench your toes around [tmob]'s body!"
tmob << "[src] grabs your body with their toes!"
- else if(0) // POLARISTODO istaur(src) && M.taur_style == 2)
+ else if(istype(M) && istype(M.tail_style, /datum/sprite_accessory/tail/taur/naga))
src << "You carefully squish [tmob] under your tail!"
tmob << "[src] pins you under their tail!"
else
diff --git a/icons/mob/vore/ears_vr.dmi b/icons/mob/vore/ears_vr.dmi
new file mode 100644
index 0000000000..6ed1ffde64
Binary files /dev/null and b/icons/mob/vore/ears_vr.dmi differ
diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi
new file mode 100644
index 0000000000..ed68a7587a
Binary files /dev/null and b/icons/mob/vore/tails_vr.dmi differ
diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi
new file mode 100644
index 0000000000..d133e544dd
Binary files /dev/null and b/icons/mob/vore/taurs_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 2ddf362be4..7e53a1cb24 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1029,6 +1029,7 @@
#include "code\modules\client\preference_setup\loadout\loadout_xeno.dm"
#include "code\modules\client\preference_setup\occupation\occupation.dm"
#include "code\modules\client\preference_setup\skills\skills.dm"
+#include "code\modules\client\preference_setup\vore\01_ears.dm"
#include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\ears\skrell.dm"
@@ -1896,6 +1897,10 @@
#include "code\modules\virus2\items_devices.dm"
#include "code\modules\vore\hook-defs_vr.dm"
#include "code\modules\vore\trycatch_vr.dm"
+#include "code\modules\vore\appearance\preferences_vr.dm"
+#include "code\modules\vore\appearance\spider_taur_powers_vr.dm"
+#include "code\modules\vore\appearance\sprite_accessories_vr.dm"
+#include "code\modules\vore\appearance\update_icons_vr.dm"
#include "code\modules\vore\eating\belly_vr.dm"
#include "code\modules\vore\eating\bellymodes_vr.dm"
#include "code\modules\vore\eating\living_vr.dm"