diff --git a/code/modules/client/preference_setup/vore/01_ears.dm b/code/modules/client/preference_setup/vore/01_ears.dm index 04bec4c2ee..5064aa58bd 100644 --- a/code/modules/client/preference_setup/vore/01_ears.dm +++ b/code/modules/client/preference_setup/vore/01_ears.dm @@ -7,10 +7,16 @@ // Define a place to save appearance in character setup /datum/preferences var/ear_style // Type of selected ear style + var/red_ear = 30 // Ear color. Goddarn dupe var names. + var/g_ear = 30 // Ear color + var/b_ear = 30 // Ear color var/tail_style // Type of selected tail style var/r_tail = 30 // Tail/Taur color var/g_tail = 30 // Tail/Taur color var/b_tail = 30 // Tail/Taur color + var/r_tail2 = 30 // For extra overlay. + var/g_tail2 = 30 // For extra overlay. + var/b_tail2 = 30 // For extra overlay. var/dress_mob = TRUE // Definition of the stuff for Ears @@ -20,22 +26,40 @@ /datum/category_item/player_setup_item/vore/ears/load_character(var/savefile/S) S["ear_style"] >> pref.ear_style + S["red_ear"] >> pref.red_ear + S["g_ear"] >> pref.g_ear + S["b_ear"] >> pref.b_ear S["tail_style"] >> pref.tail_style S["r_tail"] >> pref.r_tail S["g_tail"] >> pref.g_tail S["b_tail"] >> pref.b_tail + S["r_tail2"] >> pref.r_tail2 + S["g_tail2"] >> pref.g_tail2 + S["b_tail2"] >> pref.b_tail2 /datum/category_item/player_setup_item/vore/ears/save_character(var/savefile/S) S["ear_style"] << pref.ear_style + S["red_ear"] << pref.red_ear + S["g_ear"] << pref.g_ear + S["b_ear"] << pref.b_ear S["tail_style"] << pref.tail_style S["r_tail"] << pref.r_tail S["g_tail"] << pref.g_tail S["b_tail"] << pref.b_tail + S["r_tail2"] << pref.r_tail2 + S["g_tail2"] << pref.g_tail2 + S["b_tail2"] << pref.b_tail2 /datum/category_item/player_setup_item/vore/ears/sanitize_character() + pref.red_ear = sanitize_integer(pref.red_ear, 0, 255, initial(pref.red_ear)) + pref.g_ear = sanitize_integer(pref.g_ear, 0, 255, initial(pref.g_ear)) + pref.b_ear = sanitize_integer(pref.b_ear, 0, 255, initial(pref.b_ear)) pref.r_tail = sanitize_integer(pref.r_tail, 0, 255, initial(pref.r_tail)) pref.g_tail = sanitize_integer(pref.g_tail, 0, 255, initial(pref.g_tail)) pref.b_tail = sanitize_integer(pref.b_tail, 0, 255, initial(pref.b_tail)) + pref.r_tail2 = sanitize_integer(pref.r_tail2, 0, 255, initial(pref.r_tail2)) + pref.g_tail2 = sanitize_integer(pref.g_tail2, 0, 255, initial(pref.g_tail2)) + pref.b_tail2 = sanitize_integer(pref.b_tail2, 0, 255, initial(pref.b_tail2)) if(pref.ear_style) pref.ear_style = sanitize_inlist(pref.ear_style, ear_styles_list, initial(pref.ear_style)) if(pref.tail_style) @@ -43,10 +67,16 @@ /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.red_ear = pref.red_ear + character.b_ear = pref.b_ear + character.g_ear = pref.g_ear character.tail_style = tail_styles_list[pref.tail_style] character.r_tail = pref.r_tail character.b_tail = pref.b_tail character.g_tail = pref.g_tail + character.r_tail2 = pref.r_tail2 + character.b_tail2 = pref.b_tail2 + character.g_tail2 = pref.g_tail2 /datum/category_item/player_setup_item/vore/ears/content(var/mob/user) . += "

VORE Station Settings

" @@ -63,10 +93,15 @@ if(pref.ear_style && (pref.ear_style in ear_styles_list)) var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style] ear_display = instance.name + else if(pref.ear_style) ear_display = "REQUIRES UPDATE" . += "Ears
" . += " Style: [ear_display]
" + if(ear_styles_list[pref.ear_style]) + var/datum/sprite_accessory/ears/ear = ear_styles_list[pref.ear_style] + if (ear.do_colouration) + . += "Change Color
__

