From 88e46b624a4f4d70f9ae0bee27dc4f8010cc1552 Mon Sep 17 00:00:00 2001 From: Leshana Date: Wed, 11 May 2016 23:20:49 -0400 Subject: [PATCH] Issue #4 - Implement custom tails, ears, and taurs. - Added datums and icons for custom ears. - Added datums and icons for custom tails. - Added datums and icons for taurs, now a subtype of tails. - Integrated into icon_updates() for in game appearance. - Integrated into preferences_setup() for character setup preview. - Added ears and tails to the character setup screen. - Enabled nagataur support for micro/macro step-over messages. --- code/_helpers/global_lists_vr.dm | 20 + .../client/preference_setup/vore/01_ears.dm | 121 +++++ code/modules/client/preferences.dm | 5 + .../mob/living/carbon/human/update_icons.dm | 14 + .../mob/new_player/preferences_setup.dm | 41 +- .../modules/vore/appearance/preferences_vr.dm | 25 + .../vore/appearance/spider_taur_powers_vr.dm | 44 ++ .../vore/appearance/sprite_accessories_vr.dm | 490 ++++++++++++++++++ .../vore/appearance/update_icons_vr.dm | 30 ++ code/modules/vore/eating/vore_vr.dm | 2 +- code/modules/vore/resizing/resize_vr.dm | 12 +- icons/mob/vore/ears_vr.dmi | Bin 0 -> 2937 bytes icons/mob/vore/tails_vr.dmi | Bin 0 -> 27397 bytes icons/mob/vore/taurs_vr.dmi | Bin 0 -> 3875 bytes vorestation.dme | 5 + 15 files changed, 799 insertions(+), 10 deletions(-) create mode 100644 code/modules/client/preference_setup/vore/01_ears.dm create mode 100644 code/modules/vore/appearance/preferences_vr.dm create mode 100644 code/modules/vore/appearance/spider_taur_powers_vr.dm create mode 100644 code/modules/vore/appearance/sprite_accessories_vr.dm create mode 100644 code/modules/vore/appearance/update_icons_vr.dm create mode 100644 icons/mob/vore/ears_vr.dmi create mode 100644 icons/mob/vore/tails_vr.dmi create mode 100644 icons/mob/vore/taurs_vr.dmi diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index eb18d09eb3d..7dd229fb7c0 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 00000000000..17d03232ff8 --- /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 e6627cc39d5..a9f52a0d2b6 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 b073f8ccf67..22329cf2be8 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 16ae76dbbb7..3db8be967ac 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 00000000000..2fad10109f4 --- /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 00000000000..e90003b3cdd --- /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 00000000000..60d6c9dcb63 --- /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 00000000000..9b263ba3c50 --- /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 2b0f2310672..9655113b5e7 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 c81051a3f89..3d1262ab732 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 0000000000000000000000000000000000000000..6ed1ffde648adc708f89005f9bbf7ba6da1755af GIT binary patch literal 2937 zcmZXW2T&8r7KS4NRzNNwA(S8}RfQ% zgwR`r5D}GPkc3_W0YVL(5Fn5|?!9m3`sSUPot^*e*`4#9vpciTtgTFi4ucK@001F# zGZR|?V4wTm`2FDiJx`UGquJiHWo>DHsi~=HHA@epcUV?dme-cP8+ArcPj7Eg_v~3& zNwLkyNZyAJ=BB3d^77hBVs|XTA|fJmI{o9vk31gFCBqgLsjTg;z-!R)^YfEX5-JG= z_m zUI0;1QC(eKadB~82jIt#AI4{acKR|`{e#CVlyEp4z#KC+HpXMh13de9Jb;RUAwbcB z$piqElsUZXCr_SqaB$Gq*N4Gi8Mgrn3JRKHqwn<;NmfW#9AJa9-a>WBX->b7kG7*%-gzTme#-cHd}D*Lj%w_m7#fJ= zyK8wHw?G|fkOIa3#+h0n9Tg3H&bXWULhENHVaFy#$}_W{$`94ypZpY`OaB`E=zi2@ zvkt%BaXK_(^{t&5|7l9uZ>@(+mzkHX67B6xG=4xJXTB@*EM8utc{QJAd#0-u6wzP# z2#(y>|6td~eWWyUv|GCWn*yA|0W^M@XXXM)={pW`SH`e#tBmqLUSY)|#IGxatjL!G zt|&-~*=4M3c)GlB;ubS#Sj}$>xGh1|6Bg>S&vi)vz#&C*lMD9Yn1$gZaH<*b>xw)9 zDsaJj-@X+`3zEPK6^KBF^QB`KmN_xmdAhTeU)WKpK_e}^C7ImoSaZtxLj%FX1D8b? zE!^Bfe>&5I6T6RsjoO4!?L+w~IX7cs{&H4TE+xaZHAPVE&8Lm@noVQ4TQjS#YYaOm zb~;SnJf7SBn6|2Y#T*Jol$_97>L@?bOCcv@`hIVRRxo3$DyisU8w4%;jyOiRC$`wI zqZ};iNt(6R=x=L2%@MtM{J(ArSTu@K8jd|lS5sN{r8=PdZ4mz__L~2XH5rd#bWdYz zW?neQJSedbA_~8l*697*p#lPa-(xruXE19NbZVM1SRdcA7FSl^BW(%WZEAX*m3a|C z8GSDmnsfr|1{}$*Eib4hzt1%6K^D`Z4gUp<*?vSKeYfMYtO&%H6G&GBzG~^ji0J^;-D%T2e6C?PXN7 z-o39diB@FOOKrY?5(fYRbud(T%?+vN_ujs$ukR6h(C4+;n!1>HuJ!2;Z8$2dAMz|h z#FZ!bqEFa&J|T)omJ&)3!B;L%&Qg{05<_1WUiOR68&5kv{Qc>?U*%&ouuSSQ!{Xfg zG}c5Wx+PO{u@~}@33_e^@~cU8rb|$*F%)+~-tb|3PKLU9vqaI@?UA<|PqoWSXla5I z;2J>#iNWN9_eZUe7LQkwogZTkFPO%aEqNKJR=ddcBnRHlhgFe2nVO-*Il6!L&Rcs) z^p#x8c_Ir9{Naamg8TPv!@C?LwuzCyQUU;BMJ{CFlW(Rd`s%XM*A7g01f9>2HNzTJ zkdbd0&qB0M#54|ZcWh3bCVm8_Dk&F>Sz66;k`k4LlGO#03tN(&sGqo+lT%KH>AhWY z#+re!)`zhNaWNM=Qq4PY&eJj6;r_65r{%GZ)0@%7?b7Lq@wg{^j3MTwT7Xvf1Sh(9 z2nx~xk)4U0vn~%a=T@SK8`Cu)ES4pVMzmeeZWPwKASeF}sGEMr&% zEjP~tvD0E3(>U#bW$&9InTUgL29;P-RA|XxgH)PriFyT*{5rwHsH7LcRuW zpBK>a$Qe%90*ipM&&$Qv2(lu|n&yV;>U!M+7K?35VX>G3pKSljG{u4zsfBNZUNjdu zwHI$1m*Oz`ZhtWmV~9P2Y^;(|{CqGoi>>u5-ov3~_QlY^fzKC1Pzcw5pLDB zwc*}HV3NHTCF;9+Al>y`_}$|>K9{e@8W;`(lVJ60LpN33ZrpgD>$>i&n*7ICTMyM5 z!)ax`Ri%;CFjqXh)dPPwjZxN!MJZ|q)Y?c&du>9)T9KJMjsfq>oH{i+uf10%n6f&m z!=7yDDmA=da#vTK9IngF&mWq<+ad^BYE~R?uw7n`G-6Nrbx$Xxo6~n9zFGf}^y)ts znZma=8dtqjwQ^q8YnL&(g613PC?bqLRG20OYzO0;}%_W{}ppATD9G+;R$hR zHOkOwd;4baot4!fVDzT^q$`Y><0CiS=KaO@U(eouUgl}7IrW$Up>G6EQ ztky;x3|yZo<#cl8`bfFd%qlc>E!0jDZuTnZP(vlD-`$;f!c@O|0VzY3EEzM z5C}y&?EZZZYIrJKvmb(4udY^N4b`6y>6^&b(2v3p7RfCDGp?esKmm`c&z# zW+oeSQ3qEQOMPThitL~10}rAe4)b$F{b;=0+yRp8yuF9`(O;_p2>URz?da?OuF7w% z(cj;^c|0QJ=b+Z0a8*f3z&ur7pWD?O^Kqj+J;YkIJ;DI`5}gFfPhVtK!nnQUq_l*o z>gs||X0;ww#D<2v5+qA8s&}!ZEHp4U3_e=rVh$=%5r9)}wbL!k_Fg+n`?->GPZWC) zM}wd2DWx{@HO4d;;}&KMN6%7AVp#@_Zbj}z^e*eyk-1kBj%XKSo7lc1G@Ajxf6e-v zGHcd?w*;?E`}r^YwL@CC0VH5bm|6|z0S0=SyE^neQ0Jh>EFGDqCYOjLW1Y68dow*M z{g6+E3EZC#zBUehp3%H|7eC<6z3D z9yWh9KQshCz@)8X-G(wt`qU@g){UHnMTA`@e4AxuWZJg6?oAZoXEx2q&Iy6sV?NDf z@QA8u^7vE^-GNMi)QmX~|I9@8eJ47d0&_xN#V0d%RD^fa6b;w{a?rcF!*hLZ@+>}G z0s^mskAm_txOMeNM-n*?vk4O_6la2pV=F(g_?L4M@j*LPU6!8f8`uXy4Y9~d06O+5T7ssa9sl92^;dtJa#mRN%w}IJbh|+e|+6Yv55DJCj8e7C*I5U&W z_VYZ*7@17&B!7f`N27Cr!o!vqF4kG9y&09`D(!}Cc7hL(WN}!~qmR z(ny9O3_)@jG6PJwd;HG#PI%|sckWqlt^0@U?%ut-tGcS|S5@6(=o77njAt&L0RVvU zk(#nD0FZ-4vRPVc@G&$zvItgueDsaom2KZxzjl1-?&#(U0B=)s;~u*PiL-nddwE7= z;yxv#NoC<#1Cy&>7rz4+e&$&>zMu3O;877BHf*3+^+oR4saDw{^Aq>txx|*SjK640 zjemuiUw9Z>;L@pH3k%C;Qkk5H;<0Yy6PftgB%}0RVuZ4&FVuk_5K~x3*Fle+7xY<87xVP1Na>Y3Cd%_MU z4_D-%B|Q!2N^cwWc{zvBGuKO5osAwPH60aoeRi(X4!iNoGZ?MfT=7!~cJB2VVX+bZ zOmalB6xq79@R=m(XhYs6;~*%^*$O=r(NC{33W(6MLr-T?r3fk(

F-Z>h?`z)YWkH^HRtWm`r%Jwo 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 literal 0 HcmV?d00001 diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d133e544ddf5c881424118539bb3e8e62e11d6f6 GIT binary patch literal 3875 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 literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index 2ddf362be42..7e53a1cb240 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"