" var/tail_display = "Normal" if(pref.tail_style && (pref.tail_style in tail_styles_list)) @@ -81,6 +116,8 @@ var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style] if (T.do_colouration) . += "Change Color
__

" + if (T.extra_overlay) + . += "Change Secondary Color
__

" /datum/category_item/player_setup_item/vore/ears/OnTopic(var/href,var/list/href_list, var/mob/user) if(!CanUseTopic(user)) @@ -100,6 +137,15 @@ return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["ear_color"]) + var/new_earc = input(user, "Choose your character's ear colour:", "Character Preference", + rgb(pref.red_ear, pref.g_ear, pref.b_ear)) as color|null + if(new_earc) + pref.red_ear = hex2num(copytext(new_earc, 2, 4)) + pref.g_ear = hex2num(copytext(new_earc, 4, 6)) + pref.b_ear = hex2num(copytext(new_earc, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["tail_style"]) // Construct the list of names allowed for this user. var/list/pretty_tail_styles = list("Normal" = null) @@ -123,6 +169,15 @@ pref.b_tail = hex2num(copytext(new_tailc, 6, 8)) return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["tail_color2"]) + var/new_tailc2 = input(user, "Choose your character's secondary tail/taur colour:", "Character Preference", + rgb(pref.r_tail2, pref.g_tail2, pref.b_tail2)) as color|null + if(new_tailc2) + pref.r_tail2 = hex2num(copytext(new_tailc2, 2, 4)) + pref.g_tail2 = hex2num(copytext(new_tailc2, 4, 6)) + pref.b_tail2 = hex2num(copytext(new_tailc2, 6, 8)) + return TOPIC_REFRESH_UPDATE_PREVIEW + else if(href_list["toggle_clothing"]) pref.dress_mob = !pref.dress_mob return TOPIC_REFRESH_UPDATE_PREVIEW diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm index d7707e0937..bc52bd7175 100644 --- a/code/modules/client/preferences_vr.dm +++ b/code/modules/client/preferences_vr.dm @@ -1 +1,23 @@ -//File isn't currently being used. \ No newline at end of file +//File isn't currently being used. +//It is now. +/datum/preferences/update_preview_icon() // Lines up and un-overlaps character edit previews. Also un-splits taurs. + var/mob/living/carbon/human/dummy/mannequin/mannequin = get_mannequin(client_ckey) + mannequin.delete_inventory(TRUE) + dress_preview_mob(mannequin) + + preview_icon = icon('icons/effects/effects.dmi', "nothing") + preview_icon.Scale(64+64, 16+32) + + mannequin.dir = NORTH + var/icon/stamp = getFlatIcon(mannequin) + preview_icon.Blend(stamp, ICON_OVERLAY, 49, 9) + + mannequin.dir = WEST + stamp = getFlatIcon(mannequin) + preview_icon.Blend(stamp, ICON_OVERLAY, 1, 9) + + mannequin.dir = SOUTH + stamp = getFlatIcon(mannequin) + preview_icon.Blend(stamp, ICON_OVERLAY, 83, 9) + + preview_icon.Scale(preview_icon.Width() * 2, preview_icon.Height() * 2) // Scaling here to prevent blurring in the browser. \ 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 937bb63f58..791fc59c1c 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 @@ -44,6 +44,20 @@ "Your overheated skin itches." ) + has_limbs = list( + BP_TORSO = list("path" = /obj/item/organ/external/chest), + BP_GROIN = list("path" = /obj/item/organ/external/groin), + BP_HEAD = list("path" = /obj/item/organ/external/head/vr/sergal), + BP_L_ARM = list("path" = /obj/item/organ/external/arm), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), + BP_L_LEG = list("path" = /obj/item/organ/external/leg), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right), + BP_L_HAND = list("path" = /obj/item/organ/external/hand), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right) + ) + /datum/species/akula name = "Akula" name_plural = "Akula" @@ -133,7 +147,7 @@ /datum/species/hi_zoxxen name = "Highlander Zorren" name_plural = "Zorren" - icobase = 'icons/mob/human_races/r_fox.dmi' + icobase = 'icons/mob/human_races/r_fox_vr.dmi' deform = 'icons/mob/human_races/r_def_fox.dmi' tail = "tail" icobase_tail = 1 @@ -170,7 +184,7 @@ /datum/species/fl_zorren name = "Flatland Zorren" name_plural = "Zorren" - icobase = 'icons/mob/human_races/r_fennec.dmi' + icobase = 'icons/mob/human_races/r_fennec_vr.dmi' deform = 'icons/mob/human_races/r_def_fennec.dmi' tail = "tail" icobase_tail = 1 diff --git a/code/modules/organs/subtypes/standard_vr.dm b/code/modules/organs/subtypes/standard_vr.dm new file mode 100644 index 0000000000..6ba220c6eb --- /dev/null +++ b/code/modules/organs/subtypes/standard_vr.dm @@ -0,0 +1,58 @@ +//For custom heads with custom parts since the base code is restricted to a single icon file. + +/obj/item/organ/external/head/vr/get_icon() + + ..() + overlays.Cut() + if(!owner || !owner.species) + return + + for(var/M in markings) + var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] + var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") + mark_s.Blend(markings[M]["color"], ICON_ADD) + overlays |= mark_s //So when it's not on your body, it has icons + mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons + icon_cache_key += "[M][markings[M]["color"]]" + + if(owner.should_have_organ(O_EYES))//Moved on top of markings. + var/obj/item/organ/internal/eyes/eyes = owner.internal_organs_by_name[O_EYES] + if(eye_icon) + var/icon/eyes_icon = new/icon(eye_icons_vr, eye_icon_vr) + if(eyes) + eyes_icon.Blend(rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3]), ICON_ADD) + else + eyes_icon.Blend(rgb(128,0,0), ICON_ADD) + mob_icon.Blend(eyes_icon, ICON_OVERLAY) + overlays |= eyes_icon + + if(owner.lip_style && (species && (species.appearance_flags & HAS_LIPS))) + var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s") + overlays |= lip_icon + mob_icon.Blend(lip_icon, ICON_OVERLAY) + + if(owner.f_style) + var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[owner.f_style] + if(facial_hair_style && facial_hair_style.species_allowed && (species.get_bodytype(owner) in facial_hair_style.species_allowed)) + var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s") + if(facial_hair_style.do_colouration) + facial_s.Blend(rgb(owner.r_facial, owner.g_facial, owner.b_facial), ICON_ADD) + overlays |= facial_s + + if(owner.h_style && !(owner.head && (owner.head.flags_inv & BLOCKHEADHAIR))) + var/datum/sprite_accessory/hair_style = hair_styles_list[owner.h_style] + if(hair_style && (species.get_bodytype(owner) in hair_style.species_allowed)) + var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s") + if(hair_style.do_colouration && islist(h_col) && h_col.len >= 3) + hair_s.Blend(rgb(h_col[1], h_col[2], h_col[3]), ICON_ADD) + overlays |= hair_s + + return mob_icon + +/obj/item/organ/external/head/vr + var/eye_icons_vr = 'icons/mob/human_face_vr.dmi' + var/eye_icon_vr = "blank_eyes" + eye_icon = "blank_eyes" + +/obj/item/organ/external/head/vr/sergal + eye_icon_vr = "eyes_sergal" diff --git a/code/modules/vore/appearance/preferences_vr.dm b/code/modules/vore/appearance/preferences_vr.dm index 9b52b03826..f9302e8ed0 100644 --- a/code/modules/vore/appearance/preferences_vr.dm +++ b/code/modules/vore/appearance/preferences_vr.dm @@ -11,10 +11,16 @@ // Horray Furries! var/datum/sprite_accessory/ears/ear_style = null + var/red_ear = 30 + var/g_ear = 30 + var/b_ear = 30 var/datum/sprite_accessory/tail/tail_style = null var/r_tail = 30 var/g_tail = 30 var/b_tail = 30 + var/r_tail2 = 30 + var/g_tail2 = 30 + var/b_tail2 = 30 // 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 284531fdcd..d1dc6969a1 100644 --- a/code/modules/vore/appearance/sprite_accessories_vr.dm +++ b/code/modules/vore/appearance/sprite_accessories_vr.dm @@ -176,6 +176,35 @@ desc = "" icon_state = "antlers" +/datum/sprite_accessory/ears/otie + name = "otie, colorable" + desc = "" + icon_state = "otie" + do_colouration = 1 + +/datum/sprite_accessory/ears/cow + name = "cow, horns" + desc = "" + icon_state = "cow" + +/datum/sprite_accessory/ears/cowc + name = "cow, horns, colorable" + desc = "" + icon_state = "cow-c" + do_colouration = 1 + +/datum/sprite_accessory/ears/zears + name = "jagged ears" + desc = "" + icon_state = "zears" + do_colouration = 1 + +/datum/sprite_accessory/ears/elfs + name = "elven ears" + desc = "" + icon_state = "elfs" + do_colouration = 1 + // Special snowflake ears go below here. /datum/sprite_accessory/ears/molenar_kitsune @@ -267,7 +296,8 @@ var/show_species_tail = 0 // If false, do not render species' tail. var/clothing_can_hide = 1 // If true, clothing with HIDETAIL hides it var/desc = "You should not see this..." - var/ani_state //State when wagging/animated + var/ani_state // State when wagging/animated + var/extra_overlay_w // Wagging state for extra overlay /datum/sprite_accessory/tail/invisible name = "hide species-sprite tail" @@ -321,6 +351,7 @@ desc = "" icon_state = "stripeytail" do_colouration = 1 + extra_overlay = "stripeytail_mark" /datum/sprite_accessory/tail/stripeytail_brown name = "stripey taj, brown" @@ -642,6 +673,7 @@ desc = "" icon_state = "ringtail" do_colouration = 1 + extra_overlay = "ringtail_mark" /datum/sprite_accessory/tail/holly name = "tigress tail (Holly)" @@ -662,6 +694,8 @@ icon_state = "curltail" ani_state = "curltail_w" do_colouration = 1 + extra_overlay = "curltail_mark" + extra_overlay_w = "curltail_mark_w" /datum/sprite_accessory/tail/shorttail name = "shorttail (vwag)" @@ -676,6 +710,8 @@ icon_state = "tigertail" ani_state = "tigertail_w" do_colouration = 1 + extra_overlay = "tigertail_mark" + extra_overlay_w = "tigertail_mark_w" /datum/sprite_accessory/tail/vulp_new name = "new vulp tail (vwag)" @@ -683,6 +719,21 @@ icon_state = "vulptail" ani_state = "vulptail_w" do_colouration = 1 + extra_overlay = "vulptail_mark" + extra_overlay_w = "vulptail_mark_w" + +/datum/sprite_accessory/tail/otietail + name = "otie tail (vwag)" + desc = "" + icon_state = "otie" + ani_state = "otie_w" + do_colouration = 1 + +/datum/sprite_accessory/tail/ztail + name = "jagged flufftail" + desc = "" + icon_state = "ztail" + do_colouration = 1 /datum/sprite_accessory/tail/shock name = "pharoah hound tail (Shock Diamond)" @@ -696,7 +747,6 @@ icon_state = "snaketail" do_colouration = 1 - //For all species tails. Includes haircolored tails. /datum/sprite_accessory/tail/special name = "Blank tail. Do not select." @@ -889,10 +939,20 @@ name = "Wolf" icon_state = "wolf_s" +/datum/sprite_accessory/tail/taur/wolf/wolf_2c + name = "Wolf dual-color" + icon_state = "wolf_s" + extra_overlay = "wolf_markings" + /datum/sprite_accessory/tail/taur/naga name = "Naga" icon_state = "naga_s" +/datum/sprite_accessory/tail/taur/naga/naga_2c + name = "Naga dual-color" + icon_state = "naga_s" + extra_overlay = "naga_markings" + /datum/sprite_accessory/tail/taur/horse name = "Horse" icon_state = "horse_s" @@ -905,6 +965,11 @@ name = "Lizard" icon_state = "lizard_s" +/datum/sprite_accessory/tail/taur/lizard/lizard_2c + name = "Lizard dual-color" + icon_state = "lizard_s" + extra_overlay = "lizard_markings" + /datum/sprite_accessory/tail/taur/spider name = "Spider" icon_state = "spider_s" @@ -917,10 +982,23 @@ name = "Feline" icon_state = "feline_s" +/datum/sprite_accessory/tail/taur/feline/feline_2c + name = "Feline dual-color" + icon_state = "feline_s" + extra_overlay = "feline_markings" + /datum/sprite_accessory/tail/taur/slug name = "Slug" icon_state = "slug_s" +/*/datum/sprite_accessory/tail/taur/drake //Yeah hold that thought for a bit. These got no suit compatibility yet. + name = "Drake" + icon_state = "drake_s" + +/datum/sprite_accessory/tail/taur/otie + name = "Otie" + icon_state = "otie_s"*/ + //wickedtemp: Chakat Tempest /datum/sprite_accessory/tail/taur/feline/tempest name = "Feline (wickedtemp)" diff --git a/code/modules/vore/appearance/update_icons_vr.dm b/code/modules/vore/appearance/update_icons_vr.dm index 94a64347a6..e66ceefa90 100644 --- a/code/modules/vore/appearance/update_icons_vr.dm +++ b/code/modules/vore/appearance/update_icons_vr.dm @@ -5,7 +5,7 @@ if(ear_style && !(head && (head.flags_inv & BLOCKHEADHAIR))) var/icon/ears_s = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.icon_state) if(ear_style.do_colouration) - ears_s.Blend(rgb(src.r_hair, src.g_hair, src.b_hair), ear_style.color_blend_mode) + ears_s.Blend(rgb(src.red_ear, src.g_ear, src.b_ear), ear_style.color_blend_mode) if(ear_style.extra_overlay) var/icon/overlay = new/icon("icon" = ear_style.icon, "icon_state" = ear_style.extra_overlay) ears_s.Blend(overlay, ICON_OVERLAY) @@ -27,8 +27,15 @@ tail_s.Blend(rgb(src.r_tail, src.g_tail, src.b_tail), tail_style.color_blend_mode) if(tail_style.extra_overlay) var/icon/overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay) - tail_s.Blend(overlay, ICON_OVERLAY) - qdel(overlay) + if(wagging && tail_style.ani_state) + overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w) + overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) + else + overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode) + tail_s.Blend(overlay, ICON_OVERLAY) + qdel(overlay) if(isTaurTail(tail_style)) return image(tail_s, "pixel_x" = -16) diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm index 1cdf8297f9..4f47baf0bf 100644 --- a/code/modules/vore/eating/belly_vr.dm +++ b/code/modules/vore/eating/belly_vr.dm @@ -460,6 +460,27 @@ return else if(prob(transferchance) && istype(transferlocation)) //Next, let's have it see if they end up getting into an even bigger mess then when they started. + var/location_found = 0 + var/name_found = 0 + for(var/I in owner.vore_organs) + var/datum/belly/B = owner.vore_organs[I] + if(B == transferlocation) + location_found = 1 + break + + if(!location_found) + for(var/I in owner.vore_organs) + var/datum/belly/B = owner.vore_organs[I] + if(B.name == transferlocation.name) + name_found = 1 + transferlocation = B + break + + if(!location_found && !name_found) + to_chat(owner, "Something went wrong with your belly transfer settings.") + transferlocation = null + return + R << "Your attempt to escape [name] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!" owner << "Someone slid into your [transferlocation] due to their struggling inside your [name]!" transfer_contents(R, transferlocation) diff --git a/icons/mob/human_face_vr.dmi b/icons/mob/human_face_vr.dmi index 489f80a6ce..ef8ba28753 100644 Binary files a/icons/mob/human_face_vr.dmi and b/icons/mob/human_face_vr.dmi differ diff --git a/icons/mob/human_races/r_def_sergal.dmi b/icons/mob/human_races/r_def_sergal.dmi index c43a5835f8..c39c2f6038 100644 Binary files a/icons/mob/human_races/r_def_sergal.dmi and b/icons/mob/human_races/r_def_sergal.dmi differ diff --git a/icons/mob/human_races/r_fennec_vr.dmi b/icons/mob/human_races/r_fennec_vr.dmi new file mode 100644 index 0000000000..d85bdb7e42 Binary files /dev/null and b/icons/mob/human_races/r_fennec_vr.dmi differ diff --git a/icons/mob/human_races/r_fox_vr.dmi b/icons/mob/human_races/r_fox_vr.dmi new file mode 100644 index 0000000000..7cf9c675b7 Binary files /dev/null and b/icons/mob/human_races/r_fox_vr.dmi differ diff --git a/icons/mob/human_races/r_sergal.dmi b/icons/mob/human_races/r_sergal.dmi index 1b2e73e861..316c2a015b 100644 Binary files a/icons/mob/human_races/r_sergal.dmi and b/icons/mob/human_races/r_sergal.dmi differ diff --git a/icons/mob/taursuits_vr.dmi b/icons/mob/taursuits_vr.dmi index 19a9a7ad2a..ae8a0a5442 100644 Binary files a/icons/mob/taursuits_vr.dmi and b/icons/mob/taursuits_vr.dmi differ diff --git a/icons/mob/vore/tails_vr.dmi b/icons/mob/vore/tails_vr.dmi index ca6b724534..8a15b36a6c 100644 Binary files a/icons/mob/vore/tails_vr.dmi and b/icons/mob/vore/tails_vr.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 41cb5cfc71..f2eb525b26 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2025,6 +2025,7 @@ #include "code\modules\organs\subtypes\machine.dm" #include "code\modules\organs\subtypes\seromi.dm" #include "code\modules\organs\subtypes\standard.dm" +#include "code\modules\organs\subtypes\standard_vr.dm" #include "code\modules\organs\subtypes\unathi.dm" #include "code\modules\organs\subtypes\unbreakable.dm" #include "code\modules\organs\subtypes\vox.dm"